diff --git a/.gn b/.gn
index ae58a0b0..60f8591a 100644
--- a/.gn
+++ b/.gn
@@ -75,6 +75,9 @@
 
   clang_unsafe_buffers_paths = "//build/config/unsafe_buffers_paths.txt"
   clang_warning_suppression_file = "//build/config/warning_suppression.txt"
+
+  # Use Siso instead of Ninja.
+  use_siso = true
 }
 
 # These are the targets to skip header checking by default. The files in targets
diff --git a/DEPS b/DEPS
index 10653225..f03c78f 100644
--- a/DEPS
+++ b/DEPS
@@ -351,7 +351,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_revision': 'e07e56c7f106b600262ab653d696b7b57f320127',
+  'freetype_revision': 'f64c7db2fee3f5304df1cd722df72699736118f3',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # 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': 'acd68d2f092a2e674894c9d389c96e39beec1aa2',
+  'devtools_frontend_revision': '79796ba22a06d1b7980b2a2ae98e69123628f80f',
   # 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.
@@ -1508,7 +1508,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '7b3b66843fe0c37489709a09bf6e4c57c6087f53',
+    'fec1ce382177719159584b9189b455c4416f1004',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1667,7 +1667,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'SRLnRQtsEaeNt_-cy_acdUbX63elq51jmwvif531vHgC',
+          'version': '9M_oLgBtkrh0KgREsjJ3gxoZQMhwRaZ2PUSGverQ0foC',
       },
     ],
     'condition': 'checkout_android and non_git_source',
@@ -2867,8 +2867,8 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@5912cbdd295c2bacb5798432a7b1cac9d20c0725',
-  'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@93231001597dad1149a5d035af30eda50b9e6b6c',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@d18d20e2f8cd216f11c565524791b0093d9082fa',
+  'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@be4ee7d0e3bfd151bfda7b3a8e03f8c49c55ed7b',
   '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@c9aad99f9276817f18f72a4696239237c83cb775',
   'src/third_party/spirv-tools/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@01021466b5e71deaac9054f56082566c782bfd51',
@@ -2876,7 +2876,7 @@
   'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@c913466fdc5004584890f89ff91121bdb2ffd4ba',
   'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@60b640cb931814fcc6dabe4fc61f4738c56579f6',
   'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@49ac28931f28bffaa3cd73dc4ad997284d574962',
-  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@f7ceb1d01a292846db77ec87786be84d6fd568d9',
+  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@b75f27bc902ea48c1758d958222c742ecccf3aa2',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '56300b29fbfcc693ee6609ddad3fdd5b7a449a21',
@@ -2921,7 +2921,7 @@
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '9909b30d5e3c104d4dce7d066fc8422eef1dcc59',
+    Var('webrtc_git') + '/src.git' + '@' + 'e4445e46a910eb407571ec0b0b8b7043562678cf',
 
   # 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.
@@ -3032,7 +3032,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/eche_app/app',
-        'version': 'keAY-vnasUZokMpEPoxPxhUIttbG3euVEtmSaLsne6IC',
+        'version': 'ipfaEZI25t3RKHOuovaSgZDbP4O13GpEnOBwoLvhbV8C',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -4641,7 +4641,7 @@
 
   'src/components/optimization_guide/internal': {
       'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' +
-        'e6fa5c8b549ff20533d07a862d25cb639e3bb1ab',
+        '8848d156621b845a0d411609ddd1567b8c8db42b',
       'condition': 'checkout_src_internal',
   },
 
@@ -4707,7 +4707,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        'a5c6f36c55a93150abaf43134d5c40dc42112f9d',
+        'c4fbb878b6b071ab5b6750b093e3180fc9b7a425',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/android_webview/browser/gfx/overlay_processor_webview.cc b/android_webview/browser/gfx/overlay_processor_webview.cc
index 8429b7b..440e6b7 100644
--- a/android_webview/browser/gfx/overlay_processor_webview.cc
+++ b/android_webview/browser/gfx/overlay_processor_webview.cc
@@ -16,7 +16,6 @@
 #include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/ref_counted.h"
-#include "base/not_fatal_until.h"
 #include "base/task/bind_post_task.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_checker.h"
@@ -513,7 +512,7 @@
   OverlaySurface& GetOverlaySurfaceLocked(uint64_t id) {
     lock_.AssertAcquired();
     auto surface = overlay_surfaces_.find(id);
-    CHECK(surface != overlay_surfaces_.end(), base::NotFatalUntil::M130);
+    CHECK(surface != overlay_surfaces_.end());
     return surface->second;
   }
 
@@ -880,7 +879,7 @@
     const gfx::RectF& uv_rect) {
   DCHECK(resource_provider_);
   auto overlay = overlays_.find(frame_sink_id);
-  CHECK(overlay != overlays_.end(), base::NotFatalUntil::M130);
+  CHECK(overlay != overlays_.end());
 
   DCHECK(resource_provider_->IsOverlayCandidate(new_resource_id));
 
@@ -911,7 +910,7 @@
   // OverlayManager return resources. When we delete last lock resource will be
   // return to the client.
   auto it = locked_resources_.find(resource_id);
-  CHECK(it != locked_resources_.end(), base::NotFatalUntil::M130);
+  CHECK(it != locked_resources_.end());
   locked_resources_.erase(it);
 
   DCHECK(resource_lock_count_.contains(surface_id.frame_sink_id()));
@@ -940,7 +939,7 @@
     const viz::FrameSinkId& frame_sink_id,
     const viz::ResolvedFrameData* frame_data) {
   auto it = overlays_.find(frame_sink_id);
-  CHECK(it != overlays_.end(), base::NotFatalUntil::M130);
+  CHECK(it != overlays_.end());
   auto& overlay = it->second;
 
   const auto& passes = frame_data->GetResolvedPasses();
diff --git a/android_webview/browser/lifecycle/aw_contents_lifecycle_notifier.cc b/android_webview/browser/lifecycle/aw_contents_lifecycle_notifier.cc
index a405ab9..bae58df 100644
--- a/android_webview/browser/lifecycle/aw_contents_lifecycle_notifier.cc
+++ b/android_webview/browser/lifecycle/aw_contents_lifecycle_notifier.cc
@@ -12,7 +12,6 @@
 #include <utility>
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "content/public/browser/browser_thread.h"
 
 // Must come after all headers that specialize FromJniType() / ToJniType().
@@ -93,7 +92,7 @@
     const AwContents* aw_contents) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   const auto it = aw_contents_to_data_.find(aw_contents);
-  CHECK(it != aw_contents_to_data_.end(), base::NotFatalUntil::M130);
+  CHECK(it != aw_contents_to_data_.end());
 
   state_count_[ToIndex(it->second.aw_content_state)]--;
   DCHECK(state_count_[ToIndex(it->second.aw_content_state)] >= 0);
diff --git a/android_webview/renderer/aw_render_view_ext.cc b/android_webview/renderer/aw_render_view_ext.cc
index a24dc07..9031fe4 100644
--- a/android_webview/renderer/aw_render_view_ext.cc
+++ b/android_webview/renderer/aw_render_view_ext.cc
@@ -9,7 +9,6 @@
 #include "android_webview/common/mojom/frame.mojom.h"
 #include "base/containers/contains.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "content/public/renderer/render_frame.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/public/web/web_local_frame.h"
@@ -62,7 +61,7 @@
 AwRenderViewExt* AwRenderViewExt::FromWebView(blink::WebView* web_view) {
   DCHECK(web_view != nullptr);
   auto iter = GetViewExtMap()->find(web_view);
-  CHECK(GetViewExtMap()->end() != iter, base::NotFatalUntil::M130)
+  CHECK(GetViewExtMap()->end() != iter)
       << "AwRenderViewExt should always exist for a WebView";
   AwRenderViewExt* render_view_ext = iter->second;
   return render_view_ext;
diff --git a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
index 6dc44cf6..e9f85000 100644
--- a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
@@ -9723,6 +9723,7 @@
     getter username
     method constructor
     method exec
+    method generate
     method test
 interface URLSearchParams
     attribute @@toStringTag
diff --git a/apps/saved_files_service.cc b/apps/saved_files_service.cc
index ff171e5..ceb8e55 100644
--- a/apps/saved_files_service.cc
+++ b/apps/saved_files_service.cc
@@ -16,7 +16,6 @@
 #include "apps/saved_files_service_factory.h"
 #include "base/json/values_util.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "content/public/browser/browser_context.h"
 #include "extensions/browser/api/file_system/saved_file_entry.h"
@@ -309,7 +308,7 @@
 
 void SavedFilesService::SavedFiles::EnqueueFileEntry(const std::string& id) {
   auto id_it = registered_file_entries_.find(id);
-  CHECK(id_it != registered_file_entries_.end(), base::NotFatalUntil::M130);
+  CHECK(id_it != registered_file_entries_.end());
 
   SavedFileEntry* file_entry = id_it->second.get();
   int old_sequence_number = file_entry->sequence_number;
diff --git a/ash/metrics/demo_session_metrics_recorder.cc b/ash/metrics/demo_session_metrics_recorder.cc
index 496cbcf..8afd58d8 100644
--- a/ash/metrics/demo_session_metrics_recorder.cc
+++ b/ash/metrics/demo_session_metrics_recorder.cc
@@ -70,6 +70,9 @@
     "DemoMode.SignedIn.Request.CleanupResult";
 constexpr char kAppUsageTimeHistogramPrefix[] = "DemoMode.AppUsageTime.";
 
+constexpr char kCloudPolicyConnectionTimeoutAction[] =
+    "DemoMode.CloudPolicyConnectionTimeout";
+
 struct AppHistogramSuffix {
   const DemoModeApp app_type;
   const std::string name;
@@ -499,6 +502,12 @@
   return current_session_type;
 }
 
+// static
+void DemoSessionMetricsRecorder::RecordCloudPolicyConnectionTimeout() {
+  base::RecordAction(
+      base::UserMetricsAction(kCloudPolicyConnectionTimeoutAction));
+}
+
 DemoSessionMetricsRecorder::DemoSessionMetricsRecorder(
     std::unique_ptr<base::RepeatingTimer> timer)
     : timer_(std::move(timer)),
diff --git a/ash/metrics/demo_session_metrics_recorder.h b/ash/metrics/demo_session_metrics_recorder.h
index d8b178ce..8a19e83 100644
--- a/ash/metrics/demo_session_metrics_recorder.h
+++ b/ash/metrics/demo_session_metrics_recorder.h
@@ -165,6 +165,9 @@
   // Get the type of the current demo session.
   static SessionType GetCurrentSessionTypeForTesting();
 
+  // Records cloud policy connections timeout.
+  static void RecordCloudPolicyConnectionTimeout();
+
   // The recorder will create a normal timer by default. Tests should provide a
   // mock timer to control sampling periods.
   explicit DemoSessionMetricsRecorder(
diff --git a/ash/public/cpp/views_text_services_context_menu_ash.cc b/ash/public/cpp/views_text_services_context_menu_ash.cc
index f42f688..f92ff427 100644
--- a/ash/public/cpp/views_text_services_context_menu_ash.cc
+++ b/ash/public/cpp/views_text_services_context_menu_ash.cc
@@ -6,7 +6,6 @@
 
 #include "ash/public/cpp/clipboard_history_controller.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "chromeos/crosapi/mojom/clipboard_history.mojom.h"
 #include "chromeos/ui/clipboard_history/clipboard_history_submenu_model.h"
@@ -60,10 +59,7 @@
   if (command_id == IDS_APP_SHOW_CLIPBOARD_HISTORY) {
     // `IDS_APP_SHOW_CLIPBOARD_HISTORY` is in the clipboard history submenu.
     // Therefore, the code below should not be executed.
-    NOTREACHED(base::NotFatalUntil::M135);
-
-    *accelerator = ui::Accelerator(ui::VKEY_V, ui::EF_COMMAND_DOWN);
-    return true;
+    NOTREACHED();
   }
 
   return ViewsTextServicesContextMenuBase::GetAcceleratorForCommandId(
@@ -91,10 +87,7 @@
   if (command_id == IDS_APP_SHOW_CLIPBOARD_HISTORY) {
     // `IDS_APP_SHOW_CLIPBOARD_HISTORY` is in the clipboard history submenu.
     // Therefore, the code below should not be executed.
-    NOTREACHED(base::NotFatalUntil::M135);
-
-    ShowClipboardHistoryMenu(event_flags);
-    return;
+    NOTREACHED();
   }
 
   ViewsTextServicesContextMenuBase::ExecuteCommand(command_id, event_flags);
diff --git a/base/command_line.cc b/base/command_line.cc
index d4d3bc5..7491285 100644
--- a/base/command_line.cc
+++ b/base/command_line.cc
@@ -352,7 +352,7 @@
 }
 
 bool CommandLine::HasSwitch(std::string_view switch_string) const {
-  CHECK(IsSwitchNameValid(switch_string), base::NotFatalUntil::M134);
+  CHECK(IsSwitchNameValid(switch_string));
   return Contains(switches_, switch_string);
 }
 
@@ -401,7 +401,7 @@
 
 CommandLine::StringType CommandLine::GetSwitchValueNative(
     std::string_view switch_string) const {
-  CHECK(IsSwitchNameValid(switch_string), base::NotFatalUntil::M134);
+  CHECK(IsSwitchNameValid(switch_string));
 
   auto result = switches_.find(switch_string);
   return result == switches_.end() ? StringType() : result->second;
@@ -473,8 +473,7 @@
 #if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS)
   sequence_checker_.Check();
 #endif
-  CHECK(IsSwitchNameValid(switch_key_without_prefix),
-        base::NotFatalUntil::M134);
+  CHECK(IsSwitchNameValid(switch_key_without_prefix));
 
 #if BUILDFLAG(IS_WIN)
   StringType switch_key_native = UTF8ToWide(switch_key_without_prefix);
diff --git a/base/containers/vector_buffer.h b/base/containers/vector_buffer.h
index 0ed6c28..f4efb13 100644
--- a/base/containers/vector_buffer.h
+++ b/base/containers/vector_buffer.h
@@ -81,11 +81,6 @@
   size_t capacity() const { return capacity_; }
 
   T& operator[](size_t i) {
-    // TODO(crbug.com/40565371): Some call sites (at least circular_deque.h) are
-    // calling this with `i == capacity_` as a way of getting `end()`. Therefore
-    // we have to allow this for now (`i <= capacity_`), until we fix those call
-    // sites to use real iterators. This comment applies here and to `const T&
-    // operator[]`, below.
     CHECK_LT(i, capacity_);
     // SAFETY: `capacity_` is the size of the array pointed to by `buffer_`,
     // which `i` is less than, so the dereference is inside the allocation.
diff --git a/base/threading/scoped_thread_priority.cc b/base/threading/scoped_thread_priority.cc
index 72f52df..995f94d 100644
--- a/base/threading/scoped_thread_priority.cc
+++ b/base/threading/scoped_thread_priority.cc
@@ -13,7 +13,7 @@
 namespace base {
 
 ScopedBoostPriority::ScopedBoostPriority(ThreadType target_thread_type) {
-  CHECK_LT(target_thread_type, ThreadType::kRealtimeAudio, NotFatalUntil::M133);
+  CHECK_LT(target_thread_type, ThreadType::kRealtimeAudio);
   const ThreadType original_thread_type =
       PlatformThread::GetCurrentThreadType();
   const bool should_boost = original_thread_type < target_thread_type &&
diff --git a/base/tools/clean-up-not-fatal-until.py b/base/tools/clean-up-not-fatal-until.py
new file mode 100755
index 0000000..22b79cc
--- /dev/null
+++ b/base/tools/clean-up-not-fatal-until.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python3
+# 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 argparse
+import os
+import re
+import subprocess
+import sys
+
+
+def main(args):
+    parser = argparse.ArgumentParser(
+        description='Removes usage of obsolete base::NotFatalUntil::M<N> values'
+    )
+    parser.add_argument('-m', '--milestone', required=True)
+    parsed_args = parser.parse_args(args=args)
+
+    try:
+        milestone = int(parsed_args.milestone)
+    except ValueError:
+        print(f'--milestone must be a number: {parsed_args.milestone}',
+              file=sys.stderr)
+        return -1
+
+    pattern = f'NotFatalUntil::M{milestone}'
+    print(f'Searching for files with {pattern}...', file=sys.stderr)
+    files = subprocess.check_output(
+        ('git.exe' if os.name == 'nt' else 'git', 'gs', pattern,
+         '--name-only')).decode('utf-8').splitlines()
+
+    print(f'Found {len(files)} {"file" if len(files) == 1 else "files"}',
+          file=sys.stderr)
+
+    # Intended to match base::NotFatalUntil as the last argument of CHECK(),
+    # CHECK_EQ(), et cetera. While this could match more things than expected,
+    # as it only looks for a comma + whitespace + a base::NotFatalUntil value,
+    # in practice, it more or less works.
+    replace_regex = re.compile(fr',\s+?(?:base::)?{pattern}')
+    # Macros that optionally take a single base::NotFatalUntil argument need a
+    # separate regex.
+    macro_replace_regex = re.compile(
+        fr'(?P<macro>CHECK_IS_(?:NOT_)?TEST|NOTREACHED)\((?:base::)?{pattern}\)'
+    )
+    for f in files:
+        print(f'Updating {f}...', file=sys.stderr)
+        with open(f, 'r+') as f:
+            contents = f.read()
+            new_contents = replace_regex.sub('', contents)
+            new_contents = macro_replace_regex.sub(f'\g<macro>()',
+                                                   new_contents)
+            if 'NotFatalUntil' not in new_contents:
+                new_contents = new_contents.replace(
+                    '#include "base/not_fatal_until.h"\n', '')
+            f.seek(0)
+            f.truncate()
+            f.write(new_contents)
+    print(f'Done!', file=sys.stderr)
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv[1:]))
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index 706f0f3..7831109 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -559,6 +559,10 @@
   "//buildtools/third_party/libc++:std_string_h",
   "//buildtools/third_party/libc++:std_uchar_h",
   "//buildtools/third_party/libc++:std_wctype_h",
+  "//buildtools/third_party/libc++:sysroot_bits",
+  "//buildtools/third_party/libc++:sysroot_features",
+  "//buildtools/third_party/libc++:sysroot_time",
+  "//buildtools/third_party/libc++:sysroot_types",
 ]
 
 # A helper for forwarding testonly and visibility.
@@ -614,6 +618,10 @@
       if (is_clang && _use_libcxx_modules) {
         # This is necessary for Clang modules builds.
         deps += DEFAULT_MODULE_DEPS
+        if (!defined(defines)) {
+          defines = []
+        }
+        defines +=  [ "USE_LIBCXX_MODULES" ]
       } else if (filter_include(configs,
                                 [ "//build/config/compiler:libcxx_module" ]) !=
                  []) {
@@ -726,6 +734,10 @@
       if (is_clang && _use_libcxx_modules) {
         # These are necessary for Clang modules builds.
         deps += DEFAULT_MODULE_DEPS
+        if (!defined(defines)) {
+          defines = []
+        }
+        defines +=  [ "USE_LIBCXX_MODULES" ]
       } else if (filter_include(configs,
                                 [ "//build/config/compiler:libcxx_module" ]) !=
                  []) {
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index ea2cd56..303902e 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -17,7 +17,6 @@
 #include "base/location.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/single_thread_task_runner.h"
@@ -395,7 +394,7 @@
   auto& inputs = inputs_.Write(*this);
   auto reference_it =
       std::ranges::find(inputs.children, reference, &scoped_refptr<Layer>::get);
-  CHECK(reference_it != inputs.children.end(), base::NotFatalUntil::M130);
+  CHECK(reference_it != inputs.children.end());
   size_t reference_index = reference_it - inputs.children.begin();
   reference->RemoveFromParent();
 
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc
index fa5265e8..6d4ab03 100644
--- a/cc/layers/picture_layer_impl_unittest.cc
+++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -805,20 +805,18 @@
       4.0f, active_layer()->tilings()->tiling_at(0)->contents_scale_key());
 }
 
-TEST_F(LegacySWPictureLayerImplTest, SnappedTilingDuringZoom) {
+TEST_F(NoLowResPictureLayerImplTest, SnappedTilingDuringZoom) {
   gfx::Size layer_bounds(2600, 3800);
   SetupDefaultTrees(layer_bounds);
 
   ResetTilingsAndRasterScales();
   EXPECT_EQ(0u, active_layer()->tilings()->num_tilings());
 
-  // Set up the high and low res tilings before pinch zoom.
+  // Set up the tiling before pinch zoom.
   SetContentsScaleOnBothLayers(0.24f, 1.0f, 0.24f);
-  ASSERT_EQ(2u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(1u, active_layer()->tilings()->num_tilings());
   EXPECT_FLOAT_EQ(
       0.24f, active_layer()->tilings()->tiling_at(0)->contents_scale_key());
-  EXPECT_FLOAT_EQ(
-      0.06f, active_layer()->tilings()->tiling_at(1)->contents_scale_key());
 
   // Ensure UpdateTiles won't remove any tilings.
   active_layer()->MarkAllTilingsUsed();
@@ -835,19 +833,17 @@
   // Zoom out by a small amount. We should create a tiling at half
   // the scale (1/kMaxScaleRatioDuringPinch).
   SetContentsScaleOnBothLayers(0.2f, 1.0f, 0.2f);
-  ASSERT_EQ(3u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(2u, active_layer()->tilings()->num_tilings());
   EXPECT_FLOAT_EQ(
       0.24f, active_layer()->tilings()->tiling_at(0)->contents_scale_key());
   EXPECT_FLOAT_EQ(
       0.12f, active_layer()->tilings()->tiling_at(1)->contents_scale_key());
-  EXPECT_FLOAT_EQ(
-      0.06f, active_layer()->tilings()->tiling_at(2)->contents_scale_key());
 
   // Ensure UpdateTiles won't remove any tilings.
   active_layer()->MarkAllTilingsUsed();
 
   // Zoom out further, close to our low-res scale factor. We should
-  // use that tiling as high-res, and not create a new tiling.
+  // create a new tiling.
   SetContentsScaleOnBothLayers(0.1f, 1.0f, 0.1f);
   ASSERT_EQ(3u, active_layer()->tilings()->num_tilings());
 
@@ -859,9 +855,11 @@
       0.24f, active_layer()->tilings()->tiling_at(0)->contents_scale_key());
 
   // Zoom in a lot. Since we move in factors of two, we should get a scale that
-  // is a power of 2 times 0.24.
+  // is a power of 2 times 0.24. The tile at the lowest scale factor is now out
+  // of range and should be cleaned up as a result, leaving the number of tiles
+  // still at 3 due to the addition and removal.
   SetContentsScaleOnBothLayers(1.f, 1.0f, 1.f);
-  ASSERT_EQ(4u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(3u, active_layer()->tilings()->num_tilings());
   EXPECT_FLOAT_EQ(
       1.92f, active_layer()->tilings()->tiling_at(0)->contents_scale_key());
 }
@@ -3513,7 +3511,7 @@
   EXPECT_TRUE(queue->IsEmpty());
 }
 
-TEST_F(LegacySWPictureLayerImplTest, TilingSetRasterQueueActiveTree) {
+TEST_F(NoLowResPictureLayerImplTest, TilingSetRasterQueueActiveTree) {
   host_impl()->AdvanceToNextFrame(base::Milliseconds(1));
 
   host_impl()->active_tree()->SetDeviceViewportRect(gfx::Rect(500, 500));
@@ -3525,7 +3523,7 @@
 
   SetupPendingTree(pending_raster_source);
   ActivateTree();
-  EXPECT_EQ(2u, active_layer()->num_tilings());
+  EXPECT_EQ(1u, active_layer()->num_tilings());
 
   std::unique_ptr<TilingSetRasterQueueRequired> queue =
       TilingSetRasterQueueRequired::Create(
@@ -5475,7 +5473,7 @@
     EXPECT_TRUE(tile->can_use_lcd_text());
 }
 
-TEST_F(LegacySWPictureLayerImplTest, UpdateLCDTextPushToActiveTree) {
+TEST_F(NoLowResPictureLayerImplTest, UpdateLCDTextPushToActiveTree) {
   SetupPendingTree(FakeRasterSource::CreateFilledWithText(gfx::Size(200, 200)));
   float page_scale = 4.f;
   SetupDrawPropertiesAndUpdateTiles(pending_layer(), page_scale, 1.0f,
@@ -5489,14 +5487,12 @@
   ActivateTree();
 
   EXPECT_TRUE(active_layer()->can_use_lcd_text());
-  ASSERT_EQ(2u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(1u, active_layer()->tilings()->num_tilings());
   ASSERT_TRUE(active_layer()->HighResTiling()->has_tiles());
   std::vector<Tile*> tiles =
       active_layer()->HighResTiling()->AllTilesForTesting();
   for (Tile* tile : tiles)
     EXPECT_TRUE(tile->can_use_lcd_text());
-  for (Tile* tile : active_layer()->LowResTiling()->AllTilesForTesting())
-    EXPECT_FALSE(tile->can_use_lcd_text());
 
   SetupPendingTree(FakeRasterSource::CreateFilledWithText(gfx::Size(200, 200)));
   SetupDrawPropertiesAndUpdateTiles(pending_layer(), page_scale, 1.0f,
@@ -5508,12 +5504,10 @@
   ActivateTree();
 
   EXPECT_FALSE(active_layer()->can_use_lcd_text());
-  ASSERT_EQ(2u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(1u, active_layer()->tilings()->num_tilings());
   ASSERT_TRUE(active_layer()->HighResTiling()->has_tiles());
   for (Tile* tile : active_layer()->HighResTiling()->AllTilesForTesting())
     EXPECT_FALSE(tile->can_use_lcd_text());
-  for (Tile* tile : active_layer()->LowResTiling()->AllTilesForTesting())
-    EXPECT_FALSE(tile->can_use_lcd_text());
 }
 
 TEST_F(LegacySWPictureLayerImplTest, UpdateLCDTextPushToActiveTreeWith2dScale) {
diff --git a/cc/paint/paint_cache.cc b/cc/paint/paint_cache.cc
index b88e176..8d31068 100644
--- a/cc/paint/paint_cache.cc
+++ b/cc/paint/paint_cache.cc
@@ -7,7 +7,6 @@
 #include "base/check_op.h"
 #include "base/compiler_specific.h"
 #include "base/containers/flat_set.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/synchronization/lock.h"
 
@@ -61,7 +60,7 @@
 void ClientPaintCache::AbortPendingEntries() {
   for (const auto& entry : pending_entries_) {
     auto it = cache_map_.Peek(entry);
-    CHECK(it != cache_map_.end(), base::NotFatalUntil::M130);
+    CHECK(it != cache_map_.end());
     EraseFromMap(it);
   }
   pending_entries_.clear();
diff --git a/cc/raster/task_graph_work_queue.cc b/cc/raster/task_graph_work_queue.cc
index 9da92d9..ac60b42 100644
--- a/cc/raster/task_graph_work_queue.cc
+++ b/cc/raster/task_graph_work_queue.cc
@@ -14,7 +14,6 @@
 
 #include "base/containers/contains.h"
 #include "base/memory/raw_ptr_exclusion.h"
-#include "base/not_fatal_until.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/trace_id_helper.h"
 #include "base/trace_event/typed_macros.h"
@@ -87,7 +86,7 @@
     auto it = std::ranges::find(graph_->nodes,
                                 graph_->edges[current_index_].dependent.get(),
                                 &TaskGraph::Node::task);
-    CHECK(it != graph_->nodes.end(), base::NotFatalUntil::M130);
+    CHECK(it != graph_->nodes.end());
     current_node_ = &(*it);
 
     return *this;
@@ -375,7 +374,7 @@
   // Remove task from |running_tasks|.
   auto it = std::ranges::find(task_namespace->running_tasks, task,
                               &CategorizedTask::second);
-  CHECK(it != task_namespace->running_tasks.end(), base::NotFatalUntil::M130);
+  CHECK(it != task_namespace->running_tasks.end());
   std::swap(*it, task_namespace->running_tasks.back());
   task_namespace->running_tasks.pop_back();
 
diff --git a/cc/resources/resource_pool.cc b/cc/resources/resource_pool.cc
index ddd7bec1..a74a0e3 100644
--- a/cc/resources/resource_pool.cc
+++ b/cc/resources/resource_pool.cc
@@ -17,7 +17,6 @@
 #include "base/containers/contains.h"
 #include "base/format_macros.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/single_thread_task_runner.h"
@@ -388,7 +387,7 @@
   // If the resource isn't busy then we made it available for reuse already
   // somehow, even though it was exported to the ResourceProvider, or we evicted
   // a resource that was still in use by the display compositor.
-  CHECK(busy_it != busy_resources_.end(), base::NotFatalUntil::M130);
+  CHECK(busy_it != busy_resources_.end());
 
   PoolResource* resource = busy_it->get();
   resource->set_state(PoolResource::kUnused);
diff --git a/cc/slim/frame_sink_impl.cc b/cc/slim/frame_sink_impl.cc
index fa1d7f19..455f886 100644
--- a/cc/slim/frame_sink_impl.cc
+++ b/cc/slim/frame_sink_impl.cc
@@ -11,7 +11,6 @@
 #include "base/check.h"
 #include "base/containers/flat_set.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/task/common/task_annotator.h"
 #include "base/threading/platform_thread.h"
 #include "base/trace_event/trace_event.h"
@@ -199,7 +198,7 @@
                                        const gpu::SyncToken& sync_token,
                                        bool is_lost) {
   auto itr = uploaded_resources_.find(ui_resource_id);
-  CHECK(itr != uploaded_resources_.end(), base::NotFatalUntil::M130);
+  CHECK(itr != uploaded_resources_.end());
   auto* sii = context_provider_->SharedImageInterface();
   sii->DestroySharedImage(sync_token, std::move(itr->second.shared_image));
   uploaded_resources_.erase(itr);
diff --git a/cc/slim/layer.cc b/cc/slim/layer.cc
index f064e56..9b3429c 100644
--- a/cc/slim/layer.cc
+++ b/cc/slim/layer.cc
@@ -11,7 +11,6 @@
 
 #include "base/atomic_sequence_num.h"
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 #include "cc/paint/filter_operation.h"
 #include "cc/slim/layer_tree.h"
 #include "cc/slim/layer_tree_impl.h"
@@ -128,7 +127,7 @@
 
   auto it = std::ranges::find_if(
       children_, [&](auto& ptr) { return ptr.get() == old_child; });
-  CHECK(it != children_.end(), base::NotFatalUntil::M130);
+  CHECK(it != children_.end());
   old_child->SetParentSlim(nullptr);
   old_child->SetLayerTree(nullptr);
 
diff --git a/cc/test/animation_timelines_test_common.cc b/cc/test/animation_timelines_test_common.cc
index 6896b57f..3bc475de 100644
--- a/cc/test/animation_timelines_test_common.cc
+++ b/cc/test/animation_timelines_test_common.cc
@@ -8,7 +8,6 @@
 
 #include "base/containers/contains.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "cc/animation/animation.h"
 #include "cc/animation/animation_events.h"
 #include "cc/animation/animation_id_provider.h"
@@ -206,7 +205,7 @@
                                              ? layers_in_active_tree_
                                              : layers_in_pending_tree_;
   auto kv = layers_in_tree.find(element_id);
-  CHECK(kv != layers_in_tree.end(), base::NotFatalUntil::M130);
+  CHECK(kv != layers_in_tree.end());
   layers_in_tree.erase(kv);
 }
 
diff --git a/cc/tiles/checker_image_tracker.cc b/cc/tiles/checker_image_tracker.cc
index bc2b17db..78453de 100644
--- a/cc/tiles/checker_image_tracker.cc
+++ b/cc/tiles/checker_image_tracker.cc
@@ -13,7 +13,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/trace_event/trace_event.h"
 
@@ -215,7 +214,7 @@
     // re-decode and checker images that were pending invalidation.
     for (auto image_id : images_pending_invalidation_) {
       auto it = image_async_decode_state_.find(image_id);
-      CHECK(it != image_async_decode_state_.end(), base::NotFatalUntil::M130);
+      CHECK(it != image_async_decode_state_.end());
       DCHECK_EQ(it->second.policy, DecodePolicy::SYNC);
       it->second.policy = DecodePolicy::ASYNC;
     }
@@ -408,7 +407,7 @@
     // needed.
     PaintImage::Id image_id = candidate.stable_id();
     auto it = image_async_decode_state_.find(image_id);
-    CHECK(it != image_async_decode_state_.end(), base::NotFatalUntil::M130);
+    CHECK(it != image_async_decode_state_.end());
     if (it->second.policy != DecodePolicy::ASYNC)
       continue;
 
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc
index 04f3232..8850181 100644
--- a/cc/tiles/gpu_image_decode_cache.cc
+++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -23,7 +23,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_math.h"
 #include "base/strings/stringprintf.h"
@@ -2159,7 +2158,7 @@
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
                "GpuImageDecodeCache::RefImageDecode");
   auto found = in_use_cache_.find(cache_key);
-  CHECK(found != in_use_cache_.end(), base::NotFatalUntil::M130);
+  CHECK(found != in_use_cache_.end());
   ++found->second.ref_count;
   ++found->second.image_data->decode.ref_count;
   OwnershipChanged(draw_image, found->second.image_data.get());
@@ -2170,7 +2169,7 @@
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
                "GpuImageDecodeCache::UnrefImageDecode");
   auto found = in_use_cache_.find(cache_key);
-  CHECK(found != in_use_cache_.end(), base::NotFatalUntil::M130);
+  CHECK(found != in_use_cache_.end());
   DCHECK_GT(found->second.image_data->decode.ref_count, 0u);
   DCHECK_GT(found->second.ref_count, 0u);
   --found->second.ref_count;
@@ -2192,7 +2191,7 @@
   // cache entry now.
   if (found == in_use_cache_.end()) {
     auto found_image = persistent_cache_.Peek(draw_image.frame_key());
-    CHECK(found_image != persistent_cache_.end(), base::NotFatalUntil::M130);
+    CHECK(found_image != persistent_cache_.end());
     DCHECK(IsCompatible(found_image->second.get(), draw_image));
     found = in_use_cache_
                 .insert(InUseCache::value_type(
@@ -2200,7 +2199,7 @@
                 .first;
   }
 
-  CHECK(found != in_use_cache_.end(), base::NotFatalUntil::M130);
+  CHECK(found != in_use_cache_.end());
   ++found->second.ref_count;
   ++found->second.image_data->upload.ref_count;
   OwnershipChanged(draw_image, found->second.image_data.get());
@@ -2209,7 +2208,7 @@
 void GpuImageDecodeCache::UnrefImageInternal(const DrawImage& draw_image,
                                              const InUseCacheKey& cache_key) {
   auto found = in_use_cache_.find(cache_key);
-  CHECK(found != in_use_cache_.end(), base::NotFatalUntil::M130);
+  CHECK(found != in_use_cache_.end());
   DCHECK_GT(found->second.image_data->upload.ref_count, 0u);
   DCHECK_GT(found->second.ref_count, 0u);
   --found->second.ref_count;
@@ -3480,7 +3479,7 @@
     const DrawImage& image) {
   base::AutoLock lock(lock_);
   auto found = persistent_cache_.Peek(image.frame_key());
-  CHECK(found != persistent_cache_.end(), base::NotFatalUntil::M130);
+  CHECK(found != persistent_cache_.end());
   ImageData* image_data = found->second.get();
   image_data->decode.decode_failure = true;
 }
@@ -3489,7 +3488,7 @@
     const DrawImage& image) {
   base::AutoLock lock(lock_);
   auto found = persistent_cache_.Peek(image.frame_key());
-  CHECK(found != persistent_cache_.end(), base::NotFatalUntil::M130);
+  CHECK(found != persistent_cache_.end());
   ImageData* image_data = found->second.get();
   return image_data->decode.is_locked();
 }
@@ -3512,7 +3511,7 @@
     const DrawImage& image) {
   base::AutoLock lock(lock_);
   auto found = persistent_cache_.Peek(image.frame_key());
-  CHECK(found != persistent_cache_.end(), base::NotFatalUntil::M130);
+  CHECK(found != persistent_cache_.end());
   ImageData* image_data = found->second.get();
   DCHECK(!image_data->info.yuva.has_value());
   return image_data->decode.ImageForTesting();
diff --git a/cc/tiles/image_controller.cc b/cc/tiles/image_controller.cc
index 7520646..ecbd14e7 100644
--- a/cc/tiles/image_controller.cc
+++ b/cc/tiles/image_controller.cc
@@ -10,7 +10,6 @@
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/task_traits.h"
 #include "base/trace_event/trace_event.h"
@@ -419,8 +418,7 @@
 
   // Take the next request from the queue.
   auto decode_it = worker_state->image_decode_queue.begin();
-  CHECK(decode_it != worker_state->image_decode_queue.end(),
-        base::NotFatalUntil::M130);
+  CHECK(decode_it != worker_state->image_decode_queue.end());
   // Skip tasks that have an unmet external dependency.
   while (decode_it != worker_state->image_decode_queue.end() &&
          decode_it->second.has_external_dependency) {
diff --git a/cc/tiles/software_image_decode_cache.cc b/cc/tiles/software_image_decode_cache.cc
index 7f840b0..d5cff29 100644
--- a/cc/tiles/software_image_decode_cache.cc
+++ b/cc/tiles/software_image_decode_cache.cc
@@ -17,7 +17,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/raw_ref.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/ostream_operators.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/single_thread_task_runner.h"
@@ -321,7 +320,7 @@
 
 void SoftwareImageDecodeCache::UnrefImage(const CacheKey& key) {
   auto decoded_image_it = decoded_images_.Peek(key);
-  CHECK(decoded_image_it != decoded_images_.end(), base::NotFatalUntil::M130);
+  CHECK(decoded_image_it != decoded_images_.end());
   auto* entry = decoded_image_it->second.get();
   DCHECK_GT(entry->ref_count, 0);
   if (--entry->ref_count == 0) {
@@ -343,7 +342,7 @@
   base::AutoLock lock(lock_);
 
   auto image_it = decoded_images_.Peek(key);
-  CHECK(image_it != decoded_images_.end(), base::NotFatalUntil::M130);
+  CHECK(image_it != decoded_images_.end());
   auto* cache_entry = image_it->second.get();
   // These two checks must be true because we're running this from a task, which
   // means that we've budgeted this entry when we got the task and the ref count
@@ -507,8 +506,7 @@
   auto image_keys_it = frame_key_to_image_keys_.find(key.frame_key());
   // We know that we must have at least our own |entry| in this list, so it
   // won't be empty.
-  CHECK(image_keys_it != frame_key_to_image_keys_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(image_keys_it != frame_key_to_image_keys_.end());
 
   auto& available_keys = image_keys_it->second;
   std::sort(available_keys.begin(), available_keys.end(),
@@ -530,7 +528,7 @@
       continue;
     }
     auto image_it = decoded_images_.Peek(available_key);
-    CHECK(image_it != decoded_images_.end(), base::NotFatalUntil::M130);
+    CHECK(image_it != decoded_images_.end());
     auto* available_entry = image_it->second.get();
     if (available_entry->is_locked || available_entry->Lock()) {
       return available_key;
@@ -640,7 +638,7 @@
     const CacheKey& key = it->first;
     auto vector_it = frame_key_to_image_keys_.find(key.frame_key());
     auto item_it = std::ranges::find(vector_it->second, key);
-    CHECK(item_it != vector_it->second.end(), base::NotFatalUntil::M130);
+    CHECK(item_it != vector_it->second.end());
     vector_it->second.erase(item_it);
     if (vector_it->second.empty())
       frame_key_to_image_keys_.erase(vector_it);
@@ -668,7 +666,7 @@
   base::AutoLock hold(lock_);
 
   auto image_it = decoded_images_.Peek(key);
-  CHECK(image_it != decoded_images_.end(), base::NotFatalUntil::M130);
+  CHECK(image_it != decoded_images_.end());
   CacheEntry* cache_entry = image_it->second.get();
   UMA_HISTOGRAM_BOOLEAN("Compositing.DecodeLCPCandidateImage.Software",
                         key.may_be_lcp_candidate());
diff --git a/cc/trees/image_animation_controller.cc b/cc/trees/image_animation_controller.cc
index abcddf7..d9ee65a39 100644
--- a/cc/trees/image_animation_controller.cc
+++ b/cc/trees/image_animation_controller.cc
@@ -9,7 +9,6 @@
 
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/trace_event/trace_event.h"
@@ -59,7 +58,7 @@
     PaintImage::Id paint_image_id,
     AnimationDriver* driver) {
   auto it = animation_state_map_.find(paint_image_id);
-  CHECK(it != animation_state_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != animation_state_map_.end());
   it->second.AddDriver(driver);
   registered_animations_.insert(paint_image_id);
 }
@@ -68,7 +67,7 @@
     PaintImage::Id paint_image_id,
     AnimationDriver* driver) {
   auto it = animation_state_map_.find(paint_image_id);
-  CHECK(it != animation_state_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != animation_state_map_.end());
   it->second.RemoveDriver(driver);
   if (!it->second.has_drivers())
     registered_animations_.erase(paint_image_id);
@@ -90,7 +89,7 @@
 
   for (auto id : registered_animations_) {
     auto it = animation_state_map_.find(id);
-    CHECK(it != animation_state_map_.end(), base::NotFatalUntil::M130);
+    CHECK(it != animation_state_map_.end());
     AnimationState& state = it->second;
 
     // Is anyone still interested in animating this image?
@@ -142,7 +141,7 @@
   std::optional<base::TimeTicks> next_invalidation_time;
   for (auto image_id : registered_animations_) {
     auto it = animation_state_map_.find(image_id);
-    CHECK(it != animation_state_map_.end(), base::NotFatalUntil::M130);
+    CHECK(it != animation_state_map_.end());
     AnimationState& state = it->second;
     state.UpdateStateFromDrivers();
 
@@ -171,7 +170,7 @@
 
   for (auto id : images_animated_on_sync_tree_) {
     auto it = animation_state_map_.find(id);
-    CHECK(it != animation_state_map_.end(), base::NotFatalUntil::M130);
+    CHECK(it != animation_state_map_.end());
     it->second.PushPendingToActive();
   }
   images_animated_on_sync_tree_.clear();
@@ -195,7 +194,7 @@
     PaintImage::Id paint_image_id,
     WhichTree tree) const {
   const auto& it = animation_state_map_.find(paint_image_id);
-  CHECK(it != animation_state_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != animation_state_map_.end());
   return tree == WhichTree::PENDING_TREE ? it->second.pending_index()
                                          : it->second.active_index();
 }
@@ -210,14 +209,14 @@
 ImageAnimationController::GetDriversForTesting(
     PaintImage::Id paint_image_id) const {
   const auto& it = animation_state_map_.find(paint_image_id);
-  CHECK(it != animation_state_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != animation_state_map_.end());
   return it->second.drivers_for_testing();
 }
 
 size_t ImageAnimationController::GetLastNumOfFramesSkippedForTesting(
     PaintImage::Id paint_image_id) const {
   const auto& it = animation_state_map_.find(paint_image_id);
-  CHECK(it != animation_state_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != animation_state_map_.end());
   return it->second.last_num_frames_skipped_for_testing();
 }
 
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index 3511795..15768b5 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -22,7 +22,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_math.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -520,7 +519,7 @@
                                               bool decode_succeeded) {
   DCHECK(IsMainThread());
   auto it = pending_image_decodes_.find(request_id);
-  CHECK(it != pending_image_decodes_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_image_decodes_.end());
   // Issue stored callback and remove them from the pending list.
   std::move(it->second.first).Run(decode_succeeded);
   pending_image_decodes_.erase(it);
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 98e8b65..f4b5ad44 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -32,7 +32,6 @@
 #include "base/memory/raw_ptr_exclusion.h"
 #include "base/memory/read_only_shared_memory_region.h"
 #include "base/metrics/histogram.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -5707,7 +5706,7 @@
 
 bool LayerTreeHostImpl::IsUIResourceOpaque(UIResourceId uid) const {
   auto iter = ui_resource_map_.find(uid);
-  CHECK(iter != ui_resource_map_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != ui_resource_map_.end());
   return iter->second.opaque;
 }
 
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index d88b8ed..75fe10a1 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -23,7 +23,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/stack_allocated.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/parameter_pack.h"
 #include "base/strings/stringprintf.h"
@@ -2242,7 +2241,7 @@
 
 void LayerTreeImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
   auto it = std::ranges::find(picture_layers_, layer);
-  CHECK(it != picture_layers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != picture_layers_.end());
   picture_layers_.erase(it);
 
   // Make sure that |picture_layers_with_paint_worklets_| doesn't get left with
@@ -2258,8 +2257,7 @@
     DCHECK(insert_pair.second);
   } else {
     auto it = picture_layers_with_paint_worklets_.find(layer);
-    CHECK(it != picture_layers_with_paint_worklets_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(it != picture_layers_with_paint_worklets_.end());
     picture_layers_with_paint_worklets_.erase(it);
   }
 }
diff --git a/chrome/MAJOR_BRANCH_DATE b/chrome/MAJOR_BRANCH_DATE
index a15dd2e..c6f1106 100644
--- a/chrome/MAJOR_BRANCH_DATE
+++ b/chrome/MAJOR_BRANCH_DATE
@@ -1 +1 @@
-MAJOR_BRANCH_DATE=2025-04-29
+MAJOR_BRANCH_DATE=2025-05-27
diff --git a/chrome/VERSION b/chrome/VERSION
index ddb946d9..9d6e947 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
-MAJOR=138
+MAJOR=139
 MINOR=0
-BUILD=7204
+BUILD=7205
 PATCH=0
diff --git a/chrome/android/java/res/layout/incognito_cookie_controls_card.xml b/chrome/android/java/res/layout/incognito_cookie_controls_card.xml
index 0610eab7..b64746d 100644
--- a/chrome/android/java/res/layout/incognito_cookie_controls_card.xml
+++ b/chrome/android/java/res/layout/incognito_cookie_controls_card.xml
@@ -20,10 +20,11 @@
         android:id="@+id/cookie_controls_card_managed_icon"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        tools:ignore="ContentDescription"
         android:layout_marginEnd="10dp"
         android:layout_centerVertical="true"
         android:layout_alignParentStart="true"
+        android:contentDescription=
+            "@string/accessibility_incognito_3pc_settings"
         app:tint="@color/default_icon_color_light" />
 
     <com.google.android.material.materialswitch.MaterialSwitch
@@ -39,7 +40,8 @@
     <org.chromium.ui.widget.TextViewWithLeading
         android:id="@+id/cookie_controls_card_title"
         android:text="@string/new_tab_otr_third_party_cookie"
-        android:textAppearance="@style/TextAppearance.TextLarge.Primary.Baseline.Light"
+        android:textAppearance=
+            "@style/TextAppearance.TextLarge.Primary.Baseline.Light"
         android:layout_toStartOf="@id/cookie_controls_card_toggle"
         android:layout_toEndOf="@id/cookie_controls_card_managed_icon"
         android:layout_marginBottom="@dimen/md_incognito_ntp_line_spacing"
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 256d81e..298134f 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -58,6 +58,7 @@
 #include "chrome/browser/predictors/loading_predictor_config.h"
 #include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h"
 #include "chrome/browser/preloading/preloading_features.h"
+#include "chrome/browser/preloading/search_preload/search_preload_features.h"
 #include "chrome/browser/resource_coordinator/tab_manager_features.h"
 #include "chrome/browser/sharing_hub/sharing_hub_features.h"
 #include "chrome/browser/site_isolation/about_flags.h"
@@ -9636,6 +9637,13 @@
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) ||
         // BUILDFLAG(IS_CHROMEOS)
 
+    {"dse-preload2", flag_descriptions::kDsePreload2Name,
+     flag_descriptions::kDsePreload2Description, kOsAll,
+     FEATURE_VALUE_TYPE(features::kDsePreload2)},
+    {"dse-preload2-on-press", flag_descriptions::kDsePreload2OnPressName,
+     flag_descriptions::kDsePreload2OnPressDescription, kOsAll,
+     FEATURE_VALUE_TYPE(features::kDsePreload2OnPress)},
+
 #if !BUILDFLAG(IS_ANDROID)
     {"audio-ducking", flag_descriptions::kAudioDuckingName,
      flag_descriptions::kAudioDuckingDescription, kOsDesktop,
diff --git a/chrome/browser/actor/actor_coordinator_unittest.cc b/chrome/browser/actor/actor_coordinator_unittest.cc
index 82464cc..fc78539 100644
--- a/chrome/browser/actor/actor_coordinator_unittest.cc
+++ b/chrome/browser/actor/actor_coordinator_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <optional>
 
+#include "base/test/bind.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_future.h"
 #include "chrome/browser/actor/actor_test_util.h"
@@ -25,6 +26,8 @@
 
 namespace actor {
 
+using ::optimization_guide::proto::BrowserAction;
+
 namespace {
 
 constexpr int kFakeContentNodeId = 123;
@@ -100,8 +103,10 @@
   }
 
  protected:
-  bool Act(const GURL& url,
-           const optimization_guide::proto::BrowserAction& action) {
+  // Note: action must be generated from a callback because this method
+  // navigates the render frame and the generated action must include a document
+  // identifier token which is only available after the navigation.
+  bool Act(const GURL& url, base::OnceCallback<BrowserAction()> make_action) {
     content::NavigationSimulator::NavigateAndCommitFromBrowser(web_contents(),
                                                                url);
 
@@ -111,6 +116,7 @@
     base::test::TestFuture<mojom::ActionResultPtr> success;
     ActorCoordinator coordinator(profile());
     coordinator.StartTaskForTesting(GetTab());
+    BrowserAction action = std::move(make_action).Run();
     coordinator.Act(action, success.GetCallback());
     return IsOk(*success.Get());
   }
@@ -139,13 +145,17 @@
 };
 
 TEST_F(ActorCoordinatorTest, ActSucceedsOnSupportedUrl) {
-  EXPECT_TRUE(Act(GURL("http://localhost/"),
-                  MakeClick(*main_rfh(), kFakeContentNodeId)));
+  EXPECT_TRUE(
+      Act(GURL("http://localhost/"), base::BindLambdaForTesting([this]() {
+            return MakeClick(*main_rfh(), kFakeContentNodeId);
+          })));
 }
 
 TEST_F(ActorCoordinatorTest, ActFailsOnUnsupportedUrl) {
   EXPECT_FALSE(Act(GURL(chrome::kChromeUIVersionURL),
-                   MakeClick(*main_rfh(), kFakeContentNodeId)));
+                   base::BindLambdaForTesting([this]() {
+                     return MakeClick(*main_rfh(), kFakeContentNodeId);
+                   })));
 }
 
 TEST_F(ActorCoordinatorTest, ActFailsWhenTabDestroyed) {
diff --git a/chrome/browser/actor/tools/tool_invocation.cc b/chrome/browser/actor/tools/tool_invocation.cc
index 0a04830cd..765a755 100644
--- a/chrome/browser/actor/tools/tool_invocation.cc
+++ b/chrome/browser/actor/tools/tool_invocation.cc
@@ -4,17 +4,47 @@
 
 #include "chrome/browser/actor/tools/tool_invocation.h"
 
+#include "components/optimization_guide/content/browser/page_content_proto_provider.h"
 #include "components/optimization_guide/proto/features/actions_data.pb.h"
 #include "components/tabs/public/tab_interface.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 
 using content::RenderFrameHost;
+using optimization_guide::DocumentIdentifierUserData;
 using optimization_guide::proto::ActionInformation;
+using optimization_guide::proto::ActionTarget;
 using tabs::TabInterface;
 
 namespace actor {
 
+namespace {
+
+const ActionTarget* ExtractTarget(const ActionInformation& action_information) {
+  switch (action_information.action_info_case()) {
+    case ActionInformation::kClick:
+      return &action_information.click().target();
+    case ActionInformation::kType:
+      return &action_information.type().target();
+    case ActionInformation::kScroll:
+      return &action_information.scroll().target();
+    case ActionInformation::kMoveMouse:
+      return &action_information.move_mouse().target();
+    case ActionInformation::kDragAndRelease:
+      return &action_information.drag_and_release().from_target();
+    case ActionInformation::kSelect:
+      return &action_information.select().target();
+    case ActionInformation::kNavigate:
+    case ActionInformation::kBack:
+    case ActionInformation::kForward:
+    case ActionInformation::kWait:
+    case ActionInformation::ACTION_INFO_NOT_SET:
+      return nullptr;
+  }
+}
+
+}  // namespace
+
 ToolInvocation::ToolInvocation(const ActionInformation& action_information,
                                TabInterface& target_tab)
     : action_information_(action_information), target_tab_(target_tab) {}
@@ -28,12 +58,30 @@
     return target_tab_->GetContents()->GetPrimaryMainFrame();
   }
 
-  // TODO(crbug.com/402086380): action_target.frame_info() is currently empty.
-  // This should be:
-  // auto* rfh = RenderFrameHost::FromID(frame_info.process, frame_info.frame);
-  // CHECK_EQ(rfh, target_tab_.GetPrimaryMainFrame())
-  // return rfh;
-  return target_tab_->GetContents()->GetPrimaryMainFrame();
+  const ActionTarget* target = ExtractTarget(action_information_);
+  CHECK(target);
+
+  std::string serialized_token =
+      target->document_identifier().serialized_token();
+
+  RenderFrameHost* target_frame = nullptr;
+  target_tab_->GetContents()
+      ->GetPrimaryMainFrame()
+      ->ForEachRenderFrameHostWithAction([&serialized_token,
+                                          &target_frame](RenderFrameHost* rfh) {
+        auto* user_data =
+            DocumentIdentifierUserData::GetForCurrentDocument(rfh);
+        if (user_data && user_data->serialized_token() == serialized_token) {
+          // If the frame is inactive it shouldn't be targeted for tool use.
+          if (rfh->IsActive()) {
+            target_frame = rfh;
+          }
+          return RenderFrameHost::FrameIterationAction::kStop;
+        }
+        return RenderFrameHost::FrameIterationAction::kContinue;
+      });
+
+  return target_frame;
 }
 
 TabInterface* ToolInvocation::FindTargetTab() const {
diff --git a/chrome/browser/actor/tools/tools_browsertest.cc b/chrome/browser/actor/tools/tools_browsertest.cc
index 6187394..ae1ca0dc 100644
--- a/chrome/browser/actor/tools/tools_browsertest.cc
+++ b/chrome/browser/actor/tools/tools_browsertest.cc
@@ -12,6 +12,7 @@
 #include "base/test/test_timeouts.h"
 #include "base/time/time.h"
 #include "chrome/browser/actor/actor_coordinator.h"
+#include "chrome/browser/actor/actor_features.h"
 #include "chrome/browser/actor/actor_test_util.h"
 #include "chrome/browser/actor/tools/wait_tool.h"
 #include "chrome/browser/profiles/profile.h"
@@ -29,10 +30,12 @@
 #include "components/optimization_guide/proto/features/actions_data.pb.h"
 #include "components/tabs/public/tab_interface.h"
 #include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/weak_document_ptr.h"
 #include "content/public/test/back_forward_cache_util.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_navigation_observer.h"
+#include "content/public/test/test_utils.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
 #include "net/dns/mock_host_resolver.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -50,10 +53,13 @@
 using content::ExecJs;
 using content::GetDOMNodeId;
 using content::JsReplace;
+using content::NavigateIframeToURL;
+using content::NavigateToURL;
 using content::RenderFrameHost;
 using content::TestNavigationManager;
 using content::TestNavigationObserver;
 using content::ToRenderFrameHost;
+using content::WeakDocumentPtr;
 using content::WebContents;
 using optimization_guide::proto::BrowserAction;
 using optimization_guide::proto::ClickAction;
@@ -105,9 +111,16 @@
 class ActorToolsTest : public InProcessBrowserTest {
  public:
   ActorToolsTest() {
-    scoped_feature_list_.InitWithFeatures(
-        /*enabled_features=*/{features::kGlic, features::kTabstripComboButton,
-                              features::kGlicActor},
+    base::FieldTrialParams allowlist_params;
+    allowlist_params["allowlist"] = "foo.com,bar.com";
+    allowlist_params["allowlist_only"] = "true";
+
+    scoped_feature_list_.InitWithFeaturesAndParameters(
+        /*enabled_features=*/{{features::kGlic, {}},
+                              {features::kTabstripComboButton, {}},
+                              {features::kGlicActor, {}},
+                              {kGlicActionAllowlist,
+                               std::move(allowlist_params)}},
         /*disabled_features=*/{features::kGlicWarming});
   }
   ActorToolsTest(const ActorToolsTest&) = delete;
@@ -119,6 +132,7 @@
     InProcessBrowserTest::SetUpOnMainThread();
     host_resolver()->AddRule("*", "127.0.0.1");
     ASSERT_TRUE(embedded_test_server()->Start());
+    ASSERT_TRUE(embedded_https_test_server().Start());
 
     // TODO(crbug.com/409564704): Mock the delay so that tests can run at
     // reasonable speed. Remove once there is a more permanent approach.
@@ -402,6 +416,41 @@
   }
 }
 
+// Ensure click works correctly when clicking on a cross process iframe using a
+// DomNodeId
+IN_PROC_BROWSER_TEST_F(ActorToolsTest, ClickTool_Subframe_DomNodeId) {
+  // This test only applies if cross-origin frames are put into separate
+  // processes.
+  if (content::AreAllSitesIsolatedForTesting()) {
+    GTEST_SKIP();
+  }
+
+  const GURL url = embedded_https_test_server().GetURL(
+      "foo.com", "/actor/positioned_iframe.html");
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), url));
+
+  const GURL subframe_url = embedded_https_test_server().GetURL(
+      "bar.com", "/actor/page_with_clickable_element.html");
+  ASSERT_TRUE(NavigateIframeToURL(web_contents(), "iframe", subframe_url));
+
+  RenderFrameHost* subframe =
+      ChildFrameAt(web_contents()->GetPrimaryMainFrame(), 0);
+  ASSERT_TRUE(subframe);
+  ASSERT_TRUE(subframe->IsCrossProcessSubframe());
+
+  // Send a click to the button in the subframe.
+  std::optional<int> button_id = GetDOMNodeId(*subframe, "button#clickable");
+  ASSERT_TRUE(button_id);
+  BrowserAction action = MakeClick(*subframe, button_id.value());
+
+  TestFuture<mojom::ActionResultPtr> result;
+  actor_coordinator().Act(action, result.GetCallback());
+  ExpectOkResult(result);
+
+  // Ensure the button's event handler was invoked.
+  EXPECT_EQ(true, EvalJs(subframe, "button_clicked"));
+}
+
 // ===============================================
 // Type Tool
 // ===============================================
@@ -1955,6 +2004,44 @@
   ExpectOkResult(result);
 }
 
+// ===============================================
+// Tool-Agnostic Tests
+// ===============================================
+
+// Test that requesting tool use on a page that's not active fails. In this case
+// we use BFCache but a prerendered page would be another example of an inactive
+// page with a live RenderFrameHost.
+IN_PROC_BROWSER_TEST_F(ActorToolsTest, InvokeToolInInactiveFrame) {
+  // This test relies on BFCache so don't run it if it's not available.
+  if (!content::BackForwardCache::IsBackForwardCacheFeatureEnabled()) {
+    GTEST_SKIP();
+  }
+
+  const GURL url_first =
+      embedded_test_server()->GetURL("/actor/blank.html?start");
+  const GURL url_second =
+      embedded_test_server()->GetURL("/actor/blank.html?target");
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), url_first));
+
+  WeakDocumentPtr first_rfh = main_frame()->GetWeakDocumentPtr();
+  ASSERT_TRUE(first_rfh.AsRenderFrameHostIfValid()->IsActive());
+
+  // Create an action that targets the first document.
+  BrowserAction action =
+      MakeClick(*first_rfh.AsRenderFrameHostIfValid(), gfx::Point(10, 10));
+
+  // Navigate to the second document - we expect this should put the first
+  // document into the BFCache rather than destroying the RenderFrameHost.
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), url_second));
+  ASSERT_TRUE(first_rfh.AsRenderFrameHostIfValid());
+  EXPECT_EQ(first_rfh.AsRenderFrameHostIfValid()->GetLifecycleState(),
+            RenderFrameHost::LifecycleState::kInBackForwardCache);
+
+  TestFuture<mojom::ActionResultPtr> result;
+  actor_coordinator().Act(action, result.GetCallback());
+  ExpectErrorResult(result, mojom::ActionResultCode::kTabWentAway);
+}
+
 }  // namespace
 
 }  // namespace actor
diff --git a/chrome/browser/ai/ai_data_keyed_service_browsertest.cc b/chrome/browser/ai/ai_data_keyed_service_browsertest.cc
index dd3dadf..5d1343e 100644
--- a/chrome/browser/ai/ai_data_keyed_service_browsertest.cc
+++ b/chrome/browser/ai/ai_data_keyed_service_browsertest.cc
@@ -38,6 +38,7 @@
 #include "components/history_embeddings/mock_answerer.h"
 #include "components/history_embeddings/mock_intent_classifier.h"
 #include "components/network_session_configurator/common/network_switches.h"
+#include "components/optimization_guide/content/browser/page_content_proto_provider.h"
 #include "components/optimization_guide/proto/features/actions_data.pb.h"
 #include "components/optimization_guide/proto/features/common_quality_data.pb.h"
 #include "components/passage_embeddings/passage_embeddings_test_util.h"
@@ -57,6 +58,7 @@
 namespace {
 
 using ::base::test::TestFuture;
+using ::optimization_guide::DocumentIdentifierUserData;
 using ::optimization_guide::proto::ClickAction;
 using ::testing::ReturnRef;
 using AiData = AiDataKeyedService::AiData;
@@ -654,6 +656,9 @@
   click_request.set_tab_id(id);
   ClickAction* click = click_request.add_action_information()->mutable_click();
   click->mutable_target()->set_content_node_id(anchor_dom_node_id.value());
+  click->mutable_target()->mutable_document_identifier()->set_serialized_token(
+      *DocumentIdentifierUserData::GetDocumentIdentifier(
+          web_contents()->GetPrimaryMainFrame()->GetGlobalFrameToken()));
   click->set_click_type(ClickAction::LEFT);
   click->set_click_count(ClickAction::SINGLE);
 
diff --git a/chrome/browser/android/BUILD.gn b/chrome/browser/android/BUILD.gn
index ec37009c..2a18a71 100644
--- a/chrome/browser/android/BUILD.gn
+++ b/chrome/browser/android/BUILD.gn
@@ -24,14 +24,3 @@
     "//content/public/browser",
   ]
 }
-
-source_set("keyboard_shortcuts") {
-  sources = [
-    "keyboard_shortcuts.cc",
-    "keyboard_shortcuts.h",
-  ]
-  deps = [
-    "//chrome/android:chrome_jni_headers",
-    "//chrome/browser:browser_public_dependencies",
-  ]
-}
diff --git a/chrome/browser/android/httpclient/http_client.cc b/chrome/browser/android/httpclient/http_client.cc
index 721ace1c..82c85b8 100644
--- a/chrome/browser/android/httpclient/http_client.cc
+++ b/chrome/browser/android/httpclient/http_client.cc
@@ -12,7 +12,6 @@
 #include <string>
 #include <utility>
 
-#include "base/not_fatal_until.h"
 #include "content/public/browser/browser_thread.h"
 #include "net/http/http_request_headers.h"
 #include "net/http/http_response_headers.h"
@@ -109,7 +108,7 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   // Release the current loader.
   auto loader_iter = url_loaders_.find(simple_loader);
-  CHECK(loader_iter != url_loaders_.end(), base::NotFatalUntil::M130);
+  CHECK(loader_iter != url_loaders_.end());
   url_loaders_.erase(loader_iter);
 }
 
diff --git a/chrome/browser/android/keyboard_shortcuts.h b/chrome/browser/android/keyboard_shortcuts.h
deleted file mode 100644
index b8bbdffe..0000000
--- a/chrome/browser/android/keyboard_shortcuts.h
+++ /dev/null
@@ -1,19 +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 CHROME_BROWSER_ANDROID_KEYBOARD_SHORTCUTS_H_
-#define CHROME_BROWSER_ANDROID_KEYBOARD_SHORTCUTS_H_
-
-namespace ui {
-class Accelerator;
-}
-
-namespace chrome::android {
-
-// Returns whether the given accelerator is a chrome accelerator.
-bool IsChromeAccelerator(const ui::Accelerator& accelerator);
-
-}  // namespace chrome::android
-
-#endif  // CHROME_BROWSER_ANDROID_KEYBOARD_SHORTCUTS_H_
diff --git a/chrome/browser/android/metrics/android_session_durations_service.cc b/chrome/browser/android/metrics/android_session_durations_service.cc
index 18bfbdc6..4bd669c6 100644
--- a/chrome/browser/android/metrics/android_session_durations_service.cc
+++ b/chrome/browser/android/metrics/android_session_durations_service.cc
@@ -93,8 +93,7 @@
     signin::IdentityManager* identity_manager) {
   DCHECK(!incognito_session_metrics_recorder_);
   DCHECK(!sync_session_metrics_recorder_);
-  CHECK(!password_session_duration_metrics_recorder_,
-        base::NotFatalUntil::M130);
+  CHECK(!password_session_duration_metrics_recorder_);
   DCHECK(!msbb_session_metrics_recorder_);
 
   sync_session_metrics_recorder_ =
@@ -120,8 +119,7 @@
 void AndroidSessionDurationsService::InitializeForIncognitoProfile() {
   DCHECK(!incognito_session_metrics_recorder_);
   DCHECK(!sync_session_metrics_recorder_);
-  CHECK(!password_session_duration_metrics_recorder_,
-        base::NotFatalUntil::M130);
+  CHECK(!password_session_duration_metrics_recorder_);
   DCHECK(!msbb_session_metrics_recorder_);
 
   incognito_session_metrics_recorder_ =
diff --git a/chrome/browser/apps/app_service/app_icon/app_icon_reader.cc b/chrome/browser/apps/app_service/app_icon/app_icon_reader.cc
index c25485b..4fa4d62a 100644
--- a/chrome/browser/apps/app_service/app_icon/app_icon_reader.cc
+++ b/chrome/browser/apps/app_service/app_icon/app_icon_reader.cc
@@ -6,7 +6,6 @@
 
 #include "ash/constants/ash_switches.h"
 #include "base/files/file_util.h"
-#include "base/not_fatal_until.h"
 #include "base/task/thread_pool.h"
 #include "base/trace_event/trace_event.h"
 #include "chrome/browser/apps/app_service/app_icon/app_icon_decoder.h"
@@ -88,7 +87,7 @@
 
   auto it = std::ranges::find(decodes_, decoder,
                               &std::unique_ptr<AppIconDecoder>::get);
-  CHECK(it != decodes_.end(), base::NotFatalUntil::M130);
+  CHECK(it != decodes_.end());
   decodes_.erase(it);
 
   if (!iv || iv->icon_type != IconType::kUncompressed ||
diff --git a/chrome/browser/apps/app_service/app_notifications.cc b/chrome/browser/apps/app_service/app_notifications.cc
index 0c9a312..6082b0cf 100644
--- a/chrome/browser/apps/app_service/app_notifications.cc
+++ b/chrome/browser/apps/app_service/app_notifications.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/apps/app_service/app_notifications.h"
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 
 namespace apps {
 
@@ -21,7 +20,7 @@
 
 void AppNotifications::RemoveNotification(const std::string& notification_id) {
   auto it = notification_id_to_app_ids_.find(notification_id);
-  CHECK(it != notification_id_to_app_ids_.end(), base::NotFatalUntil::M130);
+  CHECK(it != notification_id_to_app_ids_.end());
 
   for (const auto& app_id : it->second) {
     auto app_id_it = app_id_to_notification_ids_.find(app_id);
diff --git a/chrome/browser/apps/app_service/app_service_proxy_ash.cc b/chrome/browser/apps/app_service/app_service_proxy_ash.cc
index 791d229a..fc541bb 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_ash.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_ash.cc
@@ -12,7 +12,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/task/task_traits.h"
 #include "chrome/browser/apps/app_service/app_icon/app_icon_factory.h"
@@ -545,7 +544,7 @@
 
   DCHECK(uninstall_dialog);
   auto it = uninstall_dialogs_.find(app_id);
-  CHECK(it != uninstall_dialogs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != uninstall_dialogs_.end());
   uninstall_dialogs_.erase(it);
 }
 
diff --git a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
index 07f2840..6eb88eca 100644
--- a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
+++ b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
@@ -34,7 +34,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/types/expected.h"
@@ -723,7 +722,7 @@
   Profile* profile = nullptr;
   {
     auto found_app = apps_.find(host->GetAppId());
-    CHECK(found_app != apps_.end(), base::NotFatalUntil::M130);
+    CHECK(found_app != apps_.end());
     AppState* app_state = found_app->second.get();
     if (app_state->IsMultiProfile()) {
       // It is possible for `profiles` to be empty if the profile was closed
@@ -1406,7 +1405,7 @@
   const std::string app_id = host->GetAppId();
 
   auto found_app = apps_.find(app_id);
-  CHECK(found_app != apps_.end(), base::NotFatalUntil::M130);
+  CHECK(found_app != apps_.end());
   AppState* app_state = found_app->second.get();
   DCHECK(app_state);
 
@@ -1431,7 +1430,7 @@
   // Erase the ProfileState, which will delete |host|.
   Profile* profile = ProfileForPath(host->GetProfilePath());
   auto found_profile = app_state->profiles.find(profile);
-  CHECK(found_profile != app_state->profiles.end(), base::NotFatalUntil::M130);
+  CHECK(found_profile != app_state->profiles.end());
   ProfileState* profile_state = found_profile->second.get();
   DCHECK_EQ(host, profile_state->single_profile_host.get());
   app_state->profiles.erase(found_profile);
@@ -1462,7 +1461,7 @@
     app_shim_observer_->OnShimReopen(host->GetAppShimPid());
   }
   auto found_app = apps_.find(host->GetAppId());
-  CHECK(found_app != apps_.end(), base::NotFatalUntil::M130);
+  CHECK(found_app != apps_.end());
   AppState* app_state = found_app->second.get();
   LoadAndLaunchAppParams params;
   params.app_id = host->GetAppId();
@@ -1475,7 +1474,7 @@
     AppShimHost* host,
     const std::vector<base::FilePath>& files) {
   auto found_app = apps_.find(host->GetAppId());
-  CHECK(found_app != apps_.end(), base::NotFatalUntil::M130);
+  CHECK(found_app != apps_.end());
   AppState* app_state = found_app->second.get();
   LoadAndLaunchAppParams params;
   params.app_id = host->GetAppId();
@@ -1530,7 +1529,7 @@
 void AppShimManager::OnShimOpenedUrls(AppShimHost* host,
                                       const std::vector<GURL>& urls) {
   auto found_app = apps_.find(host->GetAppId());
-  CHECK(found_app != apps_.end(), base::NotFatalUntil::M130);
+  CHECK(found_app != apps_.end());
   AppState* app_state = found_app->second.get();
   LoadAndLaunchAppParams params;
   params.app_id = host->GetAppId();
@@ -1546,7 +1545,7 @@
 void AppShimManager::OnShimOpenAppWithOverrideUrl(AppShimHost* host,
                                                   const GURL& override_url) {
   auto found_app = apps_.find(host->GetAppId());
-  CHECK(found_app != apps_.end(), base::NotFatalUntil::M130);
+  CHECK(found_app != apps_.end());
   AppState* app_state = found_app->second.get();
   LoadAndLaunchAppParams params;
   params.app_id = host->GetAppId();
@@ -1558,7 +1557,7 @@
 
 void AppShimManager::OnShimWillTerminate(AppShimHost* host) {
   auto found_app = apps_.find(host->GetAppId());
-  CHECK(found_app != apps_.end(), base::NotFatalUntil::M130);
+  CHECK(found_app != apps_.end());
   AppState* app_state = found_app->second.get();
   DCHECK(app_state);
 
diff --git a/chrome/browser/ash/app_list/BUILD.gn b/chrome/browser/ash/app_list/BUILD.gn
index a2201e3..5f43f916 100644
--- a/chrome/browser/ash/app_list/BUILD.gn
+++ b/chrome/browser/ash/app_list/BUILD.gn
@@ -79,7 +79,6 @@
     "//build:branding_buildflags",
     "//chrome/app/theme:chrome_unscaled_resources_grit",
     "//chrome/app/vector_icons",
-    "//chrome/browser:browser_process",
     "//chrome/browser/ash/app_list/search/ranking",
     "//chrome/browser/ash/arc:arc_util",
     "//chrome/browser/search_engines",
diff --git a/chrome/browser/ash/app_list/DEPS b/chrome/browser/ash/app_list/DEPS
index 4b2f72d8..196024b 100644
--- a/chrome/browser/ash/app_list/DEPS
+++ b/chrome/browser/ash/app_list/DEPS
@@ -37,7 +37,6 @@
   "+chrome/browser/autocomplete",
   "+chrome/browser/bitmap_fetcher",
   "+chrome/browser/bookmarks",
-  "+chrome/browser/browser_process.h",
   "+chrome/browser/chromeos/launcher_search",
   "+chrome/browser/extensions/chrome_app_icon.h",
   "+chrome/browser/extensions/context_menu_matcher.h",
@@ -115,14 +114,18 @@
 ]
 
 specific_include_rules = {
-  "app_service_app_item_browsertest\.cc": [
+  "app_service_app_item_browsertest\\.cc": [
     "+ash/app_list/app_list_controller_impl.h",
     "+ash/app_list/app_list_model_provider.h",
     "+ash/app_list/model/app_list_item.h",
     "+ash/shell.h",
   ],
 
-  "app_list_sort_browsertest\.cc": [
+  "app_list_client_impl_browsertest\\.cc": [
+    "+chrome/browser/browser_process.h",
+  ],
+
+  "app_list_sort_browsertest\\.cc": [
     "+ash/app_list/app_list_model_provider.h",
     "+ash/app_list/views/app_list_item_view.h",
     "+ash/app_list/views/app_list_menu_model_adapter.h",
@@ -131,7 +134,7 @@
     "+ash/shell.h",
   ],
 
-  "app_list_syncable_service_unittest\.cc": [
+  "app_list_syncable_service_unittest\\.cc": [
     "+cc/base/math_util.h",
   ],
 }
diff --git a/chrome/browser/ash/app_list/app_list_client_impl.cc b/chrome/browser/ash/app_list/app_list_client_impl.cc
index 22daced5..498b630 100644
--- a/chrome/browser/ash/app_list/app_list_client_impl.cc
+++ b/chrome/browser/ash/app_list/app_list_client_impl.cc
@@ -21,6 +21,7 @@
 #include "ash/public/cpp/new_window_delegate.h"
 #include "ash/shell.h"
 #include "ash/system/federated/federated_service_controller_impl.h"
+#include "base/check_deref.h"
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/location.h"
@@ -44,7 +45,6 @@
 #include "chrome/browser/ash/app_list/search/ranking/launch_data.h"
 #include "chrome/browser/ash/app_list/search/search_controller.h"
 #include "chrome/browser/ash/app_list/search/search_controller_factory.h"
-#include "chrome/browser/browser_process.h"
 #include "chrome/browser/feature_engagement/tracker_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -150,23 +150,21 @@
           account_id));
 }
 
-bool IsPrimaryProfile(Profile* profile) {
-  return user_manager::UserManager::Get()->IsPrimaryUser(
+bool IsPrimaryProfile(user_manager::UserManager& user_manager,
+                      Profile* profile) {
+  return user_manager.IsPrimaryUser(
       ash::BrowserContextHelper::Get()->GetUserByBrowserContext(profile));
 }
 
 }  // namespace
 
-AppListClientImpl::AppListClientImpl()
-    : app_list_controller_(ash::AppListController::Get()) {
-  ProfileManager* profile_manager = g_browser_process->profile_manager();
-  profile_manager_observation_.Observe(profile_manager);
-  for (Profile* profile : profile_manager->GetLoadedProfiles()) {
-    OnProfileAdded(profile);
-  }
+AppListClientImpl::AppListClientImpl(user_manager::UserManager* user_manager)
+    : user_manager_(CHECK_DEREF(user_manager)),
+      app_list_controller_(ash::AppListController::Get()) {
+  user_manager_observation_.Observe(user_manager);
 
   app_list_controller_->SetClient(this);
-  user_manager::UserManager::Get()->AddSessionStateObserver(this);
+  user_manager->AddSessionStateObserver(this);
   session_manager::SessionManager::Get()->AddObserver(this);
 
   DCHECK(!g_app_list_client_instance);
@@ -179,8 +177,7 @@
 AppListClientImpl::~AppListClientImpl() {
   SetProfile(nullptr);
 
-  auto* user_manager = user_manager::UserManager::Get();
-  user_manager->RemoveSessionStateObserver(this);
+  user_manager_->RemoveSessionStateObserver(this);
 
   session_manager::SessionManager::Get()->RemoveObserver(this);
 
@@ -423,7 +420,8 @@
 void AppListClientImpl::MaybeRecalculateAppsGridDefaultOrder() {
   // Do not attempt to calculate the experimental arm if the active
   // profile is not the primary profile.
-  if (!IsPrimaryProfile(ProfileManager::GetActiveUserProfile())) {
+  if (!IsPrimaryProfile(user_manager_.get(),
+                        ProfileManager::GetActiveUserProfile())) {
     return;
   }
 
@@ -478,7 +476,7 @@
     const std::map<std::string, int>& values) {}
 
 void AppListClientImpl::ActiveUserChanged(user_manager::User* active_user) {
-  if (user_manager::UserManager::Get()->IsCurrentUserNew()) {
+  if (user_manager_->IsCurrentUserNew()) {
     // In tests, the user before switching and the one after switching may
     // be both new. It should not happen in the real world.
     state_for_new_user_ = StateForNewUser();
@@ -588,8 +586,7 @@
 void AppListClientImpl::OnSessionStateChanged() {
   TRACE_EVENT0("ui", "AppListClientImpl::OnSessionStateChanged");
   // Return early if the current user is not new or the session is not active.
-  if (!user_manager::UserManager::Get()->IsCurrentUserNew() ||
-      !IsSessionActive()) {
+  if (!user_manager_->IsCurrentUserNew() || !IsSessionActive()) {
     return;
   }
 
@@ -687,16 +684,19 @@
   Navigate(&params);
 }
 
-void AppListClientImpl::OnProfileAdded(Profile* profile) {
+void AppListClientImpl::OnUserProfileCreated(const user_manager::User& user) {
   // NOTE: Apps Collections in Ash is currently only supported for the primary
   // user profile. This is a self-imposed restriction.
-  if (!IsPrimaryProfile(profile)) {
+  if (!user_manager_->IsPrimaryUser(&user)) {
     return;
   }
 
   // Since we only currently support the primary user profile, we can stop
-  // observing the profile manager once it has been added.
-  profile_manager_observation_.Reset();
+  // observing the user manager once it has been created.
+  user_manager_observation_.Reset();
+
+  Profile* profile = Profile::FromBrowserContext(
+      ash::BrowserContextHelper::Get()->GetBrowserContextByUser(&user));
 
   // Cache whether the user associated with the primary profile is considered
   // new, based on whether the first app list sync in the session was the first
@@ -718,10 +718,6 @@
   survey_handler_ = std::make_unique<app_list::AppListSurveyHandler>(profile);
 }
 
-void AppListClientImpl::OnProfileManagerDestroying() {
-  profile_manager_observation_.Reset();
-}
-
 ash::AppListNotifier* AppListClientImpl::GetNotifier() {
   return app_list_notifier_.get();
 }
@@ -833,7 +829,7 @@
   // new anymore.
   // TODO(crbug.com/40767698): If this bug is fixed, we might need to
   // do some changes here.
-  if (!user_manager::UserManager::Get()->IsCurrentUserNew()) {
+  if (!user_manager_->IsCurrentUserNew()) {
     DCHECK(!state_for_new_user_);
     return;
   }
@@ -937,7 +933,7 @@
       launched_from == ash::AppListLaunchedFrom::kLaunchedFromDiscoveryChip);
 
   // Return early if the current user is not new.
-  if (!user_manager::UserManager::Get()->IsCurrentUserNew()) {
+  if (!user_manager_->IsCurrentUserNew()) {
     DCHECK(!state_for_new_user_);
     return;
   }
@@ -1042,9 +1038,7 @@
   }
 
   // Assistant new entry point is supported only for a primary profile.
-  bool is_primary_profile = user_manager::UserManager::Get()->IsPrimaryUser(
-      ash::BrowserContextHelper::Get()->GetUserByBrowserContext(profile_));
-  if (!is_primary_profile) {
+  if (!IsPrimaryProfile(user_manager_.get(), profile_.get())) {
     return nullptr;
   }
 
@@ -1056,7 +1050,7 @@
   // NOTE: Apps Collections in Ash is currently only supported for the primary
   // user profile. This is a self-imposed restriction but may happen in tests.
   auto* const profile = GetProfile(account_id);
-  if (!IsPrimaryProfile(profile)) {
+  if (!IsPrimaryProfile(user_manager_.get(), profile)) {
     return false;
   }
   return is_primary_profile_new_user_;
diff --git a/chrome/browser/ash/app_list/app_list_client_impl.h b/chrome/browser/ash/app_list/app_list_client_impl.h
index ee4f1c8d..e316d3d 100644
--- a/chrome/browser/ash/app_list/app_list_client_impl.h
+++ b/chrome/browser/ash/app_list/app_list_client_impl.h
@@ -19,11 +19,11 @@
 #include "ash/public/cpp/app_list/app_list_metrics.h"
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
+#include "base/memory/raw_ref.h"
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observation.h"
 #include "base/time/time.h"
 #include "chrome/browser/ash/app_list/app_list_controller_delegate.h"
-#include "chrome/browser/profiles/profile_manager_observer.h"
 #include "chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h"
 #include "components/feature_engagement/public/tracker.h"
 #include "components/search_engines/template_url_service.h"
@@ -33,8 +33,6 @@
 #include "ui/base/models/image_model.h"
 #include "ui/display/types/display_constants.h"
 
-class ProfileManager;
-
 namespace app_list {
 class AppListSurveyHandler;
 class SearchController;
@@ -49,10 +47,10 @@
 class AppListClientImpl
     : public ash::AppListClient,
       public AppListControllerDelegate,
+      public user_manager::UserManager::Observer,
       public user_manager::UserManager::UserSessionStateObserver,
       public session_manager::SessionManagerObserver,
-      public TemplateURLServiceObserver,
-      public ProfileManagerObserver {
+      public TemplateURLServiceObserver {
  public:
   // Indicates the launcher usage state during the session started by a new user
   // (i.e. the session completing the OOBE flow) but before any account
@@ -75,7 +73,8 @@
     kMaxValue = kNotUsedBeforeSwitchingAccounts,
   };
 
-  AppListClientImpl();
+  // `user_manage` must be non-null and must outlive `this`.
+  explicit AppListClientImpl(user_manager::UserManager* user_manager);
   AppListClientImpl(const AppListClientImpl&) = delete;
   AppListClientImpl& operator=(const AppListClientImpl&) = delete;
   ~AppListClientImpl() override;
@@ -131,6 +130,9 @@
   std::optional<std::string> GetAssistantNewEntryPointName() override;
   ui::ImageModel GetGeminiIcon() override;
 
+  // user_manager::UserManager::Observer:
+  void OnUserProfileCreated(const user_manager::User& user) override;
+
   // user_manager::UserManager::UserSessionStateObserver:
   void ActiveUserChanged(user_manager::User* active_user) override;
 
@@ -150,10 +152,6 @@
                ui::PageTransition transition,
                WindowOpenDisposition disposition) override;
 
-  // ProfileManagerObserver:
-  void OnProfileAdded(Profile* profile) override;
-  void OnProfileManagerDestroying() override;
-
   // Associates this client with the current active user, called when this
   // client is accessed or active user is changed.
   void UpdateProfile();
@@ -249,6 +247,8 @@
   ash::assistant::AssistantBrowserDelegate*
   GetAssistantBrowserDelegateForNewEntryPoint();
 
+  const raw_ref<user_manager::UserManager> user_manager_;
+
   // Unowned pointer to the associated profile. May change if SetProfile is
   // called.
   raw_ptr<Profile> profile_ = nullptr;
@@ -300,10 +300,9 @@
 
   std::unique_ptr<app_list::AppListSurveyHandler> survey_handler_;
 
-  // The profile manager is observed in order to ensure that the AppList has the
-  // necessary dependencies to identify new users.
-  base::ScopedObservation<ProfileManager, ProfileManagerObserver>
-      profile_manager_observation_{this};
+  base::ScopedObservation<user_manager::UserManager,
+                          user_manager::UserManager::Observer>
+      user_manager_observation_{this};
 
   base::WeakPtrFactory<AppListClientImpl> weak_ptr_factory_{this};
 };
diff --git a/chrome/browser/ash/app_list/app_list_client_impl_browsertest.cc b/chrome/browser/ash/app_list/app_list_client_impl_browsertest.cc
index 008ae61a..db50a20 100644
--- a/chrome/browser/ash/app_list/app_list_client_impl_browsertest.cc
+++ b/chrome/browser/ash/app_list/app_list_client_impl_browsertest.cc
@@ -1284,10 +1284,6 @@
 
   void SetUpOnMainThread() override {
     SetUpEnvironment();
-    // Inject the testing profile into the client, since once a user session was
-    // created, with one browser, the client stops observing the profile
-    // manager.
-    AppListClientImpl::GetInstance()->OnProfileAdded(profile_);
     InProcessBrowserTest::SetUpOnMainThread();
   }
 
diff --git a/chrome/browser/ash/app_list/arc/BUILD.gn b/chrome/browser/ash/app_list/arc/BUILD.gn
index db4055e..d49f2c3f 100644
--- a/chrome/browser/ash/app_list/arc/BUILD.gn
+++ b/chrome/browser/ash/app_list/arc/BUILD.gn
@@ -65,7 +65,6 @@
     "//ash/constants",
     "//base",
     "//chrome/app:generated_resources",
-    "//chrome/browser:browser_process",
     "//chrome/browser/ash/app_list",
     "//chrome/browser/ash/app_list/search/ranking",
     "//chrome/browser/ash/arc:arc_util",
@@ -82,6 +81,7 @@
     "//chromeos/ash/experiences/arc/session",
     "//chromeos/ash/experiences/arc/session:connection_holder",
     "//components/app_restore",
+    "//components/application_locale_storage",
     "//components/crx_file",
     "//components/keyed_service/core",
     "//components/language/core/browser",
diff --git a/chrome/browser/ash/app_list/arc/DEPS b/chrome/browser/ash/app_list/arc/DEPS
index 77ca8953..e2196b6d 100644
--- a/chrome/browser/ash/app_list/arc/DEPS
+++ b/chrome/browser/ash/app_list/arc/DEPS
@@ -19,7 +19,6 @@
   "+chrome/browser/ash/arc",
   "+chrome/browser/ash/login",
   "+chrome/browser/ash/profiles",
-  "+chrome/browser/browser_process.h",
   "+chrome/browser/extensions/extension_service.h",
   "+chrome/browser/extensions/extension_service_test_base.h",
   "+chrome/browser/image_decoder",
diff --git a/chrome/browser/ash/app_list/arc/arc_app_utils.cc b/chrome/browser/ash/app_list/arc/arc_app_utils.cc
index 58863d2..5547e2dc 100644
--- a/chrome/browser/ash/app_list/arc/arc_app_utils.cc
+++ b/chrome/browser/ash/app_list/arc/arc_app_utils.cc
@@ -34,7 +34,6 @@
 #include "chrome/browser/ash/arc/window_predictor/window_predictor.h"
 #include "chrome/browser/ash/arc/window_predictor/window_predictor_utils.h"
 #include "chrome/browser/ash/login/login_pref_names.h"
-#include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_observer.h"
 #include "chrome/browser/ui/ash/shelf/arc_app_shelf_id.h"
@@ -53,6 +52,7 @@
 #include "chromeos/ash/experiences/arc/session/arc_service_manager.h"
 #include "components/app_restore/app_restore_utils.h"
 #include "components/app_restore/features.h"
+#include "components/application_locale_storage/application_locale_storage.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/services/app_service/public/cpp/intent_util.h"
@@ -603,16 +603,17 @@
   return arc_prefs->IsRegistered(arc_app_shelf_id.app_id());
 }
 
-void GetLocaleAndPreferredLanguages(const Profile* profile,
-                                    std::string* out_locale,
-                                    std::string* out_preferred_languages) {
+void GetLocaleAndPreferredLanguages(
+    const ApplicationLocaleStorage& application_locale_storage,
+    const Profile* profile,
+    std::string* out_locale,
+    std::string* out_preferred_languages) {
   const PrefService::Preference* locale_pref =
       profile->GetPrefs()->FindPreference(
           ::language::prefs::kApplicationLocale);
   DCHECK(locale_pref);
   const std::string& locale = locale_pref->GetValue()->GetString();
-  *out_locale =
-      locale.empty() ? g_browser_process->GetApplicationLocale() : locale;
+  *out_locale = locale.empty() ? application_locale_storage.Get() : locale;
 
   // |preferredLanguages| consists of comma separated locale strings. It may be
   // empty or contain empty items, but those are ignored on ARC.  If an item
diff --git a/chrome/browser/ash/app_list/arc/arc_app_utils.h b/chrome/browser/ash/app_list/arc/arc_app_utils.h
index 0a60e83..c1a7a28 100644
--- a/chrome/browser/ash/app_list/arc/arc_app_utils.h
+++ b/chrome/browser/ash/app_list/arc/arc_app_utils.h
@@ -17,6 +17,7 @@
 #include "chromeos/ash/experiences/arc/mojom/app.mojom-forward.h"
 #include "components/services/app_service/public/cpp/intent.h"
 
+class ApplicationLocaleStorage;
 class Profile;
 
 namespace content {
@@ -101,9 +102,11 @@
 
 // Returns current active locale and list of preferred languages for the given
 // |profile|.
-void GetLocaleAndPreferredLanguages(const Profile* profle,
-                                    std::string* out_locale,
-                                    std::string* out_preferred_languages);
+void GetLocaleAndPreferredLanguages(
+    const ApplicationLocaleStorage& application_locale_storage,
+    const Profile* profle,
+    std::string* out_locale,
+    std::string* out_preferred_languages);
 
 // Returns Android instance id. Result is returned in callback. |ok| is set to
 // true in case app instance is ready and Android id was successfully requested.
diff --git a/chrome/browser/ash/arc/fileapi/arc_file_system_bridge.cc b/chrome/browser/ash/arc/fileapi/arc_file_system_bridge.cc
index 048d2ae..9bc593c 100644
--- a/chrome/browser/ash/arc/fileapi/arc_file_system_bridge.cc
+++ b/chrome/browser/ash/arc/fileapi/arc_file_system_bridge.cc
@@ -15,7 +15,6 @@
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "base/memory/singleton.h"
-#include "base/not_fatal_until.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/escape.h"
 #include "base/system/sys_info.h"
@@ -447,7 +446,7 @@
 void ArcFileSystemBridge::CreateMoniker(const GURL& content_uri,
                                         bool read_only,
                                         CreateMonikerCallback callback) {
-  CHECK_CURRENTLY_ON(content::BrowserThread::UI, base::NotFatalUntil::M132);
+  CHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   const GURL url_decoded = DecodeFromChromeContentProviderUrl(content_uri);
   if (url_decoded.is_empty() || !IsUrlAllowed(url_decoded)) {
@@ -526,7 +525,7 @@
 
 void ArcFileSystemBridge::DestroyMoniker(const fusebox::Moniker& moniker,
                                          DestroyMonikerCallback callback) {
-  CHECK_CURRENTLY_ON(content::BrowserThread::UI, base::NotFatalUntil::M132);
+  CHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   const auto iter = shared_monikers_.find(moniker);
   if (iter == shared_monikers_.end()) {
diff --git a/chrome/browser/ash/arc/intent_helper/BUILD.gn b/chrome/browser/ash/arc/intent_helper/BUILD.gn
index d2ef892..c7ea9eaa 100644
--- a/chrome/browser/ash/arc/intent_helper/BUILD.gn
+++ b/chrome/browser/ash/arc/intent_helper/BUILD.gn
@@ -28,6 +28,7 @@
     "//ash/constants",
     "//base",
     "//chrome/browser:browser_process",
+    "//chrome/browser:global_features",
     "//chrome/browser/apps/app_service/app_icon",
     "//chrome/browser/ash/app_list/arc",
     "//chrome/browser/ash/arc:arc_util",
diff --git a/chrome/browser/ash/arc/intent_helper/DEPS b/chrome/browser/ash/arc/intent_helper/DEPS
index fe2d189..0c2ed95 100644
--- a/chrome/browser/ash/arc/intent_helper/DEPS
+++ b/chrome/browser/ash/arc/intent_helper/DEPS
@@ -21,6 +21,7 @@
   "+chrome/browser/ash/settings",
   "+chrome/browser/ash/system",
   "+chrome/browser/browser_process.h",
+  "+chrome/browser/global_features.h",
   "+chrome/browser/profiles",
   "+chrome/browser/ui/browser.h",
   "+chrome/browser/ui/browser_list.h",
diff --git a/chrome/browser/ash/arc/intent_helper/arc_settings_service.cc b/chrome/browser/ash/arc/intent_helper/arc_settings_service.cc
index 75af5bc..d793e83 100644
--- a/chrome/browser/ash/arc/intent_helper/arc_settings_service.cc
+++ b/chrome/browser/ash/arc/intent_helper/arc_settings_service.cc
@@ -10,6 +10,7 @@
 #include "ash/constants/ash_features.h"
 #include "ash/constants/ash_pref_names.h"
 #include "ash/system/privacy_hub/privacy_hub_controller.h"
+#include "base/check_deref.h"
 #include "base/command_line.h"
 #include "base/functional/bind.h"
 #include "base/gtest_prod_util.h"
@@ -30,6 +31,7 @@
 #include "chrome/browser/ash/settings/stats_reporting_controller.h"
 #include "chrome/browser/ash/system/timezone_resolver_manager.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/global_features.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profiles_state.h"
 #include "chrome/common/pref_names.h"
@@ -696,13 +698,19 @@
     return;
   }
 
+  // TODO(crbug.com/404130092): Remove g_browser_process usage.
+  const ApplicationLocaleStorage& application_locale_storage = CHECK_DEREF(
+      g_browser_process->GetFeatures()->application_locale_storage());
+
   std::string locale;
   std::string preferred_languages;
-  base::Value::Dict extras;
   // Chrome OS locale may contain only the language part (e.g. fr) but country
   // code (e.g. fr_FR).  Since Android expects locale to contain country code,
   // ARC will derive a likely locale with country code from such
-  GetLocaleAndPreferredLanguages(profile_, &locale, &preferred_languages);
+  GetLocaleAndPreferredLanguages(application_locale_storage, profile_, &locale,
+                                 &preferred_languages);
+
+  base::Value::Dict extras;
   extras.Set("locale", locale);
   extras.Set("preferredLanguages", preferred_languages);
   SendSettingsBroadcast("org.chromium.arc.intent_helper.SET_LOCALE", extras);
diff --git a/chrome/browser/ash/arc/session/BUILD.gn b/chrome/browser/ash/arc/session/BUILD.gn
index f3f9cb4b..dbd4919 100644
--- a/chrome/browser/ash/arc/session/BUILD.gn
+++ b/chrome/browser/ash/arc/session/BUILD.gn
@@ -42,6 +42,7 @@
     "//base",
     "//chrome/app/vector_icons",
     "//chrome/browser:browser_process",
+    "//chrome/browser:global_features",
     "//chrome/browser/ash/app_list/arc",
     "//chrome/browser/ash/apps",
     "//chrome/browser/ash/arc:arc_util",
diff --git a/chrome/browser/ash/arc/session/DEPS b/chrome/browser/ash/arc/session/DEPS
index fa864be8..f226000 100644
--- a/chrome/browser/ash/arc/session/DEPS
+++ b/chrome/browser/ash/arc/session/DEPS
@@ -34,6 +34,7 @@
   "+chrome/browser/consent_auditor",
   "+chrome/browser/extensions/api/tabs",
   "+chrome/browser/extensions/extension_tab_util.h",
+  "+chrome/browser/global_features.h",
   "+chrome/browser/lifetime",
   "+chrome/browser/net",
   "+chrome/browser/notifications",
diff --git a/chrome/browser/ash/arc/session/arc_session_manager.cc b/chrome/browser/ash/arc/session/arc_session_manager.cc
index ae897f3..55c9eda 100644
--- a/chrome/browser/ash/arc/session/arc_session_manager.cc
+++ b/chrome/browser/ash/arc/session/arc_session_manager.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "ash/constants/ash_switches.h"
+#include "base/check_deref.h"
 #include "base/command_line.h"
 #include "base/debug/dump_without_crashing.h"
 #include "base/feature_list.h"
@@ -46,6 +47,7 @@
 #include "chrome/browser/ash/login/demo_mode/demo_session.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/global_features.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/profiles/profile.h"
@@ -1636,7 +1638,11 @@
     VLOG(1) << "Locale and preferred languages are fixed to " << locale << ","
             << preferred_languages << ".";
   } else {
-    GetLocaleAndPreferredLanguages(profile_, &locale, &preferred_languages);
+    // TODO(crbug.com/404130092): Remove g_browser_process usage.
+    const ApplicationLocaleStorage& application_locale_storage = CHECK_DEREF(
+        g_browser_process->GetFeatures()->application_locale_storage());
+    GetLocaleAndPreferredLanguages(application_locale_storage, profile_,
+                                   &locale, &preferred_languages);
   }
 
   DCHECK(arc_session_runner_);
diff --git a/chrome/browser/ash/login/demo_mode/demo_login_controller.cc b/chrome/browser/ash/login/demo_mode/demo_login_controller.cc
index 6279900..d10e0f6c 100644
--- a/chrome/browser/ash/login/demo_mode/demo_login_controller.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_login_controller.cc
@@ -17,6 +17,9 @@
 #include "base/json/json_writer.h"
 #include "base/logging.h"
 #include "base/strings/stringprintf.h"
+#include "base/syslog_logging.h"
+#include "base/task/single_thread_task_runner.h"
+#include "base/time/time.h"
 #include "base/uuid.h"
 #include "base/values.h"
 #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h"
@@ -78,6 +81,8 @@
 const char kErrorMessagePath[] = "error.message";
 const char kErrorStatusPath[] = "error.status";
 
+constexpr base::TimeDelta kConnectPolicyManagerTimeout = base::Seconds(5);
+
 // Server may return a 200 for setup demo account request with Quota exhuasted
 // error. Sample response:
 //  {
@@ -362,6 +367,14 @@
   // connected.
   if (!is_policy_manager_connected_) {
     observation_.Observe(cloud_policy_manager);
+
+    // `DemoLoginController::OnDeviceCloudPolicyManagerConnected` might not be
+    // triggered if there is a network issue.
+    base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
+        FROM_HERE,
+        base::BindOnce(&DemoLoginController::OnPolicyManagerConnectionTimeOut,
+                       weak_ptr_factory_.GetWeakPtr()),
+        kConnectPolicyManagerTimeout);
   }
 
   is_feature_eligiblity_loaded_ = features::IsDemoModeSignInEnabled();
@@ -736,16 +749,36 @@
 
 void DemoLoginController::MaybeTriggerAutoLogin() {
   CHECK_EQ(State::kLoadingAvailibility, state_);
+
+  bool is_policy_manager_loading_finished =
+      is_policy_manager_connected_ || is_loading_policy_manager_timeout_;
   bool is_loading_finished =
-      is_policy_manager_connected_ && is_feature_eligiblity_loaded_;
+      is_policy_manager_loading_finished && is_feature_eligiblity_loaded_;
+
   if (!is_loading_finished) {
     return;
   }
+
   bool is_sign_in_enable = demo_mode::IsDemoAccountSignInEnabled();
-  state_ = is_sign_in_enable ? State::kReadyForLoginWithDemoAccount
-                             : State::kLoginToMGS;
+  state_ = is_sign_in_enable && is_policy_manager_connected_
+               ? State::kReadyForLoginWithDemoAccount
+               : State::kLoginToMGS;
 
   configure_auto_login_callback_.Run();
 }
 
+void DemoLoginController::OnPolicyManagerConnectionTimeOut() {
+  if (is_policy_manager_connected_) {
+    return;
+  }
+
+  is_loading_policy_manager_timeout_ = true;
+  observation_.Reset();
+
+  DemoSessionMetricsRecorder::RecordCloudPolicyConnectionTimeout();
+  SYSLOG(INFO) << "Timeout for waiting cloud policy manager connected. Login "
+                  "to managed guest session.";
+  MaybeTriggerAutoLogin();
+}
+
 }  // namespace ash
diff --git a/chrome/browser/ash/login/demo_mode/demo_login_controller.h b/chrome/browser/ash/login/demo_mode/demo_login_controller.h
index 1a0e0fd..21b94303 100644
--- a/chrome/browser/ash/login/demo_mode/demo_login_controller.h
+++ b/chrome/browser/ash/login/demo_mode/demo_login_controller.h
@@ -111,6 +111,9 @@
   // auto login.
   void MaybeTriggerAutoLogin();
 
+  // Called on 5th second for waiting policy manager connection.
+  void OnPolicyManagerConnectionTimeOut();
+
   // We only allow 1 demo account request at a time.
   std::unique_ptr<network::SimpleURLLoader> url_loader_;
 
@@ -124,6 +127,9 @@
   bool is_policy_manager_connected_ = false;
   bool is_feature_eligiblity_loaded_ = false;
 
+  // If true, the cloud policy connection is not available. Fallback to MGS.
+  bool is_loading_policy_manager_timeout_ = false;
+
   RequestCallback setup_request_callback_for_testing_;
   RequestCallback cleanup_request_callback_for_testing_;
 
diff --git a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc
index ff455c13..9ca69b0 100644
--- a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc
+++ b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service.cc
@@ -12,7 +12,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/field_trial_params.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h"
 #include "chrome/browser/image_decoder/image_decoder.h"
@@ -250,7 +249,7 @@
       break;
   }
   // RemoveFetcher should always result in removal.
-  CHECK(it != active_fetchers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != active_fetchers_.end());
   active_fetchers_.erase(it);
 }
 
diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.cc b/chrome/browser/bookmarks/android/bookmark_bridge.cc
index 802f40c..f9eb022 100644
--- a/chrome/browser/bookmarks/android/bookmark_bridge.cc
+++ b/chrome/browser/bookmarks/android/bookmark_bridge.cc
@@ -32,7 +32,6 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/strcat.h"
@@ -1768,10 +1767,9 @@
   // iterate through array, adding the BookmarkNode*s of the objects
   for (int i = 0; i < arraySize; ++i) {
     const BookmarkNode* child_node = GetNodeByID(elements[i], bookmark_type);
-    CHECK(child_node->parent() == parent_node, base::NotFatalUntil::M135);
-    CHECK(
-        base::checked_cast<jsize>(parent_node->children().size()) == arraySize,
-        base::NotFatalUntil::M135);
+    CHECK(child_node->parent() == parent_node);
+    CHECK(base::checked_cast<jsize>(parent_node->children().size()) ==
+          arraySize);
     ordered_nodes.push_back(GetNodeByID(elements[i], 0));
   }
 
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index e856d9c..0df921e 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -3672,7 +3672,20 @@
     content::BrowserContext* browser_context) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   Profile* profile = Profile::FromBrowserContext(browser_context);
-  return profile->GetPrefs()->GetBoolean(prefs::kPrefetchWithServiceWorkerEnabled);
+  return profile->GetPrefs()->GetBoolean(
+      prefs::kPrefetchWithServiceWorkerEnabled);
+}
+
+bool ChromeContentBrowserClient::IsServiceWorkerSyntheticResponseAllowed(
+    content::BrowserContext* browser_context,
+    const GURL& url) {
+  Profile* profile = Profile::FromBrowserContext(browser_context);
+  if (!profile || profile->IsSystemProfile()) {
+    // Exclude if the profile is a system profile.
+    return false;
+  }
+
+  return IsDefaultSearchEngine(profile, url);
 }
 
 void ChromeContentBrowserClient::GrantCookieAccessDueToHeuristic(
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index f29c2ed2..d7c76db 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -444,6 +444,9 @@
       net::CookieSettingOverrides overrides) override;
   bool IsPrefetchWithServiceWorkerAllowed(
       content::BrowserContext* browser_context) override;
+  bool IsServiceWorkerSyntheticResponseAllowed(
+      content::BrowserContext* browser_context,
+      const GURL& url) override;
   void GrantCookieAccessDueToHeuristic(content::BrowserContext* browser_context,
                                        const net::SchemefulSite& top_frame_site,
                                        const net::SchemefulSite& accessing_site,
diff --git a/chrome/browser/chrome_content_browser_client_unittest.cc b/chrome/browser/chrome_content_browser_client_unittest.cc
index 96855bb1..3955b1a 100644
--- a/chrome/browser/chrome_content_browser_client_unittest.cc
+++ b/chrome/browser/chrome_content_browser_client_unittest.cc
@@ -472,6 +472,39 @@
   ASSERT_TRUE(future.Wait());
   EXPECT_FALSE(future.Get().has_value());
 }
+
+// TODO(crbug.com/352578800): Move this from
+// `ChromeContentBrowserClientWindowTest` to run the test on Android.
+TEST_F(ChromeContentBrowserClientWindowTest,
+       IsServiceWorkerSyntheticResponseAllowed) {
+  ChromeContentBrowserClient browser_client;
+
+  // Update the default search engine.
+  TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
+      profile(),
+      base::BindRepeating(&TemplateURLServiceFactory::BuildInstanceFor));
+  TemplateURLService* template_url_service =
+      TemplateURLServiceFactory::GetForProfile(browser()->profile());
+  search_test_utils::WaitForTemplateURLServiceToLoad(template_url_service);
+  TemplateURLData data;
+  data.SetShortName(u"example.com");
+  data.SetURL("http://example.com/test?q={searchTerms}");
+  data.new_tab_url = chrome::kChromeUINewTabURL;
+  TemplateURL* template_url =
+      template_url_service->Add(std::make_unique<TemplateURL>(data));
+  template_url_service->SetUserSelectedDefaultSearchProvider(template_url);
+
+  EXPECT_FALSE(browser_client.IsServiceWorkerSyntheticResponseAllowed(
+      browser()->profile(), GURL("https://foo.com/test")));
+  EXPECT_FALSE(browser_client.IsServiceWorkerSyntheticResponseAllowed(
+      browser()->profile(), GURL("https://example.com/")));
+  EXPECT_FALSE(browser_client.IsServiceWorkerSyntheticResponseAllowed(
+      browser()->profile(), GURL("https://example.com/test")));
+  EXPECT_FALSE(browser_client.IsServiceWorkerSyntheticResponseAllowed(
+      browser()->profile(), GURL("https://example.com/test?q=")));
+  EXPECT_TRUE(browser_client.IsServiceWorkerSyntheticResponseAllowed(
+      browser()->profile(), GURL("https://example.com/test?q=test")));
+}
 #endif  // !BUILDFLAG(IS_ANDROID)
 
 // NOTE: Any updates to the expectations in these tests should also be done in
diff --git a/chrome/browser/chromeos/arc/arc_external_protocol_dialog.cc b/chrome/browser/chromeos/arc/arc_external_protocol_dialog.cc
index 4f0557e..cb514d0 100644
--- a/chrome/browser/chromeos/arc/arc_external_protocol_dialog.cc
+++ b/chrome/browser/chromeos/arc/arc_external_protocol_dialog.cc
@@ -10,7 +10,6 @@
 #include "base/functional/bind.h"
 #include "base/memory/ref_counted.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "chrome/app/vector_icons/vector_icons.h"
 #include "chrome/browser/apps/link_capturing/link_capturing_navigation_throttle.h"
 #include "chrome/browser/apps/link_capturing/metrics/intent_handling_metrics.h"
@@ -378,7 +377,7 @@
 
   const auto it =
       std::ranges::find(devices, device_guid, &SharingTargetDeviceInfo::guid);
-  CHECK(it != devices.end(), base::NotFatalUntil::M130);
+  CHECK(it != devices.end());
   const SharingTargetDeviceInfo& device = *it;
 
   ClickToCallUiController::GetOrCreateFromWebContents(web_contents)
diff --git a/chrome/browser/component_updater/third_party_module_list_component_installer_win.cc b/chrome/browser/component_updater/third_party_module_list_component_installer_win.cc
index 0b0622e..5d52133 100644
--- a/chrome/browser/component_updater/third_party_module_list_component_installer_win.cc
+++ b/chrome/browser/component_updater/third_party_module_list_component_installer_win.cc
@@ -12,7 +12,6 @@
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
-#include "base/not_fatal_until.h"
 #include "base/values.h"
 #include "base/version.h"
 #include "chrome/browser/win/conflicts/module_blocklist_cache_util.h"
@@ -36,7 +35,7 @@
 
   auto components = component_update_service->GetComponents();
   auto iter = std::ranges::find(components, kComponentId, &ComponentInfo::id);
-  CHECK(iter != components.end(), base::NotFatalUntil::M130);
+  CHECK(iter != components.end());
 
   return iter->version;
 }
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
index f61d3618..15a0b7e 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -10,7 +10,6 @@
 #include "base/command_line.h"
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/strcat.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
@@ -386,7 +385,7 @@
     auto it1 = remote_locations.begin();
     auto it2 = remote_locations_.begin();
     while (it1 != remote_locations.end()) {
-      CHECK(it2 != remote_locations_.end(), base::NotFatalUntil::M130);
+      CHECK(it2 != remote_locations_.end());
       if (!(*it1).Equals(*it2))
         equals = false;
       ++it1;
diff --git a/chrome/browser/devtools/device/devtools_android_bridge.cc b/chrome/browser/devtools/device/devtools_android_bridge.cc
index 6dd14a47..87450e1 100644
--- a/chrome/browser/devtools/device/devtools_android_bridge.cc
+++ b/chrome/browser/devtools/device/devtools_android_bridge.cc
@@ -21,7 +21,6 @@
 #include "base/json/json_reader.h"
 #include "base/lazy_instance.h"
 #include "base/memory/singleton.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/escape.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
@@ -199,7 +198,7 @@
     DeviceListListener* listener) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   auto it = std::ranges::find(device_list_listeners_, listener);
-  CHECK(it != device_list_listeners_.end(), base::NotFatalUntil::M130);
+  CHECK(it != device_list_listeners_.end());
   device_list_listeners_.erase(it);
   if (!NeedsDeviceListPolling())
     StopDeviceListPolling();
@@ -216,7 +215,7 @@
     DeviceCountListener* listener) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   auto it = std::ranges::find(device_count_listeners_, listener);
-  CHECK(it != device_count_listeners_.end(), base::NotFatalUntil::M130);
+  CHECK(it != device_count_listeners_.end());
   device_count_listeners_.erase(it);
   if (device_count_listeners_.empty())
     StopDeviceCountPolling();
@@ -233,7 +232,7 @@
 void DevToolsAndroidBridge::RemovePortForwardingListener(
     PortForwardingListener* listener) {
   auto it = std::ranges::find(port_forwarding_listeners_, listener);
-  CHECK(it != port_forwarding_listeners_.end(), base::NotFatalUntil::M130);
+  CHECK(it != port_forwarding_listeners_.end());
   port_forwarding_listeners_.erase(it);
   if (!NeedsDeviceListPolling())
     StopDeviceListPolling();
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc
index 533c3a7..7e84b9b 100644
--- a/chrome/browser/devtools/devtools_ui_bindings.cc
+++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -25,7 +25,6 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/escape.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
@@ -806,7 +805,7 @@
   DevToolsUIBindingsList& instances =
       DevToolsUIBindings::GetDevToolsUIBindings();
   auto it = std::ranges::find(instances, this);
-  CHECK(it != instances.end(), base::NotFatalUntil::M130);
+  CHECK(it != instances.end());
   instances.erase(it);
 }
 
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc
index 6308551..e8fda70 100644
--- a/chrome/browser/devtools/devtools_window.cc
+++ b/chrome/browser/devtools/devtools_window.cc
@@ -19,7 +19,6 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/escape.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/sequenced_task_runner.h"
@@ -501,7 +500,7 @@
 
   DevToolsWindows* instances = g_devtools_window_instances.Pointer();
   auto it = std::ranges::find(*instances, this);
-  CHECK(it != instances->end(), base::NotFatalUntil::M130);
+  CHECK(it != instances->end());
   instances->erase(it);
 
   if (!close_callback_.is_null()) {
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index 3fedb04c..7d2a749 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -20,7 +20,6 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/path_service.h"
 #include "base/rand_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -1847,7 +1846,7 @@
 
   {
     auto iter = running_crx_installs_.find(token);
-    CHECK(iter != running_crx_installs_.end(), base::NotFatalUntil::M130);
+    CHECK(iter != running_crx_installs_.end());
     installer = iter->second;
     running_crx_installs_.erase(iter);
   }
diff --git a/chrome/browser/download/download_history.cc b/chrome/browser/download/download_history.cc
index 093b19d..df78f00b 100644
--- a/chrome/browser/download/download_history.cc
+++ b/chrome/browser/download/download_history.cc
@@ -35,7 +35,6 @@
 
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "build/build_config.h"
 #include "chrome/browser/download/download_crx_util.h"
@@ -278,7 +277,7 @@
   if (file_path.empty())
     return false;
   auto iter = file_path_count->find(file_path);
-  CHECK(iter != file_path_count->end(), base::NotFatalUntil::M130);
+  CHECK(iter != file_path_count->end());
   --iter->second;
   if (iter->second < 1)
     return false;
diff --git a/chrome/browser/download/notification/multi_profile_download_notifier.cc b/chrome/browser/download/notification/multi_profile_download_notifier.cc
index 80858c4..4018920f 100644
--- a/chrome/browser/download/notification/multi_profile_download_notifier.cc
+++ b/chrome/browser/download/notification/multi_profile_download_notifier.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "chrome/browser/profiles/profile_selections.h"
 #include "components/download/public/common/simple_download_manager.h"
@@ -102,7 +101,7 @@
 
   auto it = std::ranges::find(download_notifiers_, manager,
                               &download::AllDownloadItemNotifier::GetManager);
-  CHECK(it != download_notifiers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != download_notifiers_.end());
   download_notifiers_.erase(it);
 }
 
diff --git a/chrome/browser/enterprise/connectors/analysis/files_request_handler.cc b/chrome/browser/enterprise/connectors/analysis/files_request_handler.cc
index c9f488a..762f96c 100644
--- a/chrome/browser/enterprise/connectors/analysis/files_request_handler.cc
+++ b/chrome/browser/enterprise/connectors/analysis/files_request_handler.cc
@@ -13,7 +13,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "chrome/browser/enterprise/connectors/common.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h"
@@ -166,7 +165,7 @@
     safe_browsing::BinaryUploadService::Result result,
     enterprise_connectors::ContentAnalysisResponse response) {
   auto it = std::ranges::find(paths_, path);
-  CHECK(it != paths_.end(), base::NotFatalUntil::M130);
+  CHECK(it != paths_.end());
   size_t index = std::distance(paths_.begin(), it);
   FileRequestCallback(index, result, response);
 }
diff --git a/chrome/browser/enterprise/webstore/features.cc b/chrome/browser/enterprise/webstore/features.cc
index a66c8778..1e631d7 100644
--- a/chrome/browser/enterprise/webstore/features.cc
+++ b/chrome/browser/enterprise/webstore/features.cc
@@ -8,7 +8,8 @@
 
 namespace enterprise::webstore {
 
-// Controls whether webstore navigation throttle is enabled.
-BASE_DECLARE_FEATURE(kChromeWebStoreNavigationThrottle);
+BASE_FEATURE(kChromeWebStoreNavigationThrottle,
+             "ChromeWebStoreNavigationThrottle",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 }  // namespace enterprise::webstore
diff --git a/chrome/browser/enterprise/webstore/features.h b/chrome/browser/enterprise/webstore/features.h
index ecad9ec9..4784d9ad 100644
--- a/chrome/browser/enterprise/webstore/features.h
+++ b/chrome/browser/enterprise/webstore/features.h
@@ -9,9 +9,8 @@
 
 namespace enterprise::webstore {
 
-BASE_FEATURE(kChromeWebStoreNavigationThrottle,
-             "ChromeWebStoreNavigationThrottle",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+// Controls whether webstore navigation throttle is enabled.
+BASE_DECLARE_FEATURE(kChromeWebStoreNavigationThrottle);
 
 }  // namespace enterprise::webstore
 
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn
index 1345da9e..2a16c69d 100644
--- a/chrome/browser/extensions/BUILD.gn
+++ b/chrome/browser/extensions/BUILD.gn
@@ -534,10 +534,7 @@
       "external_install_error_android.cc",
       "external_install_error_android.h",
     ]
-    deps += [
-      "//chrome/browser/android:keyboard_shortcuts",
-      "//chrome/browser/ui/android/tab_model",
-    ]
+    deps += [ "//chrome/browser/ui/android/tab_model" ]
   } else {
     sources += [ "api/chrome_extensions_api_client_non_android.cc" ]
   }
diff --git a/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.cc b/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.cc
index ae25007..18207734 100644
--- a/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.cc
+++ b/chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.cc
@@ -9,7 +9,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/stringprintf.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/api/declarative_content/content_predicate_evaluator.h"
@@ -174,8 +173,7 @@
     for (const DeclarativeContentCssPredicate* predicate : it->second) {
       for (const std::string& selector : predicate->css_selectors()) {
         auto loc = watched_css_selector_predicate_count_.find(selector);
-        CHECK(loc != watched_css_selector_predicate_count_.end(),
-              base::NotFatalUntil::M130);
+        CHECK(loc != watched_css_selector_predicate_count_.end());
         if (--loc->second == 0) {
           watched_css_selector_predicate_count_.erase(loc);
           watched_selectors_updated = true;
@@ -224,7 +222,7 @@
   const DeclarativeContentCssPredicate* typed_predicate =
       static_cast<const DeclarativeContentCssPredicate*>(predicate);
   auto loc = per_web_contents_tracker_.find(tab);
-  CHECK(loc != per_web_contents_tracker_.end(), base::NotFatalUntil::M130);
+  CHECK(loc != per_web_contents_tracker_.end());
   const std::unordered_set<std::string>& matching_css_selectors =
       loc->second->matching_css_selectors();
   for (const std::string& predicate_css_selector :
diff --git a/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.cc b/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.cc
index fa801c5..5a97b83 100644
--- a/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.cc
+++ b/chrome/browser/extensions/api/declarative_content/declarative_content_is_bookmarked_condition_tracker.cc
@@ -7,7 +7,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/stringprintf.h"
 #include "base/values.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
@@ -211,7 +210,7 @@
   const DeclarativeContentIsBookmarkedPredicate* typed_predicate =
       static_cast<const DeclarativeContentIsBookmarkedPredicate*>(predicate);
   auto loc = per_web_contents_tracker_.find(tab);
-  CHECK(loc != per_web_contents_tracker_.end(), base::NotFatalUntil::M130);
+  CHECK(loc != per_web_contents_tracker_.end());
   return loc->second->is_url_bookmarked() == typed_predicate->is_bookmarked();
 }
 
diff --git a/chrome/browser/extensions/api/declarative_content/declarative_content_page_url_condition_tracker.cc b/chrome/browser/extensions/api/declarative_content/declarative_content_page_url_condition_tracker.cc
index 5e0aabc..43b68d1 100644
--- a/chrome/browser/extensions/api/declarative_content/declarative_content_page_url_condition_tracker.cc
+++ b/chrome/browser/extensions/api/declarative_content/declarative_content_page_url_condition_tracker.cc
@@ -7,7 +7,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/stringprintf.h"
 #include "base/values.h"
 #include "components/url_matcher/url_matcher_factory.h"
@@ -204,7 +203,7 @@
   const DeclarativeContentPageUrlPredicate* typed_predicate =
       static_cast<const DeclarativeContentPageUrlPredicate*>(predicate);
   auto loc = per_web_contents_tracker_.find(tab);
-  CHECK(loc != per_web_contents_tracker_.end(), base::NotFatalUntil::M130);
+  CHECK(loc != per_web_contents_tracker_.end());
   const std::set<base::MatcherStringPattern::ID>& web_contents_id_matches =
       loc->second->matches();
   return base::Contains(web_contents_id_matches,
diff --git a/chrome/browser/extensions/api/messaging/incognito_connectability.cc b/chrome/browser/extensions/api/messaging/incognito_connectability.cc
index 592395e8..76da004 100644
--- a/chrome/browser/extensions/api/messaging/incognito_connectability.cc
+++ b/chrome/browser/extensions/api/messaging/incognito_connectability.cc
@@ -10,7 +10,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/lazy_instance.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.h"
 #include "chrome/browser/profiles/profile.h"
@@ -149,7 +148,7 @@
 
   PendingOriginMap::iterator origin_it =
       pending_origins_.find(make_pair(extension_id, origin));
-  CHECK(origin_it != pending_origins_.end(), base::NotFatalUntil::M130);
+  CHECK(origin_it != pending_origins_.end());
   PendingOrigin& pending_origin = origin_it->second;
   DCHECK(base::Contains(pending_origin, infobar_manager));
 
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_utils.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_utils.cc
index db32cd3..9e461a9 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_utils.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_utils.cc
@@ -6,7 +6,6 @@
 
 #include <tuple>
 
-#include "base/not_fatal_until.h"
 #include "chrome/common/extensions/api/passwords_private.h"
 #include "components/password_manager/core/browser/password_form.h"
 #include "components/password_manager/core/browser/password_manager_util.h"
@@ -81,8 +80,7 @@
   // Refresh the |credential| in the caches, as the |key_to_credential_| may
   // contain stale one.
   auto iterator_to_credential = id_to_credential_.find(id_for_key);
-  CHECK(iterator_to_credential != id_to_credential_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(iterator_to_credential != id_to_credential_.end());
   iterator_to_credential->second = std::move(credential);
 
   return id_for_key;
diff --git a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_api.cc b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_api.cc
index d391e91b..dfc080ff 100644
--- a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_api.cc
+++ b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_api.cc
@@ -6,7 +6,6 @@
 
 #include "base/functional/bind.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/extensions/api/web_authentication_proxy.h"
@@ -59,7 +58,7 @@
     return;
   }
   auto it = session_state_change_notifiers_.find(details.extension_id);
-  CHECK(it != session_state_change_notifiers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != session_state_change_notifiers_.end());
   session_state_change_notifiers_.erase(it);
 }
 
diff --git a/chrome/browser/extensions/chrome_app_icon_service.cc b/chrome/browser/extensions/chrome_app_icon_service.cc
index 25792eb..56ca999 100644
--- a/chrome/browser/extensions/chrome_app_icon_service.cc
+++ b/chrome/browser/extensions/chrome_app_icon_service.cc
@@ -6,7 +6,6 @@
 
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/extensions/chrome_app_icon.h"
@@ -102,7 +101,7 @@
 void ChromeAppIconService::OnIconDestroyed(ChromeAppIcon* icon) {
   DCHECK(icon);
   auto it = icon_map_.find(icon->app_id());
-  CHECK(it != icon_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != icon_map_.end());
   it->second.erase(icon);
   if (it->second.empty()) {
     base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
diff --git a/chrome/browser/extensions/commands/command_service.cc b/chrome/browser/extensions/commands/command_service.cc
index bf5ecca7..9a231e7 100644
--- a/chrome/browser/extensions/commands/command_service.cc
+++ b/chrome/browser/extensions/commands/command_service.cc
@@ -34,11 +34,6 @@
 #include "extensions/common/permissions/permissions_data.h"
 #include "ui/base/accelerators/command.h"
 
-#if BUILDFLAG(IS_ANDROID)
-#include "chrome/browser/android/keyboard_shortcuts.h"
-#include "ui/events/android/key_event_android.h"
-#endif  // BUILDFLAG(IS_ANDROID)
-
 namespace extensions {
 namespace {
 
@@ -523,11 +518,7 @@
   }
 
   // Not a global command, check if the command is a Chrome shortcut.
-#if BUILDFLAG(IS_ANDROID)
-  return !chrome::android::IsChromeAccelerator(command.accelerator());
-#else
   return !chrome::IsChromeAccelerator(command.accelerator());
-#endif  // BUILDFLAG(IS_ANDROID)
 }
 
 void CommandService::UpdateExtensionSuggestedCommandPrefs(
diff --git a/chrome/browser/extensions/device_permissions_dialog_controller.cc b/chrome/browser/extensions/device_permissions_dialog_controller.cc
index 9ddc51e..c8a2ff6d 100644
--- a/chrome/browser/extensions/device_permissions_dialog_controller.cc
+++ b/chrome/browser/extensions/device_permissions_dialog_controller.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/extensions/device_permissions_dialog_controller.h"
 
-#include "base/not_fatal_until.h"
 #include "chrome/browser/chooser_controller/title_util.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/strings/grit/components_strings.h"
@@ -58,7 +57,7 @@
     size_t index) const {
   std::u16string device_name = prompt_->GetDeviceName(index);
   const auto& it = device_name_map_.find(device_name);
-  CHECK(it != device_name_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != device_name_map_.end());
   return it->second == 1
              ? device_name
              : l10n_util::GetStringFUTF16(
diff --git a/chrome/browser/extensions/extension_assets_manager_chromeos.cc b/chrome/browser/extensions/extension_assets_manager_chromeos.cc
index a7858b73..2651ad0 100644
--- a/chrome/browser/extensions/extension_assets_manager_chromeos.cc
+++ b/chrome/browser/extensions/extension_assets_manager_chromeos.cc
@@ -18,7 +18,6 @@
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/singleton.h"
-#include "base/not_fatal_until.h"
 #include "base/system/sys_info.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/values.h"
@@ -101,7 +100,7 @@
                          PendingInstallList* pending_installs) {
     InstallQueue::iterator it = install_queue_.find(
         InstallQueue::key_type(id, version));
-    CHECK(it != install_queue_.end(), base::NotFatalUntil::M130);
+    CHECK(it != install_queue_.end());
     pending_installs->swap(it->second);
     install_queue_.erase(it);
   }
diff --git a/chrome/browser/extensions/updater/extension_updater.cc b/chrome/browser/extensions/updater/extension_updater.cc
index 127dfe3..bfefc51b 100644
--- a/chrome/browser/extensions/updater/extension_updater.cc
+++ b/chrome/browser/extensions/updater/extension_updater.cc
@@ -20,7 +20,6 @@
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notimplemented.h"
 #include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
@@ -987,7 +986,7 @@
     const UnguessableToken& token,
     const std::optional<CrxInstallError>& error) {
   auto iter = running_crx_installs_.find(token);
-  CHECK(iter != running_crx_installs_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != running_crx_installs_.end());
   FetchedCRXFile& crx_file = iter->second;
 
   bool extension_removed_from_cache = false;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 9760d9dd..30e47b1e 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2373,6 +2373,16 @@
     "expiry_milestone": 135
   },
   {
+    "name": "dse-preload2",
+    "owners": ["kenoss@chromium.org", "chrome-prerendering@google.com"],
+    "expiry_milestone": 145
+  },
+  {
+    "name": "dse-preload2-on-press",
+    "owners": ["kenoss@chromium.org", "chrome-prerendering@google.com"],
+    "expiry_milestone": 145
+  },
+  {
     "name": "dynamic-color-gamut",
     "owners": [ "cblume@chromium.org", "ccameron@chromium.org" ],
     "expiry_milestone": 90
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 49841ddd..e525317 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1130,6 +1130,16 @@
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) ||
         // BUILDFLAG(IS_CHROMEOS)
 
+const char kDsePreload2Name[] = "Default Search Engine preload 2";
+const char kDsePreload2Description[] =
+    "Enables new DSE preload instead of existing one, which uses //content "
+    "prefetch";
+
+const char kDsePreload2OnPressName[] =
+    "Default Search Engine preload 2, on-press triggers";
+const char kDsePreload2OnPressDescription[] =
+    "Enables on-press triggers of DsePreload2";
+
 const char kViewportSegmentsName[] = "Viewport Segments API";
 const char kViewportSegmentsDescription[] =
     "Enable the viewport segment API, giving information about the logical "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 776cd1f..1c5e8e6 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -853,6 +853,12 @@
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) ||
         // BUILDFLAG(IS_CHROMEOS)
 
+extern const char kDsePreload2Name[];
+extern const char kDsePreload2Description[];
+
+extern const char kDsePreload2OnPressName[];
+extern const char kDsePreload2OnPressDescription[];
+
 extern const char kEnableTLS13EarlyDataName[];
 extern const char kEnableTLS13EarlyDataDescription[];
 
diff --git a/chrome/browser/image_fetcher/image_decoder_impl.cc b/chrome/browser/image_fetcher/image_decoder_impl.cc
index 0c0380e7e..1b160837 100644
--- a/chrome/browser/image_fetcher/image_decoder_impl.cc
+++ b/chrome/browser/image_fetcher/image_decoder_impl.cc
@@ -9,7 +9,6 @@
 
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/image/image.h"
 
@@ -90,6 +89,6 @@
   auto request_it =
       std::ranges::find(decode_image_requests_, request,
                         &std::unique_ptr<DecodeImageRequest>::get);
-  CHECK(request_it != decode_image_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(request_it != decode_image_requests_.end());
   decode_image_requests_.erase(request_it);
 }
diff --git a/chrome/browser/intranet_redirect_detector.cc b/chrome/browser/intranet_redirect_detector.cc
index b27e01e..3a15b1c 100644
--- a/chrome/browser/intranet_redirect_detector.cc
+++ b/chrome/browser/intranet_redirect_detector.cc
@@ -12,7 +12,6 @@
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/location.h"
-#include "base/not_fatal_until.h"
 #include "base/rand_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/single_thread_task_runner.h"
@@ -183,7 +182,7 @@
     std::unique_ptr<std::string> response_body) {
   // Delete the loader on this function's exit.
   auto it = simple_loaders_.find(source);
-  CHECK(it != simple_loaders_.end(), base::NotFatalUntil::M130);
+  CHECK(it != simple_loaders_.end());
   std::unique_ptr<network::SimpleURLLoader> simple_loader =
       std::move(it->second);
   simple_loaders_.erase(it);
diff --git a/chrome/browser/media/router/providers/cast/cast_app_availability_tracker.cc b/chrome/browser/media/router/providers/cast/cast_app_availability_tracker.cc
index 55a569f..fddbcee 100644
--- a/chrome/browser/media/router/providers/cast/cast_app_availability_tracker.cc
+++ b/chrome/browser/media/router/providers/cast/cast_app_availability_tracker.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/media/router/providers/cast/cast_app_availability_tracker.h"
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "components/media_router/common/providers/cast/cast_media_source.h"
 
 using cast_channel::GetAppAvailabilityResult;
@@ -43,8 +42,7 @@
   for (const auto& app_info : it->second.app_infos()) {
     const std::string& app_id = app_info.app_id;
     auto count_it = registration_count_by_app_id_.find(app_id);
-    CHECK(count_it != registration_count_by_app_id_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(count_it != registration_count_by_app_id_.end());
     if (--(count_it->second) == 0) {
       registration_count_by_app_id_.erase(count_it);
     }
diff --git a/chrome/browser/media/router/providers/dial/dial_activity_manager.cc b/chrome/browser/media/router/providers/dial/dial_activity_manager.cc
index 0abc118..c9f78ed 100644
--- a/chrome/browser/media/router/providers/dial/dial_activity_manager.cc
+++ b/chrome/browser/media/router/providers/dial/dial_activity_manager.cc
@@ -10,7 +10,6 @@
 
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_split.h"
 #include "chrome/browser/media/router/discovery/dial/dial_app_discovery_service.h"
 #include "chrome/browser/media/router/providers/dial/dial_internal_message_util.h"
@@ -241,7 +240,7 @@
     mojom::MediaRouteProvider::TerminateRouteCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto record_it = records_.find(route_id);
-  CHECK(record_it != records_.end(), base::NotFatalUntil::M130);
+  CHECK(record_it != records_.end());
   std::unique_ptr<Record>& record = record_it->second;
   DCHECK(!record->pending_stop_request);
 
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc b/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc
index c3b852f7..0ea8e05 100644
--- a/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc
+++ b/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc
@@ -15,7 +15,6 @@
 #include "base/files/file_util.h"
 #include "base/functional/bind.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/task/sequenced_task_runner.h"
@@ -967,7 +966,7 @@
   for (auto it = history_files.begin();
        num_history_files > kMaxWebRtcEventLogHistoryFiles;
        --num_history_files) {
-    CHECK(it != history_files.end(), base::NotFatalUntil::M130);
+    CHECK(it != history_files.end());
     files_to_delete.insert(it->path());
     it = history_files.erase(it);
   }
diff --git a/chrome/browser/media_galleries/fileapi/mtp_device_map_service.cc b/chrome/browser/media_galleries/fileapi/mtp_device_map_service.cc
index cbf084f1..ffe4d27 100644
--- a/chrome/browser/media_galleries/fileapi/mtp_device_map_service.cc
+++ b/chrome/browser/media_galleries/fileapi/mtp_device_map_service.cc
@@ -9,7 +9,6 @@
 
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "chrome/browser/media_galleries/fileapi/mtp_device_async_delegate.h"
 #include "content/public/browser/browser_thread.h"
 #include "storage/browser/file_system/external_mount_points.h"
@@ -66,8 +65,7 @@
     const AsyncDelegateKey key =
         GetAsyncDelegateKey(device_location, read_only);
     MTPDeviceUsageMap::iterator delegate_it = mtp_device_usage_map_.find(key);
-    CHECK(delegate_it != mtp_device_usage_map_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(delegate_it != mtp_device_usage_map_.end());
 
     mtp_device_usage_map_[key]--;
     if (mtp_device_usage_map_[key] == 0) {
@@ -99,7 +97,7 @@
 
   const AsyncDelegateKey key = GetAsyncDelegateKey(device_location, read_only);
   AsyncDelegateMap::iterator it = async_delegate_map_.find(key);
-  CHECK(it != async_delegate_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != async_delegate_map_.end());
   it->second->CancelPendingTasksAndDeleteDelegate();
   async_delegate_map_.erase(it);
 }
diff --git a/chrome/browser/media_galleries/media_file_system_registry.cc b/chrome/browser/media_galleries/media_file_system_registry.cc
index badc618..a44bc3a 100644
--- a/chrome/browser/media_galleries/media_file_system_registry.cc
+++ b/chrome/browser/media_galleries/media_file_system_registry.cc
@@ -19,7 +19,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/singleton.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "build/build_config.h"
 #include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
@@ -598,7 +597,7 @@
   Profile* profile = prefs->profile();
   ExtensionGalleriesHostMap::const_iterator host_map_it =
       extension_hosts_map_.find(profile);
-  CHECK(host_map_it != extension_hosts_map_.end(), base::NotFatalUntil::M130);
+  CHECK(host_map_it != extension_hosts_map_.end());
   const ExtensionHostMap& extension_host_map = host_map_it->second;
   auto gallery_host_it = extension_host_map.find(extension_id);
   if (gallery_host_it == extension_host_map.end())
@@ -616,7 +615,7 @@
       extensions::ExtensionRegistry::Get(profile);
   ExtensionGalleriesHostMap::const_iterator host_map_it =
       extension_hosts_map_.find(profile);
-  CHECK(host_map_it != extension_hosts_map_.end(), base::NotFatalUntil::M130);
+  CHECK(host_map_it != extension_hosts_map_.end());
   const ExtensionHostMap& extension_host_map = host_map_it->second;
 
   // Go through ExtensionHosts, and remove indicated gallery, if any.
@@ -646,8 +645,7 @@
   auto extension_hosts = extension_hosts_map_.find(profile);
   // GetPreferences(), which had to be called because preferences is an
   // argument, ensures that profile is in the map.
-  CHECK(extension_hosts != extension_hosts_map_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(extension_hosts != extension_hosts_map_.end());
   if (extension_hosts->second.empty())
     preferences->AddGalleryChangeObserver(this);
 
@@ -671,8 +669,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   auto extension_hosts = extension_hosts_map_.find(profile);
-  CHECK(extension_hosts != extension_hosts_map_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(extension_hosts != extension_hosts_map_.end());
   ExtensionHostMap::size_type erase_count =
       extension_hosts->second.erase(extension_id);
   DCHECK_EQ(1U, erase_count);
@@ -690,13 +687,11 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   auto extension_hosts_it = extension_hosts_map_.find(profile);
-  CHECK(extension_hosts_it != extension_hosts_map_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(extension_hosts_it != extension_hosts_map_.end());
   extension_hosts_map_.erase(extension_hosts_it);
 
   auto profile_subscription_it = profile_subscription_map_.find(profile);
-  CHECK(profile_subscription_it != profile_subscription_map_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(profile_subscription_it != profile_subscription_map_.end());
   profile_subscription_map_.erase(profile_subscription_it);
 }
 
diff --git a/chrome/browser/media_galleries/media_galleries_permission_controller.cc b/chrome/browser/media_galleries/media_galleries_permission_controller.cc
index 0b55030..9abe288 100644
--- a/chrome/browser/media_galleries/media_galleries_permission_controller.cc
+++ b/chrome/browser/media_galleries/media_galleries_permission_controller.cc
@@ -8,7 +8,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/path_service.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/browser_process.h"
@@ -300,7 +299,7 @@
     // just sets the gallery to permitted.
     GalleryDialogId gallery_id = GetDialogId(gallery.pref_id);
     auto iter = known_galleries_.find(gallery_id);
-    CHECK(iter != known_galleries_.end(), base::NotFatalUntil::M130);
+    CHECK(iter != known_galleries_.end());
     iter->second.selected = true;
     forgotten_galleries_.erase(gallery_id);
     dialog_->UpdateGalleries();
diff --git a/chrome/browser/metrics/power/process_monitor.cc b/chrome/browser/metrics/power/process_monitor.cc
index d6c81aa3..6cff8d7 100644
--- a/chrome/browser/metrics/power/process_monitor.cc
+++ b/chrome/browser/metrics/power/process_monitor.cc
@@ -11,7 +11,6 @@
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/process/process_handle.h"
 #include "base/process/process_metrics.h"
@@ -393,7 +392,7 @@
     return;
   }
 
-  CHECK(it != browser_child_process_infos_.end(), base::NotFatalUntil::M130);
+  CHECK(it != browser_child_process_infos_.end());
   // Remember the metrics from when the process exited, if available.
   if (info.cpu_usage.has_value()) {
     const ProcessInfo& process_info = it->second;
diff --git a/chrome/browser/metrics/usage_scenario/tab_usage_scenario_tracker.cc b/chrome/browser/metrics/usage_scenario/tab_usage_scenario_tracker.cc
index 35b46e6..17ea6f61 100644
--- a/chrome/browser/metrics/usage_scenario/tab_usage_scenario_tracker.cc
+++ b/chrome/browser/metrics/usage_scenario/tab_usage_scenario_tracker.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/metrics/usage_scenario/tab_usage_scenario_tracker.h"
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "chrome/browser/metrics/usage_scenario/usage_scenario_data_store.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
@@ -261,7 +260,7 @@
 
   if (web_contents->GetVisibility() == content::Visibility::VISIBLE) {
     auto iter = visible_tabs_.find(web_contents);
-    CHECK(iter != visible_tabs_.end(), base::NotFatalUntil::M130);
+    CHECK(iter != visible_tabs_.end());
 
     // If there's already an entry with a valid SourceID for this in
     // |visible_tabs_| then it means that there's been a main frame navigation
diff --git a/chrome/browser/notifications/notification_channels_provider_android_unittest.cc b/chrome/browser/notifications/notification_channels_provider_android_unittest.cc
index c4069a34..60a50e2 100644
--- a/chrome/browser/notifications/notification_channels_provider_android_unittest.cc
+++ b/chrome/browser/notifications/notification_channels_provider_android_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/functional/callback.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task/single_thread_task_runner.h"
@@ -66,7 +65,7 @@
     auto it = std::ranges::find(
         channels_, origin,
         [](const Channels::value_type& pair) { return pair.second.origin; });
-    CHECK(it != channels_.end(), base::NotFatalUntil::M130)
+    CHECK(it != channels_.end())
         << "Must call bridge.CreateChannel before SetChannelStatus.";
     it->second.status = status;
   }
diff --git a/chrome/browser/notifications/scheduler/internal/display_decider.cc b/chrome/browser/notifications/scheduler/internal/display_decider.cc
index a76898f..5a298e3 100644
--- a/chrome/browser/notifications/scheduler/internal/display_decider.cc
+++ b/chrome/browser/notifications/scheduler/internal/display_decider.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/time/clock.h"
 #include "chrome/browser/notifications/scheduler/internal/impression_types.h"
 #include "chrome/browser/notifications/scheduler/internal/notification_entry.h"
@@ -115,7 +114,7 @@
     // Circling around all clients to find new notification to show.
     do {
       // Move the iterator to next client type.
-      CHECK(it != clients_.end(), base::NotFatalUntil::M130);
+      CHECK(it != clients_.end());
       if (++it == clients_.end())
         it = clients_.begin();
       ++steps;
diff --git a/chrome/browser/passage_embeddings/cpu_histogram_logger.cc b/chrome/browser/passage_embeddings/cpu_histogram_logger.cc
index 4d952b2..bde62bd 100644
--- a/chrome/browser/passage_embeddings/cpu_histogram_logger.cc
+++ b/chrome/browser/passage_embeddings/cpu_histogram_logger.cc
@@ -104,7 +104,7 @@
       // proportion tracker might skip the final measurement due to a race.
       return;
     }
-    CHECK_EQ(cpu_proportion.size(), 1ul, base::NotFatalUntil::M134);
+    CHECK_EQ(cpu_proportion.size(), 1ul);
     int sample = cpu_proportion.begin()->second * kCpuUsageFactor;
     base::UmaHistogramCustomCounts("History.Embeddings.Embedder.CpuUsage2",
                                    sample, kCpuUsageMin, kCpuUsageMax,
diff --git a/chrome/browser/performance_manager/execution_context_priority/side_panel_loading_voter.cc b/chrome/browser/performance_manager/execution_context_priority/side_panel_loading_voter.cc
index 072bc61..f14c21b 100644
--- a/chrome/browser/performance_manager/execution_context_priority/side_panel_loading_voter.cc
+++ b/chrome/browser/performance_manager/execution_context_priority/side_panel_loading_voter.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/performance_manager/execution_context_priority/side_panel_loading_voter.h"
 
-#include "base/not_fatal_until.h"
 #include "components/performance_manager/public/execution_context/execution_context_registry.h"
 #include "components/performance_manager/public/graph/graph.h"
 #include "url/gurl.h"
@@ -37,7 +36,7 @@
   if (!page_node->GetMainFrameUrl().is_empty()) {
     // This is possible for a preloaded Side Panel. The navigation has already
     // committed and the page is visible.
-    CHECK(page_node->IsVisible(), base::NotFatalUntil::M135);
+    CHECK(page_node->IsVisible());
     return;
   }
 
diff --git a/chrome/browser/performance_manager/user_tuning/profile_discard_opt_out_list_helper.cc b/chrome/browser/performance_manager/user_tuning/profile_discard_opt_out_list_helper.cc
index df43bf15..892eb6c 100644
--- a/chrome/browser/performance_manager/user_tuning/profile_discard_opt_out_list_helper.cc
+++ b/chrome/browser/performance_manager/user_tuning/profile_discard_opt_out_list_helper.cc
@@ -8,7 +8,6 @@
 #include <vector>
 
 #include "base/feature_list.h"
-#include "base/not_fatal_until.h"
 #include "base/values.h"
 #include "chrome/browser/performance_manager/policies/discard_eligibility_policy.h"
 #include "chrome/browser/profiles/profile.h"
@@ -124,7 +123,7 @@
 void ProfileDiscardOptOutListHelper::OnProfileWillBeRemovedImpl(
     const std::string& browser_context_id) {
   auto it = discard_opt_out_trackers_.find(browser_context_id);
-  CHECK(it != discard_opt_out_trackers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != discard_opt_out_trackers_.end());
   discard_opt_out_trackers_.erase(it);
 }
 
diff --git a/chrome/browser/performance_monitor/system_monitor.cc b/chrome/browser/performance_monitor/system_monitor.cc
index 90dac38..7fe1de4 100644
--- a/chrome/browser/performance_monitor/system_monitor.cc
+++ b/chrome/browser/performance_monitor/system_monitor.cc
@@ -9,7 +9,6 @@
 
 #include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/observer_list.h"
 #include "base/task/thread_pool.h"
@@ -228,7 +227,7 @@
       continue;
     for (auto& observer : observers_) {
       const auto& iter = observer_metrics_.find(&observer);
-      CHECK(iter != observer_metrics_.end(), base::NotFatalUntil::M130);
+      CHECK(iter != observer_metrics_.end());
       if (metric_evaluators_metadata_[static_cast<size_t>(metric->type())]
               .get_refresh_frequency_field_function(iter->second) !=
           SystemMonitor::SamplingFrequency::kNoSampling) {
diff --git a/chrome/browser/predictors/preconnect_manager.cc b/chrome/browser/predictors/preconnect_manager.cc
index 6069dd81..05c0aa8c 100644
--- a/chrome/browser/predictors/preconnect_manager.cc
+++ b/chrome/browser/predictors/preconnect_manager.cc
@@ -10,7 +10,6 @@
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/trace_event/trace_event.h"
 #include "base/types/optional_util.h"
 #include "chrome/browser/predictors/predictors_features.h"
@@ -408,7 +407,7 @@
   DCHECK(info);
   DCHECK(info->is_done());
   auto it = preresolve_info_.find(info->url);
-  CHECK(it != preresolve_info_.end(), base::NotFatalUntil::M130);
+  CHECK(it != preresolve_info_.end());
   DCHECK(info == it->second.get());
   if (delegate_)
     delegate_->PreconnectFinished(std::move(info->stats));
diff --git a/chrome/browser/predictors/prefetch_manager.cc b/chrome/browser/predictors/prefetch_manager.cc
index 4cf17004..fee73a3 100644
--- a/chrome/browser/predictors/prefetch_manager.cc
+++ b/chrome/browser/predictors/prefetch_manager.cc
@@ -12,7 +12,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "chrome/browser/predictors/perform_network_context_prefetch.h"
 #include "chrome/browser/predictors/predictors_features.h"
@@ -427,7 +426,7 @@
 void PrefetchManager::AllPrefetchJobsForUrlFinished(PrefetchInfo& info) {
   DCHECK(info.is_done());
   auto it = prefetch_info_.find(info.url);
-  CHECK(it != prefetch_info_.end(), base::NotFatalUntil::M130);
+  CHECK(it != prefetch_info_.end());
   DCHECK(&info == it->second.get());
 
   if (delegate_)
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc
index 1eab5bf..f5a04c1b 100644
--- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc
@@ -190,6 +190,35 @@
   return false;
 }
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+// LINT.IfChange(DuplicateNavigationServingResult)
+enum class DuplicateNavigationServingResult : uint8_t {
+  kNotServedThenNotServed = 0,
+  kNotServedThenServed = 1,
+  kServedThenNotServed = 2,
+  kServedThenServed = 3,
+  kMaxValue = kServedThenServed
+};
+// LINT.ThenChange(/tools/metrics/histograms/metadata/omnibox/enums.xml:DuplicateNavigationServingResult)
+DuplicateNavigationServingResult ConvertToDuplicateNavigationServingResult(
+    bool first_navigation_served_from_prefetch_cache,
+    bool second_navigation_served_from_prefetch_cache) {
+  if (first_navigation_served_from_prefetch_cache &&
+      second_navigation_served_from_prefetch_cache) {
+    return DuplicateNavigationServingResult::kServedThenServed;
+  }
+  if (first_navigation_served_from_prefetch_cache &&
+      !second_navigation_served_from_prefetch_cache) {
+    return DuplicateNavigationServingResult::kServedThenNotServed;
+  }
+  if (!first_navigation_served_from_prefetch_cache &&
+      second_navigation_served_from_prefetch_cache) {
+    return DuplicateNavigationServingResult::kNotServedThenServed;
+  }
+  return DuplicateNavigationServingResult::kNotServedThenNotServed;
+}
+
 }  // namespace
 
 GURL GetPrefetchUrlFromMatch(
@@ -1292,9 +1321,10 @@
     case SearchPrefetchServingReason::kRequestInFlightNotReady:
       NOTREACHED();
   }
+  const bool is_served = serving_status == SearchPrefetchServingReason::kServed;
   auto iter = search_terms_cache_.Get(search_terms);
   if (iter != search_terms_cache_.end()) {
-    base::TimeDelta age = base::Time::Now() - iter->second;
+    base::TimeDelta age = base::Time::Now() - iter->second.last_navigation_time;
     base::UmaHistogramCustomTimes(
         "Omnibox.SearchPrefetch.DuplicateSearchTermsAge", age,
         base::Milliseconds(1), base::Hours(10), 100);
@@ -1307,9 +1337,16 @@
       base::UmaHistogramCustomTimes(
           "Omnibox.SearchPrefetch.Within1sDuplicateSearchTermsAge", age,
           base::Milliseconds(1), base::Seconds(1), 20);
+      base::UmaHistogramEnumeration(
+          "Omnibox.SearchPrefetch.Within1sDuplicateSearchTermsRelationship",
+          ConvertToDuplicateNavigationServingResult(
+              iter->second.served_from_prefetch_cache, is_served));
     }
   }
-  search_terms_cache_.Put(search_terms, base::Time::Now());
+  RealNaivigationServingResult result = {
+      .served_from_prefetch_cache = is_served,
+      .last_navigation_time = base::Time::Now()};
+  search_terms_cache_.Put(search_terms, std::move(result));
   base::trace_event::EmitNamedTrigger("first-search-request");
 }
 
@@ -1324,7 +1361,7 @@
     base::UmaHistogramCustomTimes(
         "Omnibox.SearchPrefetch."
         "DuplicateSearchTermsAgeAheadOfNavigationalPrefetch",
-        base::Time::Now() - iter->second, base::Milliseconds(1),
+        base::Time::Now() - iter->second.last_navigation_time, base::Milliseconds(1),
         base::Minutes(2), 50);
   }
 }
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h
index 9d4d7dd..d59b48e 100644
--- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h
@@ -222,6 +222,11 @@
   friend class PrerenderOmniboxSearchSuggestionBrowserTest;
   friend class SearchPrefetchServiceEnabledBrowserTest;
 
+  struct RealNaivigationServingResult {
+    bool served_from_prefetch_cache = false;
+    base::Time last_navigation_time;
+  };
+
   // Returns whether the prefetch started or not.
   bool MaybePrefetchURL(const GURL& url,
                         bool navigation_prefetch,
@@ -301,7 +306,8 @@
   // serving time of the response.
   std::map<GURL, std::pair<GURL, base::Time>> prefetch_cache_;
 
-  base::LRUCache<std::u16string, base::Time> search_terms_cache_{50};
+  base::LRUCache<std::u16string, RealNaivigationServingResult>
+      search_terms_cache_{50};
 
   mojo::PendingRemote<network::mojom::PreloadedSharedDictionaryInfoHandle>
       preloaded_shared_dictionaries_handle_;
diff --git a/chrome/browser/printing/print_backend_service_manager.cc b/chrome/browser/printing/print_backend_service_manager.cc
index 43dadbf..0895786 100644
--- a/chrome/browser/printing/print_backend_service_manager.cc
+++ b/chrome/browser/printing/print_backend_service_manager.cc
@@ -18,7 +18,6 @@
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
@@ -1365,12 +1364,12 @@
     const base::UnguessableToken& saved_callback_id,
     X... data) {
   auto found_callback_map = saved_callbacks.find(remote_id);
-  CHECK(found_callback_map != saved_callbacks.end(), base::NotFatalUntil::M130);
+  CHECK(found_callback_map != saved_callbacks.end());
 
   SavedCallbacks<T...>& callback_map = found_callback_map->second;
 
   auto callback_entry = callback_map.find(saved_callback_id);
-  CHECK(callback_entry != callback_map.end(), base::NotFatalUntil::M130);
+  CHECK(callback_entry != callback_map.end());
   auto callback = std::move(callback_entry->second);
   callback_map.erase(callback_entry);
 
diff --git a/chrome/browser/private_network_access/local_network_access_browsertest.cc b/chrome/browser/private_network_access/local_network_access_browsertest.cc
index 18f0b54..afa77f3 100644
--- a/chrome/browser/private_network_access/local_network_access_browsertest.cc
+++ b/chrome/browser/private_network_access/local_network_access_browsertest.cc
@@ -7,7 +7,6 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "components/metrics/content/subprocess_metrics_provider.h"
 #include "components/network_session_configurator/common/network_switches.h"
 #include "components/permissions/permission_request_manager.h"
 #include "components/permissions/test/mock_permission_prompt_factory.h"
@@ -19,7 +18,6 @@
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/test_data_directory.h"
-#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h"
 
 // Path to a response that passes Local Network Access checks.
 constexpr char kLnaPath[] =
@@ -28,8 +26,6 @@
 
 class LocalNetworkAccessBrowserTest : public policy::PolicyTest {
  public:
-  using WebFeature = blink::mojom::WebFeature;
-
   LocalNetworkAccessBrowserTest()
       : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {}
 
@@ -39,35 +35,6 @@
 
   net::EmbeddedTestServer& https_server() { return https_server_; }
 
-  // Fetch the Blink.UseCounter.Features histogram in every renderer process
-  // until reaching, but not exceeding, |expected_count|.
-  void CheckCounter(WebFeature feature, int expected_count) {
-    CheckHistogramCount("Blink.UseCounter.Features", feature, expected_count);
-  }
-
-  // Fetch the |histogram|'s |bucket| in every renderer process until reaching,
-  // but not exceeding, |expected_count|.
-  template <typename T>
-  void CheckHistogramCount(std::string_view histogram,
-                           T bucket,
-                           int expected_count) {
-    while (true) {
-      content::FetchHistogramsFromChildProcesses();
-      metrics::SubprocessMetricsProvider::MergeHistogramDeltasForTesting();
-
-      int count = histogram_.GetBucketCount(histogram, bucket);
-      CHECK_LE(count, expected_count);
-      if (count == expected_count) {
-        return;
-      }
-
-      base::RunLoop run_loop;
-      base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
-          FROM_HERE, run_loop.QuitClosure(), base::Milliseconds(1));
-      run_loop.Run();
-    }
-  }
-
  protected:
   void SetUpOnMainThread() override {
     host_resolver()->AddRule("*", "127.0.0.1");
@@ -87,7 +54,6 @@
 
   net::EmbeddedTestServer https_server_;
   base::test::ScopedFeatureList features_;
-  base::HistogramTester histogram_;
 };
 
 IN_PROC_BROWSER_TEST_F(LocalNetworkAccessBrowserTest,
@@ -135,45 +101,3 @@
                                      https_server().GetURL("b.com", kLnaPath))),
               content::EvalJsResult::IsError());
 }
-
-IN_PROC_BROWSER_TEST_F(LocalNetworkAccessBrowserTest,
-                       CheckPrivateAliasFeatureCounter) {
-  ASSERT_TRUE(content::NavigateToURL(
-      web_contents(),
-      https_server().GetURL(
-          "a.com",
-          "/private_network_access/no-favicon-treat-as-public-address.html")));
-
-  // LNA fetch fails due to mismatched targetAddressSpace. Result doesn't matter
-  // here though, as we're just checking a use counter that doesn't depend on
-  // fetch success.
-  EXPECT_THAT(content::EvalJs(web_contents(),
-                              content::JsReplace(
-                                  "fetch($1, {targetAddressSpace: "
-                                  "'private'}).then(response => response.ok)",
-                                  https_server().GetURL("b.com", kLnaPath))),
-              content::EvalJsResult::IsError());
-
-  CheckCounter(WebFeature::kLocalNetworkAccessPrivateAliasUse, 1);
-}
-
-IN_PROC_BROWSER_TEST_F(LocalNetworkAccessBrowserTest,
-                       CheckPrivateAliasFeatureCounterLocalNotCounted) {
-  ASSERT_TRUE(content::NavigateToURL(
-      web_contents(),
-      https_server().GetURL(
-          "a.com",
-          "/private_network_access/no-favicon-treat-as-public-address.html")));
-
-  // LNA fetch fails due to mismatched targetAddressSpace. Result doesn't matter
-  // here though, as we're just checking a use counter that doesn't depend on
-  // fetch success.
-  EXPECT_THAT(content::EvalJs(
-                  web_contents(),
-                  content::JsReplace("fetch($1, {targetAddressSpace: "
-                                     "'local'}).then(response => response.ok)",
-                                     https_server().GetURL("b.com", kLnaPath))),
-              content::EvalJsResult::IsError());
-
-  CheckCounter(WebFeature::kLocalNetworkAccessPrivateAliasUse, 0);
-}
diff --git a/chrome/browser/profile_resetter/profile_resetter.cc b/chrome/browser/profile_resetter/profile_resetter.cc
index 83109bd..bc6358b 100644
--- a/chrome/browser/profile_resetter/profile_resetter.cc
+++ b/chrome/browser/profile_resetter/profile_resetter.cc
@@ -113,7 +113,7 @@
 }
 
 void ProfileResetter::OnDefaultSettingsFetched() {
-  CHECK(config_fetcher_, base::NotFatalUntil::M135);
+  CHECK(config_fetcher_);
   DCHECK(!config_fetcher_->IsActive());
 }
 
diff --git a/chrome/browser/profiles/profile_destroyer.cc b/chrome/browser/profiles/profile_destroyer.cc
index 5e02153..0e769c1 100644
--- a/chrome/browser/profiles/profile_destroyer.cc
+++ b/chrome/browser/profiles/profile_destroyer.cc
@@ -13,7 +13,6 @@
 #include "base/location.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
@@ -362,7 +361,7 @@
   CHECK(!observations_.IsObservingAnySource())
       << "Some render process hosts were not destroyed early enough!";
   auto iter = PendingDestroyers().find(this);
-  CHECK(iter != PendingDestroyers().end(), base::NotFatalUntil::M130);
+  CHECK(iter != PendingDestroyers().end());
   PendingDestroyers().erase(iter);
 }
 
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index 4a2103e..88a274f 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -27,7 +27,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -1119,17 +1118,13 @@
   // the services affected by the migration are.
   // TODO(crbug.com/369297671): Remove one year after launching
   // kForceMigrateSyncingUserToSignedIn on all //chrome platforms.
-  CHECK(GetPrefs(), base::NotFatalUntil::M133);
-  CHECK(!IdentityManagerFactory::GetForProfileIfExists(this),
-        base::NotFatalUntil::M133);
-  CHECK(!SyncServiceFactory::HasSyncService(this), base::NotFatalUntil::M133);
-  CHECK(!BookmarkModelFactory::GetForBrowserContextIfExists(this),
-        base::NotFatalUntil::M133);
-  CHECK(!ProfilePasswordStoreFactory::HasStore(this),
-        base::NotFatalUntil::M133);
-  CHECK(!AccountPasswordStoreFactory::HasStore(this),
-        base::NotFatalUntil::M133);
-  CHECK(!ReadingListModelFactory::HasModel(this), base::NotFatalUntil::M133);
+  CHECK(GetPrefs());
+  CHECK(!IdentityManagerFactory::GetForProfileIfExists(this));
+  CHECK(!SyncServiceFactory::HasSyncService(this));
+  CHECK(!BookmarkModelFactory::GetForBrowserContextIfExists(this));
+  CHECK(!ProfilePasswordStoreFactory::HasStore(this));
+  CHECK(!AccountPasswordStoreFactory::HasStore(this));
+  CHECK(!ReadingListModelFactory::HasModel(this));
   browser_sync::MaybeMigrateSyncingUserToSignedIn(GetPath(), GetPrefs());
 
 #if BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index 4d791de..2c41220 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -30,7 +30,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -1754,7 +1753,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   auto iter = profiles_info_.find(profile->GetPath());
-  CHECK(iter != profiles_info_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != profiles_info_.end());
   ProfileInfo* info = iter->second.get();
 
   if (create_mode == Profile::CreateMode::kSynchronous) {
diff --git a/chrome/browser/push_messaging/push_messaging_refresher.cc b/chrome/browser/push_messaging/push_messaging_refresher.cc
index a95b9a09..bab3719 100644
--- a/chrome/browser/push_messaging/push_messaging_refresher.cc
+++ b/chrome/browser/push_messaging/push_messaging_refresher.cc
@@ -7,7 +7,6 @@
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/task/single_thread_task_runner.h"
 #include "chrome/browser/push_messaging/push_messaging_app_identifier.h"
@@ -77,7 +76,7 @@
   refresh_map_.erase(found_new_app_id);
 
   RefreshInfo::iterator result = old_subscriptions_.find(new_app_id);
-  CHECK(result != old_subscriptions_.end(), base::NotFatalUntil::M130);
+  CHECK(result != old_subscriptions_.end());
 
   PushMessagingAppIdentifier old_identifier = result->second.old_identifier;
   old_subscriptions_.erase(result);
diff --git a/chrome/browser/resource_coordinator/session_restore_policy.cc b/chrome/browser/resource_coordinator/session_restore_policy.cc
index 6f596ea8..59bbe98 100644
--- a/chrome/browser/resource_coordinator/session_restore_policy.cc
+++ b/chrome/browser/resource_coordinator/session_restore_policy.cc
@@ -14,7 +14,6 @@
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/sequence_checker.h"
 #include "base/strings/string_util.h"
 #include "base/system/sys_info.h"
@@ -172,7 +171,7 @@
 
 void SessionRestorePolicy::RemoveTabForScoring(content::WebContents* contents) {
   auto it = tab_data_.find(contents);
-  CHECK(it != tab_data_.end(), base::NotFatalUntil::M130);
+  CHECK(it != tab_data_.end());
   auto* tab_data = it->second.get();
 
   if (HasFinalScore(tab_data)) {
@@ -202,7 +201,7 @@
   }
 
   auto it = tab_data_.find(contents);
-  CHECK(it != tab_data_.end(), base::NotFatalUntil::M130);
+  CHECK(it != tab_data_.end());
   const TabData* tab_data = it->second.get();
 
   // Enforce a max time since use if one is specified.
@@ -287,7 +286,7 @@
     content::WebContents* contents,
     TabData::SiteDataReaderData reader_data) {
   auto it = tab_data_.find(contents);
-  CHECK(it != tab_data_.end(), base::NotFatalUntil::M130);
+  CHECK(it != tab_data_.end());
   auto* tab_data = it->second.get();
 
   // Determine if background communication with the user is used. A pinned tab
diff --git a/chrome/browser/resource_coordinator/tab_load_tracker.cc b/chrome/browser/resource_coordinator/tab_load_tracker.cc
index e8c041e..1180f978 100644
--- a/chrome/browser/resource_coordinator/tab_load_tracker.cc
+++ b/chrome/browser/resource_coordinator/tab_load_tracker.cc
@@ -9,7 +9,6 @@
 
 #include "base/check_op.h"
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/resource_coordinator/resource_coordinator_parts.h"
@@ -44,7 +43,7 @@
     content::WebContents* web_contents) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = tabs_.find(web_contents);
-  CHECK(it != tabs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != tabs_.end());
   return it->second.loading_state;
 }
 
@@ -87,7 +86,7 @@
     content::WebContents* web_contents,
     LoadingState loading_state) {
   auto it = tabs_.find(web_contents);
-  CHECK(it != tabs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != tabs_.end());
   TransitionState(it, loading_state);
 }
 
@@ -113,7 +112,7 @@
 void TabLoadTracker::StopTracking(content::WebContents* web_contents) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = tabs_.find(web_contents);
-  CHECK(it != tabs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != tabs_.end());
 
   auto loading_state = it->second.loading_state;
   DCHECK_NE(0u, state_counts_[static_cast<size_t>(it->second.loading_state)]);
@@ -132,14 +131,14 @@
     return;
 
   auto it = tabs_.find(web_contents);
-  CHECK(it != tabs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != tabs_.end());
   TransitionState(it, LOADING);
 }
 
 void TabLoadTracker::DidStopLoading(content::WebContents* web_contents) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = tabs_.find(web_contents);
-  CHECK(it != tabs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != tabs_.end());
 
   // Corner case: An unloaded tab that starts loading but never receives a
   // response transitions to the LOADED state when loading stops, without
@@ -210,7 +209,7 @@
 
 void TabLoadTracker::TransitionToUnloaded(content::WebContents* web_contents) {
   auto it = tabs_.find(web_contents);
-  CHECK(it != tabs_.end(), base::NotFatalUntil::M133);
+  CHECK(it != tabs_.end());
   // The tab could already be UNLOADED if it hasn't yet started loading. This
   // can happen if the renderer crashes between the UNLOADED and LOADING states.
   if (it->second.loading_state == UNLOADED) {
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc
index 10c8721..cc78df6 100644
--- a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc
@@ -11,7 +11,6 @@
 #include "base/command_line.h"
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_split.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/download/chrome_download_manager_delegate.h"
@@ -409,7 +408,7 @@
     PPAPIDownloadRequest* request) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   auto it = ppapi_download_requests_.find(request);
-  CHECK(it != ppapi_download_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(it != ppapi_download_requests_.end());
   ppapi_download_requests_.erase(it);
 }
 
@@ -824,7 +823,7 @@
 #if !BUILDFLAG(IS_ANDROID)
 void DownloadProtectionService::RequestFinished(DeepScanningRequest* request) {
   auto it = deep_scanning_requests_.find(request);
-  CHECK(it != deep_scanning_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(it != deep_scanning_requests_.end());
   deep_scanning_requests_.erase(it);
 }
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
index d81e544..fe609b9 100644
--- a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
@@ -17,7 +17,6 @@
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/process/process.h"
 #include "base/strings/string_util.h"
 #include "base/task/single_thread_task_runner.h"
@@ -487,7 +486,7 @@
   profile->RemoveObserver(this);
 
   auto it = profiles_.find(profile);
-  CHECK(it != profiles_.end(), base::NotFatalUntil::M130);
+  CHECK(it != profiles_.end());
 
   // Take ownership of the context.
   std::unique_ptr<ProfileContext> context = std::move(it->second);
@@ -955,7 +954,7 @@
   // the collection of outstanding uploads) in this scope.
   auto it = std::ranges::find(uploads_, context,
                               &std::unique_ptr<UploadContext>::get);
-  CHECK(it != uploads_.end(), base::NotFatalUntil::M130);
+  CHECK(it != uploads_.end());
   std::unique_ptr<UploadContext> upload(std::move(*it));
   uploads_.erase(it);
 
diff --git a/chrome/browser/sessions/tab_loader.cc b/chrome/browser/sessions/tab_loader.cc
index ffbc2f91..05b3379 100644
--- a/chrome/browser/sessions/tab_loader.cc
+++ b/chrome/browser/sessions/tab_loader.cc
@@ -11,7 +11,6 @@
 #include "base/memory/memory_pressure_monitor.h"
 #include "base/memory/raw_ptr.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/system/sys_info.h"
 #include "base/time/default_tick_clock.h"
 #include "base/trace_event/memory_pressure_level_proto.h"
@@ -487,7 +486,7 @@
   // This can only be called for a tab that is waiting to be loaded so this
   // should never fail.
   auto it = FindTabToLoad(contents);
-  CHECK(it != tabs_to_load_.end(), base::NotFatalUntil::M130);
+  CHECK(it != tabs_to_load_.end());
   tabs_to_load_.erase(it);
   delegate_->RemoveTabForScoring(contents);
 
@@ -544,7 +543,7 @@
   // This can only be called for a tab that is waiting to be loaded so this
   // should never fail.
   auto it = FindTabToLoad(contents);
-  CHECK(it != tabs_to_load_.end(), base::NotFatalUntil::M130);
+  CHECK(it != tabs_to_load_.end());
   tabs_to_load_.erase(it);
   delegate_->RemoveTabForScoring(contents);
 }
diff --git a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc
index 7428b272..4783dd684 100644
--- a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc
+++ b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc
@@ -8,7 +8,6 @@
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/supports_user_data.h"
 #include "base/types/optional_util.h"
 #include "build/build_config.h"
@@ -96,7 +95,7 @@
 
   void RemoveProxy(ProxyingURLLoaderFactory* proxy) {
     auto it = proxies_.find(proxy);
-    CHECK(it != proxies_.end(), base::NotFatalUntil::M130);
+    CHECK(it != proxies_.end());
     proxies_.erase(it);
   }
 
@@ -576,7 +575,7 @@
 
 void ProxyingURLLoaderFactory::RemoveRequest(InProgressRequest* request) {
   auto it = requests_.find(request);
-  CHECK(it != requests_.end(), base::NotFatalUntil::M130);
+  CHECK(it != requests_.end());
   requests_.erase(it);
 
   MaybeDestroySelf();
diff --git a/chrome/browser/sync/test/integration/bookmarks_helper.cc b/chrome/browser/sync/test/integration/bookmarks_helper.cc
index a9643f9..6ac3cf6e 100644
--- a/chrome/browser/sync/test/integration/bookmarks_helper.cc
+++ b/chrome/browser/sync/test/integration/bookmarks_helper.cc
@@ -22,7 +22,6 @@
 #include "base/files/file_util.h"
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/path_service.h"
 #include "base/rand_util.h"
 #include "base/run_loop.h"
@@ -1186,12 +1185,10 @@
     // Check that the local |node| and the server entity have the same position.
     auto parent_iter =
         server_uuids_by_parent_id.find(server_entity.parent_id_string());
-    CHECK(parent_iter != server_uuids_by_parent_id.end(),
-          base::NotFatalUntil::M130);
+    CHECK(parent_iter != server_uuids_by_parent_id.end());
     auto server_position_iter =
         std::ranges::find(parent_iter->second, node->uuid());
-    CHECK(server_position_iter != parent_iter->second.end(),
-          base::NotFatalUntil::M130);
+    CHECK(server_position_iter != parent_iter->second.end());
     const size_t server_position =
         server_position_iter - parent_iter->second.begin();
     const size_t local_position = node->parent()->GetIndexOf(node).value();
diff --git a/chrome/browser/task_manager/mock_web_contents_task_manager.cc b/chrome/browser/task_manager/mock_web_contents_task_manager.cc
index 0aa4f9fb..7436bf5 100644
--- a/chrome/browser/task_manager/mock_web_contents_task_manager.cc
+++ b/chrome/browser/task_manager/mock_web_contents_task_manager.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 
 namespace task_manager {
@@ -25,7 +24,7 @@
 void MockWebContentsTaskManager::TaskRemoved(Task* task) {
   DCHECK(task);
   const auto it = std::ranges::find(tasks_, task);
-  CHECK(it != tasks_.end(), base::NotFatalUntil::M130);
+  CHECK(it != tasks_.end());
   tasks_.erase(it);
 }
 
diff --git a/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.cc b/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.cc
index e444312a..00c6e36 100644
--- a/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.cc
+++ b/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/task_manager/providers/per_profile_worker_task_tracker.h"
 
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 #include "chrome/browser/task_manager/providers/worker_task.h"
 #include "chrome/browser/task_manager/providers/worker_task_provider.h"
 #include "content/public/browser/render_process_host.h"
@@ -161,7 +160,7 @@
     const WorkerId& worker_id,
     base::flat_map<WorkerId, std::unique_ptr<WorkerTask>>* out_worker_tasks) {
   auto it = out_worker_tasks->find(worker_id);
-  CHECK(it != out_worker_tasks->end(), base::NotFatalUntil::M130);
+  CHECK(it != out_worker_tasks->end());
   worker_task_provider_->OnWorkerTaskRemoved(it->second.get());
   out_worker_tasks->erase(it);
 }
@@ -172,7 +171,7 @@
     const GURL& script_url,
     base::flat_map<WorkerId, std::unique_ptr<WorkerTask>>* out_worker_tasks) {
   auto it = out_worker_tasks->find(worker_id);
-  CHECK(it != out_worker_tasks->end(), base::NotFatalUntil::M130);
+  CHECK(it != out_worker_tasks->end());
   it->second->SetScriptUrl(script_url);
 }
 
diff --git a/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc b/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc
index 397b028..ca690fe 100644
--- a/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc
+++ b/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc
@@ -12,7 +12,6 @@
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "chrome/browser/task_manager/providers/web_contents/back_forward_cache_task.h"
 #include "chrome/browser/task_manager/providers/web_contents/fenced_frame_task.h"
@@ -572,7 +571,7 @@
   DCHECK(web_contents);
 
   auto itr = entries_map_.find(web_contents);
-  CHECK(itr != entries_map_.end(), base::NotFatalUntil::M130);
+  CHECK(itr != entries_map_.end());
 
   // Must manually clear the tasks and notify the observer.
   itr->second->ClearAllTasks(true);
diff --git a/chrome/browser/task_manager/providers/worker_task_provider.cc b/chrome/browser/task_manager/providers/worker_task_provider.cc
index 297fa2f..48ff4ae 100644
--- a/chrome/browser/task_manager/providers/worker_task_provider.cc
+++ b/chrome/browser/task_manager/providers/worker_task_provider.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/task_manager/providers/worker_task_provider.h"
 
-#include "base/not_fatal_until.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/task_manager/providers/per_profile_worker_task_tracker.h"
@@ -56,8 +55,7 @@
   observed_profiles_.RemoveObservation(profile);
 
   auto it = per_profile_worker_task_trackers_.find(profile);
-  CHECK(it != per_profile_worker_task_trackers_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(it != per_profile_worker_task_trackers_.end());
   per_profile_worker_task_trackers_.erase(it);
 }
 
diff --git a/chrome/browser/task_manager/sampling/task_manager_impl.cc b/chrome/browser/task_manager/sampling/task_manager_impl.cc
index ae160613..4b816c10 100644
--- a/chrome/browser/task_manager/sampling/task_manager_impl.cc
+++ b/chrome/browser/task_manager/sampling/task_manager_impl.cc
@@ -16,7 +16,6 @@
 #include "base/containers/adapters.h"
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/task/thread_pool.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
@@ -706,7 +705,7 @@
 
 TaskGroup* TaskManagerImpl::GetTaskGroupByTaskId(TaskId task_id) const {
   auto it = task_groups_by_task_id_.find(task_id);
-  CHECK(it != task_groups_by_task_id_.end(), base::NotFatalUntil::M130);
+  CHECK(it != task_groups_by_task_id_.end());
   return it->second;
 }
 
diff --git a/chrome/browser/trusted_vault/trusted_vault_client_android.cc b/chrome/browser/trusted_vault/trusted_vault_client_android.cc
index 3c915f0e..ca5f51ae 100644
--- a/chrome/browser/trusted_vault/trusted_vault_client_android.cc
+++ b/chrome/browser/trusted_vault/trusted_vault_client_android.cc
@@ -10,7 +10,6 @@
 #include "base/android/jni_android.h"
 #include "base/check_op.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "components/sync/service/sync_service_utils.h"
 #include "content/public/browser/browser_thread.h"
@@ -261,7 +260,7 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   auto it = ongoing_requests_.find(id);
-  CHECK(it != ongoing_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(it != ongoing_requests_.end());
 
   OngoingRequest request = std::move(it->second);
   ongoing_requests_.erase(it);
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index e7d199a..1394199 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -762,6 +762,7 @@
 
   if (is_android) {
     sources += [
+      "android/accelerator_utils_android.cc",
       "android/android_about_app_info.cc",
       "android/android_about_app_info.h",
       "android/autofill/authenticator_selection_dialog_view_android.cc",
diff --git a/chrome/browser/android/keyboard_shortcuts.cc b/chrome/browser/ui/android/accelerator_utils_android.cc
similarity index 85%
rename from chrome/browser/android/keyboard_shortcuts.cc
rename to chrome/browser/ui/android/accelerator_utils_android.cc
index bf36a20..df7c361 100644
--- a/chrome/browser/android/keyboard_shortcuts.cc
+++ b/chrome/browser/ui/android/accelerator_utils_android.cc
@@ -2,9 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/keyboard_shortcuts.h"
-
-#include <jni.h>
+#include "chrome/browser/ui/accelerator_utils.h"
 
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/events/android/events_android_utils.h"
@@ -14,7 +12,7 @@
 // Must come after all headers that specialize FromJniType() / ToJniType().
 #include "chrome/android/chrome_jni_headers/KeyboardShortcuts_jni.h"
 
-namespace chrome::android {
+namespace chrome {
 
 bool IsChromeAccelerator(const ui::Accelerator& accelerator) {
   ui::KeyEvent key_event = accelerator.ToKeyEvent();
@@ -25,4 +23,4 @@
       env, platform_event.AsKeyboardEventAndroid()->GetJavaObject());
 }
 
-}  // namespace chrome::android
+}  // namespace chrome
diff --git a/chrome/browser/ui/android/device_dialog/serial_chooser_dialog_android.cc b/chrome/browser/ui/android/device_dialog/serial_chooser_dialog_android.cc
index 827c3568..5853182 100644
--- a/chrome/browser/ui/android/device_dialog/serial_chooser_dialog_android.cc
+++ b/chrome/browser/ui/android/device_dialog/serial_chooser_dialog_android.cc
@@ -14,7 +14,6 @@
 #include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/url_constants.h"
@@ -244,7 +243,7 @@
 void SerialChooserDialogAndroid::OnItemSelected(JNIEnv* env,
                                                 std::string& item_id) {
   auto it = std::ranges::find(item_id_map_, item_id);
-  CHECK(it != item_id_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != item_id_map_.end());
   controller_->Select(
       {static_cast<size_t>(std::distance(item_id_map_.begin(), it))});
   std::move(on_close_).Run();
diff --git a/chrome/browser/ui/android/device_dialog/usb_chooser_dialog_android.cc b/chrome/browser/ui/android/device_dialog/usb_chooser_dialog_android.cc
index 82b3ef9..25a01a33 100644
--- a/chrome/browser/ui/android/device_dialog/usb_chooser_dialog_android.cc
+++ b/chrome/browser/ui/android/device_dialog/usb_chooser_dialog_android.cc
@@ -12,7 +12,6 @@
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/url_constants.h"
@@ -168,7 +167,7 @@
 void UsbChooserDialogAndroid::OnItemSelected(JNIEnv* env,
                                              std::string& item_id) {
   auto it = std::ranges::find(item_id_map_, item_id);
-  CHECK(it != item_id_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != item_id_map_.end());
   controller_->Select(
       {static_cast<size_t>(std::distance(item_id_map_.begin(), it))});
   std::move(on_close_).Run();
diff --git a/chrome/browser/ui/android/hats/hats_service_android.cc b/chrome/browser/ui/android/hats/hats_service_android.cc
index 35ad04a..11dd1a2 100644
--- a/chrome/browser/ui/android/hats/hats_service_android.cc
+++ b/chrome/browser/ui/android/hats/hats_service_android.cc
@@ -11,7 +11,6 @@
 
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/task/sequenced_task_runner.h"
 #include "chrome/browser/android/resource_mapper.h"
@@ -78,10 +77,11 @@
 
   ui::WindowAndroid* window_android = web_contents()->GetTopLevelNativeWindow();
 
-  hats::SurveyUiDelegateAndroid delegate(message_.get(), window_android);
+  delegate_ = std::make_unique<hats::SurveyUiDelegateAndroid>(message_.get(),
+                                                              window_android);
 
   // Create survey client with delegate.
-  hats::SurveyClientAndroid survey_client(trigger_, &delegate,
+  hats::SurveyClientAndroid survey_client(trigger_, delegate_.get(),
                                           hats_service_->profile(),
                                           supplied_trigger_id_, window_android);
   survey_client.LaunchSurvey(window_android, product_specific_bits_data_,
@@ -271,8 +271,7 @@
                           return pair.second.trigger_id;
                         });
 
-  CHECK(trigger_survey_config != survey_configs_by_triggers_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(trigger_survey_config != survey_configs_by_triggers_.end());
   std::string trigger = trigger_survey_config->first;
 
   UMA_HISTOGRAM_ENUMERATION(kHatsShouldShowSurveyReasonAndroidHistogram,
diff --git a/chrome/browser/ui/android/hats/hats_service_android.h b/chrome/browser/ui/android/hats/hats_service_android.h
index fa01441..630c970 100644
--- a/chrome/browser/ui/android/hats/hats_service_android.h
+++ b/chrome/browser/ui/android/hats/hats_service_android.h
@@ -17,6 +17,7 @@
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
+#include "chrome/browser/ui/android/hats/survey_ui_delegate_android.h"
 #include "chrome/browser/ui/hats/hats_service.h"
 #include "components/messages/android/message_enums.h"
 #include "content/public/browser/web_contents.h"
@@ -79,6 +80,7 @@
     raw_ptr<HatsServiceAndroid> hats_service_;
 
     std::unique_ptr<messages::MessageWrapper> message_;
+    std::unique_ptr<hats::SurveyUiDelegateAndroid> delegate_;
     std::string trigger_;
     SurveyBitsData product_specific_bits_data_;
     SurveyStringData product_specific_string_data_;
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index ca7b8b6..1a2c113 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -4955,6 +4955,9 @@
       <message name="IDS_ACCESSIBILITY_NEW_INCOGNITO_TAB_PAGE" desc="Accessibility text to read aloud when the user focuses the new Incognito tab view.">
         New Incognito tab
       </message>
+      <message name="IDS_ACCESSIBILITY_INCOGNITO_3PC_SETTINGS" desc="Content description of the cookie controls icon displayed on the new incognito tab which navigates to the third-party cookies settings.">
+        Third-party cookies settings
+      </message>
       <message name="IDS_ACCESSIBILITY_TOOLBAR_BTN_NEW_TAB" desc="Content description for the new tab button.">
         New tab
       </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_INCOGNITO_3PC_SETTINGS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_INCOGNITO_3PC_SETTINGS.png.sha1
new file mode 100644
index 0000000..18e8f1a
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_ACCESSIBILITY_INCOGNITO_3PC_SETTINGS.png.sha1
@@ -0,0 +1 @@
+0660ec87e35b5785268afd9fe5fd812d8ee1eae7
\ No newline at end of file
diff --git a/chrome/browser/ui/ash/main_extra_parts/chrome_browser_main_extra_parts_ash.cc b/chrome/browser/ui/ash/main_extra_parts/chrome_browser_main_extra_parts_ash.cc
index 76d2c03..81cbd73 100644
--- a/chrome/browser/ui/ash/main_extra_parts/chrome_browser_main_extra_parts_ash.cc
+++ b/chrome/browser/ui/ash/main_extra_parts/chrome_browser_main_extra_parts_ash.cc
@@ -248,7 +248,8 @@
   screen_orientation_delegate_ =
       std::make_unique<ScreenOrientationDelegateChromeos>();
 
-  app_list_client_ = std::make_unique<AppListClientImpl>();
+  app_list_client_ =
+      std::make_unique<AppListClientImpl>(user_manager::UserManager::Get());
 
   // Must be available at login screen, so initialize before profile.
   accessibility_controller_client_ =
diff --git a/chrome/browser/ui/hats/hats_service_desktop.cc b/chrome/browser/ui/hats/hats_service_desktop.cc
index d60f599..6322f04 100644
--- a/chrome/browser/ui/hats/hats_service_desktop.cc
+++ b/chrome/browser/ui/hats/hats_service_desktop.cc
@@ -14,7 +14,6 @@
 #include "base/functional/callback_helpers.h"
 #include "base/json/values_util.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/rand_util.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/values.h"
@@ -591,8 +590,7 @@
                           return pair.second.trigger_id;
                         });
 
-  CHECK(trigger_survey_config != survey_configs_by_triggers_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(trigger_survey_config != survey_configs_by_triggers_.end());
   std::string trigger = trigger_survey_config->first;
 
   UMA_HISTOGRAM_ENUMERATION(kHatsShouldShowSurveyReasonHistogram,
diff --git a/chrome/browser/ui/hid/hid_chooser_controller.cc b/chrome/browser/ui/hid/hid_chooser_controller.cc
index 15e6cfc..db2cb53 100644
--- a/chrome/browser/ui/hid/hid_chooser_controller.cc
+++ b/chrome/browser/ui/hid/hid_chooser_controller.cc
@@ -11,7 +11,6 @@
 #include "base/command_line.h"
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/chooser_controller/title_util.h"
 #include "chrome/browser/hid/hid_chooser_context.h"
@@ -392,7 +391,7 @@
     const device::mojom::HidDeviceInfo& device) {
   auto id = PhysicalDeviceIdFromDeviceInfo(device);
   auto find_it = device_map_.find(id);
-  CHECK(find_it != device_map_.end(), base::NotFatalUntil::M130);
+  CHECK(find_it != device_map_.end());
   auto& device_infos = find_it->second;
   std::erase_if(device_infos,
                 [&device](const device::mojom::HidDeviceInfoPtr& d) {
@@ -411,10 +410,10 @@
     const device::mojom::HidDeviceInfo& device) {
   auto id = PhysicalDeviceIdFromDeviceInfo(device);
   auto physical_device_it = device_map_.find(id);
-  CHECK(physical_device_it != device_map_.end(), base::NotFatalUntil::M130);
+  CHECK(physical_device_it != device_map_.end());
   auto& device_infos = physical_device_it->second;
   auto device_it = std::ranges::find(device_infos, device.guid,
                                      &device::mojom::HidDeviceInfo::guid);
-  CHECK(device_it != device_infos.end(), base::NotFatalUntil::M130);
+  CHECK(device_it != device_infos.end());
   *device_it = device.Clone();
 }
diff --git a/chrome/browser/ui/hung_plugin_tab_helper.cc b/chrome/browser/ui/hung_plugin_tab_helper.cc
index 5540315..757e5a7 100644
--- a/chrome/browser/ui/hung_plugin_tab_helper.cc
+++ b/chrome/browser/ui/hung_plugin_tab_helper.cc
@@ -10,7 +10,6 @@
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/process/process.h"
 #include "build/build_config.h"
 #include "chrome/browser/hang_monitor/hang_crash_dump.h"
@@ -169,7 +168,7 @@
   // The timer should have been cancelled if the record isn't in our map
   // anymore.
   auto found = hung_plugins_.find(child_id);
-  CHECK(found != hung_plugins_.end(), base::NotFatalUntil::M130);
+  CHECK(found != hung_plugins_.end());
   DCHECK(!found->second->infobar);
   ShowBar(child_id, found->second.get());
 }
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.cc b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.cc
index 5b1dbf9..8617918 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.cc
+++ b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.cc
@@ -12,7 +12,6 @@
 #include "base/functional/callback_forward.h"
 #include "base/functional/callback_helpers.h"
 #include "base/metrics/user_metrics.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/uuid.h"
 #include "chrome/browser/collaboration/collaboration_service_factory.h"
@@ -279,7 +278,7 @@
   tab_groups::TabGroupSyncService* tab_group_service =
       tab_groups::SavedTabGroupUtils::GetServiceForProfile(browser->profile());
 
-  CHECK(group_ids.size() > 0, base::NotFatalUntil::M130);
+  CHECK(group_ids.size() > 0);
 
   // Confirmation is only needed if SavedTabGroups are being deleted. If the
   // service doesnt exist there are no saved tab groups.
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_delegate_desktop.cc b/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_delegate_desktop.cc
index 0199fb37..87f6c79b 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_delegate_desktop.cc
+++ b/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_delegate_desktop.cc
@@ -9,7 +9,6 @@
 
 #include "base/containers/contains.h"
 #include "base/containers/flat_set.h"
-#include "base/not_fatal_until.h"
 #include "base/uuid.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
@@ -250,8 +249,7 @@
   }
 
   const LocalTabGroupID& group_id = group.local_group_id().value();
-  CHECK(listener_->IsTrackingLocalTabGroup(group_id),
-        base::NotFatalUntil::M135);
+  CHECK(listener_->IsTrackingLocalTabGroup(group_id));
 
   // Update the local group with the new data. This will open new tabs, close
   // tabs, and navigate tabs to match the saved group.
diff --git a/chrome/browser/ui/tabs/tab_strip_api/BUILD.gn b/chrome/browser/ui/tabs/tab_strip_api/BUILD.gn
index 9624dbe..8fd2911 100644
--- a/chrome/browser/ui/tabs/tab_strip_api/BUILD.gn
+++ b/chrome/browser/ui/tabs/tab_strip_api/BUILD.gn
@@ -55,10 +55,16 @@
     "adapters",
     "//chrome/browser/ui/tabs:tab_strip_model_observer",
   ]
+
+  deps = [ "//chrome/browser/ui/tabs/tab_strip_api/events:events" ]
 }
 
 source_set("impl") {
-  sources = [ "tab_strip_service_impl.cc" ]
+  sources = [
+    "event_broadcaster.cc",
+    "event_broadcaster.h",
+    "tab_strip_service_impl.cc",
+  ]
 
   public_deps = [ "//chrome/browser:browser_public_dependencies" ]
 
@@ -67,6 +73,7 @@
     ":types",
     "adapters:impl",
     "converters",
+    "events",
     "//chrome/browser/ui",
     "//chrome/browser/ui/browser_window:browser_window",
     "//chrome/browser/ui/tabs:tab_strip",
@@ -93,6 +100,7 @@
     ":impl",
     ":tab_strip_api",
     "converters:unit_tests",
+    "events:unit_tests",
     "testing",
     "//base/test:test_support",
     "//chrome/browser/ui/browser_window:browser_window",
diff --git a/chrome/browser/ui/tabs/tab_strip_api/event_broadcaster.cc b/chrome/browser/ui/tabs/tab_strip_api/event_broadcaster.cc
new file mode 100644
index 0000000..4f975a1
--- /dev/null
+++ b/chrome/browser/ui/tabs/tab_strip_api/event_broadcaster.cc
@@ -0,0 +1,38 @@
+// 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/ui/tabs/tab_strip_api/event_broadcaster.h"
+
+namespace tabs_api {
+
+// A decoder which takes the incoming event type and directs them to the proper
+// callback.
+class EventVisitor {
+ public:
+  explicit EventVisitor(
+      const mojo::AssociatedRemote<tabs_api::mojom::TabsObserver>* target)
+      : target_(target) {}
+
+  void operator()(mojom::OnTabsCreatedEventPtr& event) {
+    (*target_)->OnTabsCreated(event.Clone());
+  }
+
+  void operator()(mojom::OnTabsClosedEventPtr& event) {
+    (*target_)->OnTabsClosed(event.Clone());
+  }
+
+ private:
+  raw_ptr<const mojo::AssociatedRemote<tabs_api::mojom::TabsObserver>> target_;
+};
+
+void EventBroadcaster::Broadcast(
+    const mojo::AssociatedRemoteSet<tabs_api::mojom::TabsObserver>& targets,
+    events::Event& event) {
+  for (auto& target : targets) {
+    EventVisitor visitor(&target);
+    std::visit(visitor, event);
+  }
+}
+
+}  // namespace tabs_api
diff --git a/chrome/browser/ui/tabs/tab_strip_api/event_broadcaster.h b/chrome/browser/ui/tabs/tab_strip_api/event_broadcaster.h
new file mode 100644
index 0000000..b0a60ff
--- /dev/null
+++ b/chrome/browser/ui/tabs/tab_strip_api/event_broadcaster.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_UI_TABS_TAB_STRIP_API_EVENT_BROADCASTER_H_
+#define CHROME_BROWSER_UI_TABS_TAB_STRIP_API_EVENT_BROADCASTER_H_
+
+#include "chrome/browser/ui/tabs/tab_strip_api//events/event.h"
+#include "chrome/browser/ui/tabs/tab_strip_api/tab_strip_api.mojom.h"
+#include "mojo/public/cpp/bindings/remote_set.h"
+
+namespace tabs_api {
+
+// Simple tee which takes an event and broadcasts them to multiple targets.
+class EventBroadcaster {
+ public:
+  EventBroadcaster() = default;
+  EventBroadcaster(EventBroadcaster&&) = delete;
+  EventBroadcaster& operator=(EventBroadcaster&) = delete;
+  ~EventBroadcaster() = default;
+
+  void Broadcast(
+      const mojo::AssociatedRemoteSet<tabs_api::mojom::TabsObserver>& targets,
+      events::Event& event);
+};
+
+}  // namespace tabs_api
+
+#endif  // CHROME_BROWSER_UI_TABS_TAB_STRIP_API_EVENT_BROADCASTER_H_
diff --git a/chrome/browser/ui/tabs/tab_strip_api/events/BUILD.gn b/chrome/browser/ui/tabs/tab_strip_api/events/BUILD.gn
new file mode 100644
index 0000000..70a26468
--- /dev/null
+++ b/chrome/browser/ui/tabs/tab_strip_api/events/BUILD.gn
@@ -0,0 +1,32 @@
+# 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("events") {
+  sources = [
+    "event.h",
+    "event_transformation.cc",
+    "event_transformation.h",
+    "tab_strip_event_recorder.cc",
+    "tab_strip_event_recorder.h",
+  ]
+
+  deps = [
+    "//chrome/browser/ui/tabs:tab_strip_model_observer",
+    "//chrome/browser/ui/tabs/tab_strip_api:mojom",
+    "//chrome/browser/ui/tabs/tab_strip_api:types",
+  ]
+}
+
+source_set("unit_tests") {
+  testonly = true
+
+  sources = [ "tab_strip_event_recorder_unittest.cc" ]
+
+  deps = [
+    ":events",
+    "//base/test:test_support",
+    "//chrome/browser/ui/tabs/tab_strip_api:mojom",
+    "//testing/gtest",
+  ]
+}
diff --git a/chrome/browser/ui/tabs/tab_strip_api/events/event.h b/chrome/browser/ui/tabs/tab_strip_api/events/event.h
new file mode 100644
index 0000000..f9e7e86e
--- /dev/null
+++ b/chrome/browser/ui/tabs/tab_strip_api/events/event.h
@@ -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.
+
+#ifndef CHROME_BROWSER_UI_TABS_TAB_STRIP_API_EVENTS_EVENT_H_
+#define CHROME_BROWSER_UI_TABS_TAB_STRIP_API_EVENTS_EVENT_H_
+
+#include <variant>
+
+#include "chrome/browser/ui/tabs/tab_strip_api/tab_strip_api.mojom.h"
+
+namespace tabs_api::events {
+
+using Event =
+    std::variant<mojom::OnTabsCreatedEventPtr, mojom::OnTabsClosedEventPtr>;
+
+}
+
+#endif  // CHROME_BROWSER_UI_TABS_TAB_STRIP_API_EVENTS_EVENT_H_
diff --git a/chrome/browser/ui/tabs/tab_strip_api/events/event_transformation.cc b/chrome/browser/ui/tabs/tab_strip_api/events/event_transformation.cc
new file mode 100644
index 0000000..bb762fc
--- /dev/null
+++ b/chrome/browser/ui/tabs/tab_strip_api/events/event_transformation.cc
@@ -0,0 +1,35 @@
+// 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/ui/tabs/tab_strip_api/events/event_transformation.h"
+
+#include "base/strings/string_number_conversions.h"
+#include "chrome/browser/ui/tabs/tab_strip_api/tab_id.h"
+
+namespace tabs_api::events {
+
+mojom::OnTabsCreatedEventPtr ToEvent(
+    const TabStripModelChange::Insert& insert) {
+  auto event = mojom::OnTabsCreatedEvent::New();
+  for (auto& content : insert.contents) {
+    event->tabs.emplace_back(
+        TabId::Type::kContent,
+        base::NumberToString(content.tab->GetHandle().raw_value()));
+  }
+  return event;
+}
+
+mojom::OnTabsClosedEventPtr ToEvent(const TabStripModelChange::Remove& remove) {
+  auto event = mojom::OnTabsClosedEvent::New();
+
+  for (auto& content : remove.contents) {
+    event->tabs.emplace_back(
+        TabId::Type::kContent,
+        base::NumberToString(content.tab->GetHandle().raw_value()));
+  }
+
+  return event;
+}
+
+}  // namespace tabs_api::events
diff --git a/chrome/browser/ui/tabs/tab_strip_api/events/event_transformation.h b/chrome/browser/ui/tabs/tab_strip_api/events/event_transformation.h
new file mode 100644
index 0000000..dfa8922
--- /dev/null
+++ b/chrome/browser/ui/tabs/tab_strip_api/events/event_transformation.h
@@ -0,0 +1,24 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_TABS_TAB_STRIP_API_EVENTS_EVENT_TRANSFORMATION_H_
+#define CHROME_BROWSER_UI_TABS_TAB_STRIP_API_EVENTS_EVENT_TRANSFORMATION_H_
+
+#include "chrome/browser/ui/tabs/tab_strip_api/events/event.h"
+#include "chrome/browser/ui/tabs/tab_strip_api/tab_strip_api.mojom.h"
+#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
+
+namespace tabs_api::events {
+
+// Utilities to convert external observation event types to native event::Event
+// types. Unfortunately, external event types are not always easy to test, so
+// some of the conversions are not covered by unit tests and must be covered in
+// integration tests.
+
+mojom::OnTabsCreatedEventPtr ToEvent(const TabStripModelChange::Insert& insert);
+mojom::OnTabsClosedEventPtr ToEvent(const TabStripModelChange::Remove& remove);
+
+}  // namespace tabs_api::events
+
+#endif  // CHROME_BROWSER_UI_TABS_TAB_STRIP_API_EVENTS_EVENT_TRANSFORMATION_H_
diff --git a/chrome/browser/ui/tabs/tab_strip_api/events/tab_strip_event_recorder.cc b/chrome/browser/ui/tabs/tab_strip_api/events/tab_strip_event_recorder.cc
new file mode 100644
index 0000000..9b35ba40
--- /dev/null
+++ b/chrome/browser/ui/tabs/tab_strip_api/events/tab_strip_event_recorder.cc
@@ -0,0 +1,71 @@
+// 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/ui/tabs/tab_strip_api/events/tab_strip_event_recorder.h"
+
+#include "chrome/browser/ui/tabs/tab_strip_api/events/event_transformation.h"
+
+namespace tabs_api::events {
+
+TabStripEventRecorder::TabStripEventRecorder() = default;
+TabStripEventRecorder::~TabStripEventRecorder() = default;
+
+void TabStripEventRecorder::StopNotificationAndStartRecording() {
+  mode_ = Mode::kRecording;
+}
+
+void TabStripEventRecorder::PlayRecordingsAndStartNotification() {
+  while (HasRecordedEvents()) {
+    auto event = std::move(recorded_.front());
+    recorded_.pop();
+    Notify(event);
+  }
+  mode_ = Mode::kPassthrough;
+}
+
+void TabStripEventRecorder::SetOnEventNotification(
+    base::RepeatingCallback<void(Event&)> notification) {
+  notification_ = std::move(notification);
+}
+
+bool TabStripEventRecorder::HasRecordedEvents() const {
+  return !recorded_.empty();
+}
+
+void TabStripEventRecorder::Notify(Event& event) {
+  if (notification_.is_null()) {
+    return;
+  }
+  notification_.Run(event);
+}
+
+void TabStripEventRecorder::Handle(Event event) {
+  if (mode_ == Mode::kPassthrough) {
+    Notify(event);
+  } else {
+    recorded_.push(std::move(event));
+  }
+}
+
+void TabStripEventRecorder::OnTabStripModelChanged(
+    TabStripModel* tab_strip_model,
+    const TabStripModelChange& change,
+    const TabStripSelectionChange& selection) {
+  switch (change.type()) {
+    case TabStripModelChange::Type::kSelectionOnly:
+      break;
+    case TabStripModelChange::Type::kInserted:
+      Handle(ToEvent(*change.GetInsert()));
+      break;
+    case TabStripModelChange::Type::kRemoved:
+      Handle(ToEvent(*change.GetRemove()));
+      break;
+    case TabStripModelChange::Type::kMoved:
+      NOTREACHED() << "not implemented";
+    case TabStripModelChange::Type::kReplaced:
+      NOTREACHED() << "not implemented";
+  }
+}
+
+}  // namespace tabs_api::events
diff --git a/chrome/browser/ui/tabs/tab_strip_api/events/tab_strip_event_recorder.h b/chrome/browser/ui/tabs/tab_strip_api/events/tab_strip_event_recorder.h
new file mode 100644
index 0000000..01d01ff
--- /dev/null
+++ b/chrome/browser/ui/tabs/tab_strip_api/events/tab_strip_event_recorder.h
@@ -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.
+
+#ifndef CHROME_BROWSER_UI_TABS_TAB_STRIP_API_EVENTS_TAB_STRIP_EVENT_RECORDER_H_
+#define CHROME_BROWSER_UI_TABS_TAB_STRIP_API_EVENTS_TAB_STRIP_EVENT_RECORDER_H_
+
+#include <queue>
+
+#include "base/functional/callback.h"
+#include "chrome/browser/ui/tabs/tab_strip_api/events/event.h"
+#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
+
+namespace tabs_api::events {
+
+// This object will handle incoming external events and convert them to native
+// events::Event type objects. Components in tab strip service should never
+// handle external event types and should only use native |events::Event|. This
+// object can also optional suppress notification and record incoming messages,
+// then replay them at a specific time.
+//
+// The notification mechanism is a simple |RepeatingCallback|.
+class TabStripEventRecorder : public TabStripModelObserver {
+ public:
+  TabStripEventRecorder();
+  TabStripEventRecorder(const TabStripEventRecorder&) = delete;
+  TabStripEventRecorder& operator=(const TabStripEventRecorder&) = delete;
+  ~TabStripEventRecorder() override;
+
+  // Stops client notification and begin recording incomingevents for later
+  // playback.
+  void StopNotificationAndStartRecording();
+  // Immediately run notification on all recorded events and stop recording.
+  // Clients will be notified of future events past this call.
+  void PlayRecordingsAndStartNotification();
+  // Sets the notification handler.
+  void SetOnEventNotification(
+      base::RepeatingCallback<void(Event&)> notification);
+  // Whether or not the recorder has recorded events.
+  bool HasRecordedEvents() const;
+
+  ///////////////////////////////////////////////////////////////////////////
+  // Integration points with external services.
+
+  // TabStripModelObserver overrides
+  void OnTabStripModelChanged(
+      TabStripModel* tab_strip_model,
+      const TabStripModelChange& change,
+      const TabStripSelectionChange& selection) override;
+
+ protected:
+  void Handle(Event event);
+  void Notify(Event& event);
+
+ private:
+  enum class Mode {
+    kPassthrough,  // Immediately notify, do not record.
+    kRecording,    // Do not notify, record incoming messages for later reply.
+  };
+  Mode mode_ = Mode::kPassthrough;
+  // Recorded events.
+  std::queue<Event> recorded_;
+
+  base::RepeatingCallback<void(Event&)> notification_;
+};
+
+}  // namespace tabs_api::events
+
+#endif  // CHROME_BROWSER_UI_TABS_TAB_STRIP_API_EVENTS_TAB_STRIP_EVENT_RECORDER_H_
diff --git a/chrome/browser/ui/tabs/tab_strip_api/events/tab_strip_event_recorder_unittest.cc b/chrome/browser/ui/tabs/tab_strip_api/events/tab_strip_event_recorder_unittest.cc
new file mode 100644
index 0000000..0c1b7a7a
--- /dev/null
+++ b/chrome/browser/ui/tabs/tab_strip_api/events/tab_strip_event_recorder_unittest.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/ui/tabs/tab_strip_api/events/tab_strip_event_recorder.h"
+
+#include "base/test/bind.h"
+#include "chrome/browser/ui/tabs/tab_strip_api/events/event.h"
+#include "chrome/browser/ui/tabs/tab_strip_api/tab_strip_api.mojom-forward.h"
+#include "chrome/browser/ui/tabs/tab_strip_api/tab_strip_api.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace tabs_api::events {
+namespace {
+
+class TestableRecorder : public TabStripEventRecorder {
+ public:
+  void Handle(Event event) { TabStripEventRecorder::Handle(std::move(event)); }
+};
+
+TEST(TabStripServiceEventRecorderTest, Notification) {
+  TestableRecorder recorder;
+
+  bool notified = false;
+  recorder.SetOnEventNotification(
+      base::BindLambdaForTesting([&](Event& event) { notified = true; }));
+
+  recorder.Handle(mojom::OnTabsCreatedEvent::New());
+
+  ASSERT_TRUE(notified);
+}
+
+TEST(TabStripServiceEventRecorderTest, NoNotificationRegistered) {
+  TestableRecorder recorder;
+  recorder.Handle(mojom::OnTabsCreatedEvent::New());
+
+  // Effectively noop, but is allowed.
+}
+
+TEST(TabStripServiceEventRecorderTest, StoppingAndStartingNotification) {
+  TestableRecorder recorder;
+
+  bool notified = false;
+  recorder.SetOnEventNotification(
+      base::BindLambdaForTesting([&](Event& event) { notified = true; }));
+
+  recorder.StopNotificationAndStartRecording();
+
+  auto event = mojom::OnTabsCreatedEvent::New();
+  event->tabs.emplace_back(TabId::Type::kContent, "123");
+
+  recorder.Handle(std::move(event));
+
+  // notification should have been suppressed.
+  ASSERT_FALSE(notified);
+
+  // re-enabling it should cause immediate playback.
+  recorder.PlayRecordingsAndStartNotification();
+
+  ASSERT_TRUE(notified);
+
+  // handling another notification should cause another notify.
+  notified = false;
+  recorder.Handle(mojom::OnTabsCreatedEvent::New());
+  ASSERT_TRUE(notified);
+}
+
+}  // namespace
+}  // namespace tabs_api::events
diff --git a/chrome/browser/ui/tabs/tab_strip_api/tab_id_traits_unittest.cc b/chrome/browser/ui/tabs/tab_strip_api/tab_id_traits_unittest.cc
index 344c9e8e..bb28893 100644
--- a/chrome/browser/ui/tabs/tab_strip_api/tab_id_traits_unittest.cc
+++ b/chrome/browser/ui/tabs/tab_strip_api/tab_id_traits_unittest.cc
@@ -10,7 +10,7 @@
 namespace tabs_api {
 namespace {
 
-TEST(TabsApiMojoTraitsTest, Convert) {
+TEST(TabsStripServiceMojoTraitsTest, Convert) {
   TabId original(TabId::Type::kCollection, "super_secret_id");
 
   auto serialized = mojom::TabId::Serialize(&original);
diff --git a/chrome/browser/ui/tabs/tab_strip_api/tab_strip_api.mojom b/chrome/browser/ui/tabs/tab_strip_api/tab_strip_api.mojom
index 256c595..aca73e9c 100644
--- a/chrome/browser/ui/tabs/tab_strip_api/tab_strip_api.mojom
+++ b/chrome/browser/ui/tabs/tab_strip_api/tab_strip_api.mojom
@@ -60,7 +60,10 @@
   array<Tab> tabs;
   // Updates to tabs would be sent through this update stream. Clients may
   // subscribe to this stream to receive update events.
-  pending_receiver<TabsObserver> stream;
+  // The interface is associated with the interface used to retrieve this
+  // stream. This means that the ordering of the message between the remote
+  // and the observation stream is preserved.
+  pending_associated_receiver<TabsObserver> stream;
 };
 
 // The TabStripService is an object that lives alongside the
@@ -104,11 +107,24 @@
       => result<mojo_base.mojom.Empty, mojo_base.mojom.Error>;
 };
 
+// TODO (crbug.com/411134070). Add in missing TabData.
+struct OnTabsCreatedEvent {
+  // Tab ids of the newly created tabs.
+  array<TabId> tabs;
+};
+
+struct OnTabsClosedEvent {
+  // Tab ids of the closed tabs.
+  array<TabId> tabs;
+};
+
 // TODO (crbug.com/412955607)
 // TabsObserver is not a CheckedObserver. There is a potential UaF if the
 // observer list attempts to call a destroyed TabsObserver that hasn't removed
 // itself from the list.
 interface TabsObserver {
-  // TODO (crbug.com/411134070). Add in missing TabData.
-  OnTabsCreated(array<Position> pos);
+  // When new tabs have been created on the tab strip.
+  OnTabsCreated(OnTabsCreatedEvent event);
+  // When tabs have been closed on the tab strip.
+  OnTabsClosed(OnTabsClosedEvent event);
 };
diff --git a/chrome/browser/ui/tabs/tab_strip_api/tab_strip_service_impl.cc b/chrome/browser/ui/tabs/tab_strip_api/tab_strip_service_impl.cc
index 292ff132..a6cca16 100644
--- a/chrome/browser/ui/tabs/tab_strip_api/tab_strip_service_impl.cc
+++ b/chrome/browser/ui/tabs/tab_strip_api/tab_strip_service_impl.cc
@@ -12,11 +12,21 @@
 #include "chrome/browser/ui/tabs/tab_strip_api/adapters/browser_adapter_impl.h"
 #include "chrome/browser/ui/tabs/tab_strip_api/adapters/tab_strip_model_adapter_impl.h"
 #include "chrome/browser/ui/tabs/tab_strip_api/converters/tab_converters.h"
+#include "chrome/browser/ui/tabs/tab_strip_api/event_broadcaster.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_delegate.h"
 #include "mojo/public/mojom/base/error.mojom.h"
+#include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
 #include "url/gurl.h"
 
+// Starting a mutation api will suppress incoming messages. This is intended to
+// prevent re-entrancy, and to guarantee that callbacks *always* follow method
+// response.
+#define RE_ENTRANCY_GUARD(recorder)              \
+  recorder->StopNotificationAndStartRecording(); \
+  auto cleanup = absl::MakeCleanup(              \
+      [this] { recorder->PlayRecordingsAndStartNotification(); });
+
 TabStripServiceImpl::TabStripServiceImpl(BrowserWindowInterface* browser,
                                          TabStripModel* tab_strip_model)
     : TabStripServiceImpl(
@@ -27,13 +37,31 @@
 TabStripServiceImpl::TabStripServiceImpl(
     std::unique_ptr<tabs_api::BrowserAdapter> browser_adapter,
     std::unique_ptr<tabs_api::TabStripModelAdapter> tab_strip_model_adapter)
+    : TabStripServiceImpl(
+          std::move(browser_adapter),
+          std::move(tab_strip_model_adapter),
+          std::make_unique<tabs_api::events::TabStripEventRecorder>()) {}
+
+TabStripServiceImpl::TabStripServiceImpl(
+    std::unique_ptr<tabs_api::BrowserAdapter> browser_adapter,
+    std::unique_ptr<tabs_api::TabStripModelAdapter> tab_strip_model_adapter,
+    std::unique_ptr<tabs_api::events::TabStripEventRecorder> recorder)
+
     : browser_adapter_(std::move(browser_adapter)),
-      tab_strip_model_adapter_(std::move(tab_strip_model_adapter)) {
-  tab_strip_model_adapter_->AddObserver(this);
+      tab_strip_model_adapter_(std::move(tab_strip_model_adapter)),
+      recorder_(std::move(recorder)) {
+  recorder_->SetOnEventNotification(base::BindRepeating(
+      &TabStripServiceImpl::BroadcastEvent, base::Unretained(this)));
+  tab_strip_model_adapter_->AddObserver(recorder_.get());
+}
+
+void TabStripServiceImpl::BroadcastEvent(tabs_api::events::Event& event) const {
+  tabs_api::EventBroadcaster broadcaster;
+  broadcaster.Broadcast(observers_, event);
 }
 
 TabStripServiceImpl::~TabStripServiceImpl() {
-  tab_strip_model_adapter_->RemoveObserver(this);
+  tab_strip_model_adapter_->RemoveObserver(recorder_.get());
 
   // Clear all observers
   // TODO (crbug.com/412955607): Implement a removal mechanism similar to
@@ -57,8 +85,8 @@
 
   // Now that we have a snapshot, create a event stream that will capture all
   // subsequent updates.
-  mojo::Remote<tabs_api::mojom::TabsObserver> stream;
-  auto pending_receiver = stream.BindNewPipeAndPassReceiver();
+  mojo::AssociatedRemote<tabs_api::mojom::TabsObserver> stream;
+  auto pending_receiver = stream.BindNewEndpointAndPassReceiver();
   observers_.Add(std::move(stream));
   snapshot->stream = std::move(pending_receiver);
 
@@ -104,6 +132,8 @@
 void TabStripServiceImpl::CreateTabAt(tabs_api::mojom::PositionPtr pos,
                                       const std::optional<GURL>& url,
                                       CreateTabAtCallback callback) {
+  RE_ENTRANCY_GUARD(recorder_)
+
   GURL target_url;
   if (url.has_value()) {
     target_url = url.value();
@@ -140,6 +170,8 @@
 
 void TabStripServiceImpl::CloseTabs(const std::vector<tabs_api::TabId>& ids,
                                     CloseTabsCallback callback) {
+  RE_ENTRANCY_GUARD(recorder_)
+
   std::vector<int32_t> tab_content_targets;
   for (const auto& id : ids) {
     if (id.Type() != tabs_api::TabId::Type::kContent) {
@@ -183,6 +215,8 @@
 
 void TabStripServiceImpl::ActivateTab(const tabs_api::TabId& id,
                                       ActivateTabCallback callback) {
+  RE_ENTRANCY_GUARD(recorder_);
+
   if (id.Type() != tabs_api::TabId::Type::kContent) {
     std::move(callback).Run(base::unexpected(
         mojo_base::mojom::Error::New(mojo_base::mojom::Code::kInvalidArgument,
@@ -209,38 +243,6 @@
   std::move(callback).Run(mojo_base::mojom::Empty::New());
 }
 
-void TabStripServiceImpl::OnTabStripModelChanged(
-    TabStripModel* tab_strip_model,
-    const TabStripModelChange& change,
-    const TabStripSelectionChange& selection) {
-  switch (change.type()) {
-    case TabStripModelChange::kInserted:
-      OnTabStripModelChangeAdded(*change.GetInsert());
-      break;
-    case TabStripModelChange::kRemoved:
-    case TabStripModelChange::kReplaced:
-    case TabStripModelChange::kMoved:
-    case TabStripModelChange::kSelectionOnly:
-      break;
-  }
-}
-
-void TabStripServiceImpl::OnTabStripModelChangeAdded(
-    const TabStripModelChange::Insert& insert_change) {
-  if (insert_change.contents.size() == 0) {
-    return;
-  }
-
-  for (auto& observer : observers_) {
-    std::vector<tabs_api::mojom::PositionPtr> positions;
-    for (const auto& content : insert_change.contents) {
-      auto pos = tabs_api::mojom::Position::New();
-      pos->index = content.index;
-      positions.emplace_back(std::move(pos));
-    }
-    observer->OnTabsCreated(std::move(positions));
-  }
-}
 
 void TabStripServiceImpl::Accept(
     mojo::PendingReceiver<tabs_api::mojom::TabStripService> client) {
diff --git a/chrome/browser/ui/tabs/tab_strip_api/tab_strip_service_impl.h b/chrome/browser/ui/tabs/tab_strip_api/tab_strip_service_impl.h
index 24bed5c5..5c9f9f8c 100644
--- a/chrome/browser/ui/tabs/tab_strip_api/tab_strip_service_impl.h
+++ b/chrome/browser/ui/tabs/tab_strip_api/tab_strip_service_impl.h
@@ -10,10 +10,10 @@
 #include "base/observer_list.h"
 #include "chrome/browser/ui/tabs/tab_strip_api/adapters/browser_adapter.h"
 #include "chrome/browser/ui/tabs/tab_strip_api/adapters/tab_strip_model_adapter.h"
+#include "chrome/browser/ui/tabs/tab_strip_api/events/tab_strip_event_recorder.h"
 #include "chrome/browser/ui/tabs/tab_strip_api/tab_id.h"
 #include "chrome/browser/ui/tabs/tab_strip_api/tab_strip_api.mojom.h"
 #include "chrome/browser/ui/tabs/tab_strip_api/tab_strip_service_register.h"
-#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
 
@@ -27,12 +27,16 @@
                             public TabStripModelObserver,
                             public TabStripServiceRegister {
  public:
-  explicit TabStripServiceImpl(BrowserWindowInterface* browser,
-                               TabStripModel* tab_strip_model);
-  explicit TabStripServiceImpl(
+  TabStripServiceImpl(BrowserWindowInterface* browser,
+                      TabStripModel* tab_strip_model);
+  TabStripServiceImpl(
       std::unique_ptr<tabs_api::BrowserAdapter> browser_adapter,
       std::unique_ptr<tabs_api::TabStripModelAdapter> tab_strip_adapter);
-  TabStripServiceImpl(const TabStripServiceImpl&) = delete;
+  TabStripServiceImpl(
+      std::unique_ptr<tabs_api::BrowserAdapter> browser_adapter,
+      std::unique_ptr<tabs_api::TabStripModelAdapter> tab_strip_adapter,
+      std::unique_ptr<tabs_api::events::TabStripEventRecorder> recorder);
+  TabStripServiceImpl(const TabStripServiceImpl&&) = delete;
   TabStripServiceImpl& operator=(const TabStripServiceImpl&) = delete;
   ~TabStripServiceImpl() override;
 
@@ -51,24 +55,19 @@
   void ActivateTab(const tabs_api::TabId& id,
                    ActivateTabCallback callback) override;
 
-  // TabStripModelObserver overrides
-  void OnTabStripModelChanged(
-      TabStripModel* tab_strip_model,
-      const TabStripModelChange& change,
-      const TabStripSelectionChange& selection) override;
-
   static base::PassKey<TabStripServiceImpl> get_passkey_for_testing() {
     return base::PassKey<TabStripServiceImpl>();
   }
 
  private:
-  void OnTabStripModelChangeAdded(const TabStripModelChange::Insert& change);
+  void BroadcastEvent(tabs_api::events::Event& event) const;
 
   std::unique_ptr<tabs_api::BrowserAdapter> browser_adapter_;
   std::unique_ptr<tabs_api::TabStripModelAdapter> tab_strip_model_adapter_;
+  std::unique_ptr<tabs_api::events::TabStripEventRecorder> recorder_;
 
   mojo::ReceiverSet<tabs_api::mojom::TabStripService> clients_;
-  mojo::RemoteSet<tabs_api::mojom::TabsObserver> observers_;
+  mojo::AssociatedRemoteSet<tabs_api::mojom::TabsObserver> observers_;
 };
 
 #endif  // CHROME_BROWSER_UI_TABS_TAB_STRIP_API_TAB_STRIP_SERVICE_IMPL_H_
diff --git a/chrome/browser/ui/tabs/tab_strip_api/tab_strip_service_impl_browsertest.cc b/chrome/browser/ui/tabs/tab_strip_api/tab_strip_service_impl_browsertest.cc
index ba2d7f9..c878a79 100644
--- a/chrome/browser/ui/tabs/tab_strip_api/tab_strip_service_impl_browsertest.cc
+++ b/chrome/browser/ui/tabs/tab_strip_api/tab_strip_service_impl_browsertest.cc
@@ -18,24 +18,30 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/public/test/browser_test.h"
-#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/mojom/base/error.mojom.h"
-#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
-using testing::_;
-
-class MockTabsObserver : public tabs_api::mojom::TabsObserver {
+class TestTabStripClient : public tabs_api::mojom::TabsObserver {
  public:
-  MockTabsObserver() = default;
-  ~MockTabsObserver() override = default;
+  void OnTabsCreated(tabs_api::mojom::OnTabsCreatedEventPtr event) override {
+    for (auto& id : event->tabs) {
+      tabs.push_back(id);
+    }
+  }
 
-  MOCK_METHOD(void,
-              OnTabsCreated,
-              (std::vector<tabs_api::mojom::PositionPtr> positions),
-              (override));
+  void OnTabsClosed(tabs_api::mojom::OnTabsClosedEventPtr event) override {
+    for (auto& id : event->tabs) {
+      if (auto found = std::find(tabs.begin(), tabs.end(), id);
+          found != tabs.end()) {
+        tabs.erase(found);
+      }
+    }
+  }
+
+  std::vector<tabs_api::TabId> tabs;
 };
 
 class TabStripServiceImplBrowserTest : public InProcessBrowserTest {
@@ -100,29 +106,14 @@
   ASSERT_EQ(model->GetActiveTab()->GetHandle(), handle);
 }
 
-IN_PROC_BROWSER_TEST_F(TabStripServiceImplBrowserTest, ObserverOnTabsCreated) {
+IN_PROC_BROWSER_TEST_F(TabStripServiceImplBrowserTest, Observation) {
   mojo::Remote<TabStripService> remote;
   tab_strip_service_impl_->Accept(remote.BindNewPipeAndPassReceiver());
-  MockTabsObserver mock_observer;
-  mojo::Receiver<tabs_api::mojom::TabsObserver> receiver(&mock_observer);
+  TestTabStripClient client;
+  mojo::AssociatedReceiver<tabs_api::mojom::TabsObserver> receiver(&client);
   const GURL url("http://example.com/");
   uint32_t target_index = 0;
 
-  EXPECT_CALL(
-      mock_observer,
-      OnTabsCreated(testing::Truly(
-          [&target_index](
-              const std::vector<tabs_api::mojom::PositionPtr>& positions) {
-            if (positions.size() != 1) {
-              return false;
-            }
-            if (!positions[0]) {
-              return false;
-            }
-            return positions[0]->index == target_index;
-          })))
-      .Times(1);
-
   base::RunLoop run_loop;
   tabs_api::mojom::PositionPtr position = CreatePosition(target_index);
 
@@ -130,6 +121,7 @@
   remote->GetTabs(
       base::BindLambdaForTesting([&](TabStripService::GetTabsResult result) {
         ASSERT_TRUE(result.has_value());
+        // This is where the client sets up the binding!
         receiver.Bind(std::move(result.value()->stream));
         get_tabs_loop.Quit();
       }));
@@ -144,9 +136,33 @@
       }));
   run_loop.Run();
 
+  // Ensure that we've received the observation callback, which are not
+  // guaranteed to happen immediately.
+  receiver.FlushForTesting();
+
   ASSERT_TRUE(result.has_value())
       << "CreateTabAt failed: " << (result.error()->message);
-  EXPECT_TRUE(result.value());
+  auto created_tab = std::move(result.value());
+
+  ASSERT_EQ(1ul, client.tabs.size());
+  ASSERT_EQ(created_tab->id, client.tabs.at(0));
+
+  TabStripService::CloseTabsResult close_result;
+  base::RunLoop close_tab_loop;
+  remote->CloseTabs(
+      {created_tab->id},
+      base::BindLambdaForTesting([&](TabStripService::CloseTabsResult in) {
+        close_result = std::move(in);
+        close_tab_loop.Quit();
+      }));
+  close_tab_loop.Run();
+
+  // Wait for observation.
+  receiver.FlushForTesting();
+
+  ASSERT_TRUE(close_result.has_value());
+  // Observation should have caused the tab to be removed.
+  ASSERT_EQ(0ul, client.tabs.size());
 }
 
 IN_PROC_BROWSER_TEST_F(TabStripServiceImplBrowserTest, CloseTabs) {
diff --git a/chrome/browser/ui/tabs/tab_strip_model.cc b/chrome/browser/ui/tabs/tab_strip_model.cc
index bed2c0f..a27ba51 100644
--- a/chrome/browser/ui/tabs/tab_strip_model.cc
+++ b/chrome/browser/ui/tabs/tab_strip_model.cc
@@ -32,7 +32,6 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
-#include "base/not_fatal_until.h"
 #include "base/notimplemented.h"
 #include "base/notreached.h"
 #include "base/observer_list.h"
@@ -123,8 +122,8 @@
 class ReentrancyCheck {
  public:
   explicit ReentrancyCheck(bool* guard_flag) : guard_flag_(guard_flag) {
-    CHECK_CURRENTLY_ON(content::BrowserThread::UI, base::NotFatalUntil::M130);
-    CHECK(!*guard_flag_, base::NotFatalUntil::M130);
+    CHECK_CURRENTLY_ON(content::BrowserThread::UI);
+    CHECK(!*guard_flag_);
     *guard_flag_ = true;
   }
 
diff --git a/chrome/browser/ui/thumbnails/thumbnail_image.cc b/chrome/browser/ui/thumbnails/thumbnail_image.cc
index 22bb7e2f..3796d77 100644
--- a/chrome/browser/ui/thumbnails/thumbnail_image.cc
+++ b/chrome/browser/ui/thumbnails/thumbnail_image.cc
@@ -9,7 +9,6 @@
 
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "base/time/time.h"
@@ -287,7 +286,7 @@
   // |subscription| in |subscribers_| with the last element, then pop it
   // off the back.
   auto it = std::ranges::find(subscribers_, subscription);
-  CHECK(it != subscribers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != subscribers_.end());
   std::swap(*it, *(subscribers_.end() - 1));
   subscribers_.pop_back();
 
diff --git a/chrome/browser/ui/thumbnails/thumbnail_scheduler_impl.cc b/chrome/browser/ui/thumbnails/thumbnail_scheduler_impl.cc
index f958af6..6366c071 100644
--- a/chrome/browser/ui/thumbnails/thumbnail_scheduler_impl.cc
+++ b/chrome/browser/ui/thumbnails/thumbnail_scheduler_impl.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 
 // static
 constexpr int ThumbnailSchedulerImpl::kMaxTotalCaptures;
@@ -176,7 +175,7 @@
 ThumbnailSchedulerImpl::TabNode* ThumbnailSchedulerImpl::GetTabNode(
     TabCapturer* tab) {
   auto it = tabs_.find(tab);
-  CHECK(it != tabs_.end(), base::NotFatalUntil::M130)
+  CHECK(it != tabs_.end())
       << "referenced tab that is not registered with scheduler";
   return &it->second;
 }
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_model.cc b/chrome/browser/ui/toolbar/toolbar_actions_model.cc
index 8c748d7..0cca9a7 100644
--- a/chrome/browser/ui/toolbar/toolbar_actions_model.cc
+++ b/chrome/browser/ui/toolbar/toolbar_actions_model.cc
@@ -14,7 +14,6 @@
 #include "base/location.h"
 #include "base/metrics/histogram_base.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/observer_list.h"
 #include "base/one_shot_event.h"
@@ -312,8 +311,7 @@
 
   auto current_position_on_toolbar =
       std::ranges::find(pinned_action_ids_, action_id);
-  CHECK(current_position_on_toolbar != pinned_action_ids_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(current_position_on_toolbar != pinned_action_ids_.end());
   size_t current_index_on_toolbar =
       current_position_on_toolbar - pinned_action_ids_.begin();
 
@@ -386,8 +384,7 @@
 
   auto current_position_in_prefs =
       std::ranges::find(stored_pinned_actions, action_id);
-  CHECK(current_position_in_prefs != stored_pinned_actions.end(),
-        base::NotFatalUntil::M130);
+  CHECK(current_position_in_prefs != stored_pinned_actions.end());
 
   // Rotate |action_id| to be in the target position.
   if (is_left_to_right_move) {
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
index 182c636..a68c0f8 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
@@ -11,7 +11,6 @@
 
 #include "base/containers/span.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/app_mode/app_mode_utils.h"
@@ -308,7 +307,7 @@
   const std::map<ui::Accelerator, int>& accelerator_table =
       GetAcceleratorTable();
   auto iter = accelerator_table.find(accelerator);
-  CHECK(iter != accelerator_table.end(), base::NotFatalUntil::M130);
+  CHECK(iter != accelerator_table.end());
   int command_id = iter->second;
   switch (command_id) {
     case IDC_CLOSE_WINDOW:
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc b/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc
index 2069e887..7af792b 100644
--- a/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc
+++ b/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc
@@ -10,7 +10,6 @@
 #include "base/files/file_path.h"
 #include "base/functional/callback.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/time/time.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/app/vector_icons/vector_icons.h"
@@ -510,7 +509,7 @@
   auto children = views::View::GetChildrenInZOrder();
   const auto move_child_to_top = [&](View* child) {
     auto it = std::ranges::find(children, child);
-    CHECK(it != children.end(), base::NotFatalUntil::M130);
+    CHECK(it != children.end());
     std::rotate(it, it + 1, children.end());
   };
   move_child_to_top(transparent_button_);
diff --git a/chrome/browser/ui/views/download/download_shelf_view.cc b/chrome/browser/ui/views/download/download_shelf_view.cc
index b8a4d0e2..f1e6c6e3 100644
--- a/chrome/browser/ui/views/download/download_shelf_view.cc
+++ b/chrome/browser/ui/views/download/download_shelf_view.cc
@@ -12,7 +12,6 @@
 
 #include "base/check.h"
 #include "base/containers/adapters.h"
-#include "base/not_fatal_until.h"
 #include "base/time/time.h"
 #include "chrome/browser/download/download_ui_model.h"
 #include "chrome/browser/themes/theme_properties.h"
@@ -255,7 +254,7 @@
 void DownloadShelfView::RemoveDownloadView(View* view) {
   DCHECK(view);
   const auto i = std::ranges::find(download_views_, view);
-  CHECK(i != download_views_.end(), base::NotFatalUntil::M130);
+  CHECK(i != download_views_.end());
   download_views_.erase(i);
   RemoveChildViewT(view);
   if (download_views_.empty()) {
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_view.cc
index 55ae5f1..81cd817 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_view.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_view.cc
@@ -11,7 +11,6 @@
 #include "base/feature_list.h"
 #include "base/i18n/case_conversion.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/chrome_pages.h"
@@ -456,7 +455,7 @@
                                 [](const ExtensionMenuItemView* item) {
                                   return item->view_controller()->GetId();
                                 });
-  CHECK(iter != extensions_menu_items_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != extensions_menu_items_.end());
   ExtensionMenuItemView* const view = *iter;
   DCHECK(Contains(view));
   view->parent()->RemoveChildViewT(view);
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
index b5097c3..efaea07 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
@@ -11,7 +11,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "chrome/app/vector_icons/vector_icons.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
@@ -263,7 +262,7 @@
 
   auto iter = std::ranges::find(actions_, action_id,
                                 &ToolbarActionViewController::GetId);
-  CHECK(iter != actions_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != actions_.end());
   // Ensure the action outlives the UI element to perform any cleanup.
   std::unique_ptr<ToolbarActionViewController> controller = std::move(*iter);
   actions_.erase(iter);
@@ -886,7 +885,7 @@
 void ExtensionsToolbarContainer::OnWidgetDestroying(views::Widget* widget) {
   auto iter =
       std::ranges::find(anchored_widgets_, widget, &AnchoredWidget::widget);
-  CHECK(iter != anchored_widgets_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != anchored_widgets_.end());
   iter->widget->RemoveObserver(this);
   const std::string extension_id = std::move(iter->extension_id);
   anchored_widgets_.erase(iter);
diff --git a/chrome/browser/ui/views/global_media_controls/media_item_ui_device_selector_view.cc b/chrome/browser/ui/views/global_media_controls/media_item_ui_device_selector_view.cc
index c02b1f3..16174dd 100644
--- a/chrome/browser/ui/views/global_media_controls/media_item_ui_device_selector_view.cc
+++ b/chrome/browser/ui/views/global_media_controls/media_item_ui_device_selector_view.cc
@@ -10,7 +10,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ui/global_media_controls/media_item_ui_device_selector_delegate.h"
@@ -456,7 +455,7 @@
 DeviceEntryUI* MediaItemUIDeviceSelectorView::GetDeviceEntryUI(
     views::View* view) const {
   auto it = device_entry_ui_map_.find(static_cast<views::Button*>(view)->tag());
-  CHECK(it != device_entry_ui_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != device_entry_ui_map_.end());
   return it->second;
 }
 
@@ -505,7 +504,7 @@
 
 void MediaItemUIDeviceSelectorView::OnDeviceSelected(int tag) {
   auto it = device_entry_ui_map_.find(tag);
-  CHECK(it != device_entry_ui_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != device_entry_ui_map_.end());
 
   if (it->second->GetType() == DeviceEntryUIType::kAudio) {
     delegate_->OnAudioSinkChosen(item_id_, it->second->raw_device_id());
diff --git a/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc b/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc
index 4cc5a6d2..ed6b65e2 100644
--- a/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc
+++ b/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc
@@ -8,7 +8,6 @@
 
 #include "base/check.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "build/build_config.h"
 #include "chrome/app/chrome_command_ids.h"
@@ -153,8 +152,7 @@
   const auto accelerators = GetAcceleratorList();
   const auto fullscreen_accelerator = std::ranges::find(
       accelerators, IDC_FULLSCREEN, &AcceleratorMapping::command_id);
-  CHECK(fullscreen_accelerator != accelerators.end(),
-        base::NotFatalUntil::M130);
+  CHECK(fullscreen_accelerator != accelerators.end());
   fullscreen_accelerator_ = ui::Accelerator(fullscreen_accelerator->keycode,
                                             fullscreen_accelerator->modifiers);
 #endif
diff --git a/chrome/browser/ui/views/payments/editor_view_controller.cc b/chrome/browser/ui/views/payments/editor_view_controller.cc
index b63af1f4..a5dccffa 100644
--- a/chrome/browser/ui/views/payments/editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/editor_view_controller.cc
@@ -9,7 +9,6 @@
 #include <memory>
 #include <utility>
 
-#include "base/not_fatal_until.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/chrome_typography.h"
@@ -460,7 +459,7 @@
     autofill::FieldType type,
     const std::u16string& error_message) {
   const auto& label_view_it = error_labels_.find(type);
-  CHECK(label_view_it != error_labels_.end(), base::NotFatalUntil::M130);
+  CHECK(label_view_it != error_labels_.end());
 
   if (error_message.empty()) {
     label_view_it->second->RemoveAllChildViews();
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.cc b/chrome/browser/ui/views/profiles/profile_picker_view.cc
index c894f2d1..a541b26c 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_view.cc
+++ b/chrome/browser/ui/views/profiles/profile_picker_view.cc
@@ -14,7 +14,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
@@ -799,7 +798,7 @@
 
 bool ProfilePickerView::AcceleratorPressed(const ui::Accelerator& accelerator) {
   const auto& iter = accelerator_table_.find(accelerator);
-  CHECK(iter != accelerator_table_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != accelerator_table_.end());
   int command_id = iter->second;
   switch (command_id) {
     case IDC_CLOSE_TAB:
diff --git a/chrome/browser/ui/views/toolbar/app_menu.cc b/chrome/browser/ui/views/toolbar/app_menu.cc
index ff43c83..bc911ad 100644
--- a/chrome/browser/ui/views/toolbar/app_menu.cc
+++ b/chrome/browser/ui/views/toolbar/app_menu.cc
@@ -19,7 +19,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
-#include "base/not_fatal_until.h"
 #include "base/scoped_observation.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/branding_buildflags.h"
@@ -1665,7 +1664,7 @@
 
 size_t AppMenu::ModelIndexFromCommandId(int command_id) const {
   auto ix = command_id_to_entry_.find(command_id);
-  CHECK(ix != command_id_to_entry_.end(), base::NotFatalUntil::M130);
+  CHECK(ix != command_id_to_entry_.end());
   return ix->second.second;
 }
 
diff --git a/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container.cc b/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container.cc
index 4a8e5f2..4a29bd9b 100644
--- a/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container.cc
+++ b/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container.cc
@@ -15,7 +15,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/user_metrics.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
 #include "chrome/browser/profiles/profile.h"
@@ -398,7 +397,7 @@
   DCHECK(data);
 
   const auto iter = std::ranges::find(pinned_buttons_, sender);
-  CHECK(iter != pinned_buttons_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != pinned_buttons_.end());
   auto* button = (*iter).get();
 
   ui::ImageModel icon =
diff --git a/chrome/browser/ui/web_applications/navigation_capturing_process.cc b/chrome/browser/ui/web_applications/navigation_capturing_process.cc
index e43a727..c1015e06 100644
--- a/chrome/browser/ui/web_applications/navigation_capturing_process.cc
+++ b/chrome/browser/ui/web_applications/navigation_capturing_process.cc
@@ -81,7 +81,7 @@
     case ui::PAGE_TRANSITION_FORM_SUBMIT:
       break;
     default:
-      NOTREACHED(base::NotFatalUntil::M135);
+      NOTREACHED();
   }
   if (base::to_underlying(ui::PageTransitionGetQualifier(transition)) != 0) {
     // Qualifiers indicate that this navigation was the result of a click on a
diff --git a/chrome/browser/ui/webui/discards/graph_dump_impl.cc b/chrome/browser/ui/webui/discards/graph_dump_impl.cc
index 2748b1dc..de42f7a4 100644
--- a/chrome/browser/ui/webui/discards/graph_dump_impl.cc
+++ b/chrome/browser/ui/webui/discards/graph_dump_impl.cc
@@ -11,7 +11,6 @@
 #include "base/functional/bind.h"
 #include "base/json/json_string_value_serializer.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/task/bind_post_task.h"
 #include "base/task/cancelable_task_tracker.h"
 #include "base/task/sequenced_task_runner.h"
@@ -373,7 +372,7 @@
 
 void DiscardsGraphDumpImpl::RemoveNode(const performance_manager::Node* node) {
   auto it = node_ids_.find(node);
-  CHECK(it != node_ids_.end(), base::NotFatalUntil::M130);
+  CHECK(it != node_ids_.end());
   NodeId node_id = it->second;
   node_ids_.erase(it);
   size_t erased = nodes_by_id_.erase(node_id);
@@ -392,7 +391,7 @@
   }
 
   auto it = node_ids_.find(node);
-  CHECK(it != node_ids_.end(), base::NotFatalUntil::M130);
+  CHECK(it != node_ids_.end());
   return it->second.GetUnsafeValue();
 }
 
diff --git a/chrome/browser/ui/webui/search_engine_choice/search_engine_choice_ui.cc b/chrome/browser/ui/webui/search_engine_choice/search_engine_choice_ui.cc
index c4a27bc2c..3d311fd 100644
--- a/chrome/browser/ui/webui/search_engine_choice/search_engine_choice_ui.cc
+++ b/chrome/browser/ui/webui/search_engine_choice/search_engine_choice_ui.cc
@@ -8,7 +8,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback_forward.h"
 #include "base/json/json_writer.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engine_choice/search_engine_choice_dialog_service.h"
@@ -154,7 +153,7 @@
   if (entry_point_ != SearchEngineChoiceDialogService::EntryPoint::kDialog) {
     // This callback should always be populated.
     // TODO(b/344899110): Cleanup once the bug root cause is found.
-    CHECK(on_choice_made_callback_, base::NotFatalUntil::M131);
+    CHECK(on_choice_made_callback_);
   }
 }
 
@@ -166,7 +165,7 @@
     // is a bug. (Or the initialization was skipped, but that would point to
     // users manually entering the URL, which is not supported)
     // TODO(b/344899110): Cleanup once the bug root cause is found.
-    CHECK(on_choice_made_callback_, base::NotFatalUntil::M131);
+    CHECK(on_choice_made_callback_);
   }
 
   SearchEngineChoiceDialogService* search_engine_choice_dialog_service =
diff --git a/chrome/browser/ui/window_sizer/window_sizer.cc b/chrome/browser/ui/window_sizer/window_sizer.cc
index a2f4fc3..938745e5 100644
--- a/chrome/browser/ui/window_sizer/window_sizer.cc
+++ b/chrome/browser/ui/window_sizer/window_sizer.cc
@@ -10,7 +10,6 @@
 #include "base/command_line.h"
 #include "base/functional/function_ref.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
@@ -369,7 +368,7 @@
   bounds->set_width(std::max(kMinVisibleWidth, bounds->width()));
 
   const gfx::Rect work_area = display.work_area();
-  CHECK(!work_area.IsEmpty(), base::NotFatalUntil::M131);
+  CHECK(!work_area.IsEmpty());
   // Ensure that the title bar is not above the work area.
   if (bounds->y() < work_area.y()) {
     bounds->set_y(work_area.y());
diff --git a/chrome/browser/usb/usb_chooser_controller.cc b/chrome/browser/usb/usb_chooser_controller.cc
index 4c64fc2d..5ee9456 100644
--- a/chrome/browser/usb/usb_chooser_controller.cc
+++ b/chrome/browser/usb/usb_chooser_controller.cc
@@ -10,7 +10,6 @@
 #include <utility>
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
@@ -140,7 +139,7 @@
   DCHECK_LT(index, devices_.size());
   const std::u16string& device_name = devices_[index].second;
   const auto& it = device_name_map_.find(device_name);
-  CHECK(it != device_name_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != device_name_map_.end());
 
   if (it->second == 1)
     return device_name;
diff --git a/chrome/browser/vr/webxr_vr_input_browser_test.cc b/chrome/browser/vr/webxr_vr_input_browser_test.cc
index 29d1ae1..798bbf11 100644
--- a/chrome/browser/vr/webxr_vr_input_browser_test.cc
+++ b/chrome/browser/vr/webxr_vr_input_browser_test.cc
@@ -6,7 +6,6 @@
 
 #include "base/containers/contains.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "chrome/browser/vr/test/mock_xr_device_hook_base.h"
@@ -285,7 +284,7 @@
 
   device::ControllerFrameData GetCurrentControllerData(unsigned int index) {
     auto iter = controller_data_map_.find(index);
-    CHECK(iter != controller_data_map_.end(), base::NotFatalUntil::M130);
+    CHECK(iter != controller_data_map_.end());
     return iter->second;
   }
 
diff --git a/chrome/browser/web_applications/external_install_options.cc b/chrome/browser/web_applications/external_install_options.cc
index 5954a15..d2926496 100644
--- a/chrome/browser/web_applications/external_install_options.cc
+++ b/chrome/browser/web_applications/external_install_options.cc
@@ -9,7 +9,6 @@
 #include <tuple>
 #include <vector>
 
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
@@ -27,7 +26,7 @@
     : install_url(install_url),
       user_display_mode(user_display_mode),
       install_source(install_source) {
-  CHECK(install_url.is_valid(), base::NotFatalUntil::M130);
+  CHECK(install_url.is_valid());
 }
 
 ExternalInstallOptions::~ExternalInstallOptions() = default;
diff --git a/chrome/browser/web_applications/externally_managed_app_manager.cc b/chrome/browser/web_applications/externally_managed_app_manager.cc
index 5729edba..dd28e1c 100644
--- a/chrome/browser/web_applications/externally_managed_app_manager.cc
+++ b/chrome/browser/web_applications/externally_managed_app_manager.cc
@@ -15,7 +15,6 @@
 #include "base/containers/contains.h"
 #include "base/feature_list.h"
 #include "base/functional/callback_helpers.h"
-#include "base/not_fatal_until.h"
 #include "base/stl_util.h"
 #include "base/strings/to_string.h"
 #include "base/task/sequenced_task_runner.h"
@@ -290,7 +289,7 @@
 
     const ExternalInstallOptions& install_options = front->options;
 
-    CHECK(install_options.install_url.is_valid(), base::NotFatalUntil::M130);
+    CHECK(install_options.install_url.is_valid());
     std::optional<webapps::AppId> app_id =
         lock.registrar().LookupExternalAppId(install_options.install_url);
     debug_value.Set("app_id_from_install_url", app_id.value_or("<none>"));
@@ -634,8 +633,7 @@
   }
 
   auto source_and_request = synchronize_requests_.find(source);
-  CHECK(source_and_request != synchronize_requests_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(source_and_request != synchronize_requests_.end());
   SynchronizeRequest& request = source_and_request->second;
   request.install_results[install_url] = std::move(result);
   --request.remaining_install_requests;
@@ -649,8 +647,7 @@
     const GURL& install_url,
     webapps::UninstallResultCode code) {
   auto source_and_request = synchronize_requests_.find(source);
-  CHECK(source_and_request != synchronize_requests_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(source_and_request != synchronize_requests_.end());
   SynchronizeRequest& request = source_and_request->second;
   request.uninstall_results[install_url] = code;
   --request.remaining_uninstall_requests;
@@ -662,8 +659,7 @@
 void ExternallyManagedAppManager::ContinueSynchronization(
     ExternalInstallSource source) {
   auto source_and_request = synchronize_requests_.find(source);
-  CHECK(source_and_request != synchronize_requests_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(source_and_request != synchronize_requests_.end());
 
   SynchronizeRequest& request = source_and_request->second;
 
@@ -695,8 +691,7 @@
 void ExternallyManagedAppManager::CompleteSynchronization(
     ExternalInstallSource source) {
   auto source_and_request = synchronize_requests_.find(source);
-  CHECK(source_and_request != synchronize_requests_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(source_and_request != synchronize_requests_.end());
 
   SynchronizeRequest& request = source_and_request->second;
   CHECK(request.callback);
diff --git a/chrome/browser/web_applications/locks/partitioned_lock_manager.cc b/chrome/browser/web_applications/locks/partitioned_lock_manager.cc
index 7c6736b..383c4bce 100644
--- a/chrome/browser/web_applications/locks/partitioned_lock_manager.cc
+++ b/chrome/browser/web_applications/locks/partitioned_lock_manager.cc
@@ -15,7 +15,6 @@
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/values.h"
 #include "chrome/browser/web_applications/locks/partitioned_lock.h"
@@ -240,7 +239,7 @@
   // This iterator is guaranteed to stay valid because
   // AcquireNextLockOrPostCompletion does not modify the `locks_` map.
   LocksMap::iterator it = locks_.find(lock_id);
-  CHECK(it != locks_.end(), base::NotFatalUntil::M130);
+  CHECK(it != locks_.end());
   Lock& lock = it->second;
 
   // First, decrement the lock `acquired_count`.
diff --git a/chrome/browser/win/conflicts/incompatible_applications_updater.cc b/chrome/browser/win/conflicts/incompatible_applications_updater.cc
index e53126e0..09722667 100644
--- a/chrome/browser/win/conflicts/incompatible_applications_updater.cc
+++ b/chrome/browser/win/conflicts/incompatible_applications_updater.cc
@@ -11,7 +11,6 @@
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/path_service.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
@@ -458,7 +457,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   auto it = module_warning_decisions_.find(module_key);
-  CHECK(it != module_warning_decisions_.end(), base::NotFatalUntil::M130);
+  CHECK(it != module_warning_decisions_.end());
   return it->second;
 }
 
diff --git a/chrome/browser/win/conflicts/module_blocklist_cache_updater.cc b/chrome/browser/win/conflicts/module_blocklist_cache_updater.cc
index 789676b..0178964 100644
--- a/chrome/browser/win/conflicts/module_blocklist_cache_updater.cc
+++ b/chrome/browser/win/conflicts/module_blocklist_cache_updater.cc
@@ -14,7 +14,6 @@
 #include "base/functional/bind.h"
 #include "base/hash/sha1.h"
 #include "base/i18n/case_conversion.h"
-#include "base/not_fatal_until.h"
 #include "base/path_service.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/sequenced_task_runner.h"
@@ -261,7 +260,7 @@
 ModuleBlocklistCacheUpdater::GetModuleBlockingState(
     const ModuleInfoKey& module_key) const {
   auto it = module_blocking_states_.find(module_key);
-  CHECK(it != module_blocking_states_.end(), base::NotFatalUntil::M130);
+  CHECK(it != module_blocking_states_.end());
   return it->second;
 }
 
diff --git a/chrome/browser/win/conflicts/module_database.cc b/chrome/browser/win/conflicts/module_database.cc
index 8cce623b..76856a0 100644
--- a/chrome/browser/win/conflicts/module_database.cc
+++ b/chrome/browser/win/conflicts/module_database.cc
@@ -10,7 +10,6 @@
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
 #include "base/location.h"
-#include "base/not_fatal_until.h"
 #include "base/task/lazy_thread_pool_task_runner.h"
 #include "base/task/sequenced_task_runner.h"
 #include "build/branding_buildflags.h"
@@ -227,7 +226,7 @@
       ModuleInfoKey(module_path, module_size, module_time_date_stamp));
 
   // Only known modules should be added to the blocklist.
-  CHECK(iter != modules_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != modules_.end());
 
   iter->second.module_properties |= ModuleInfoData::kPropertyAddedToBlocklist;
 }
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index bcb266f..5f5763f 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1748281879-f6307920645d7c967935982bdcc31bd8d8219885-45948ebd114566ec45402d34c635daf1833726d9.profdata
+chrome-android32-main-1748325554-e5f14612007583792e798ac21a3cec5ee96d272e-8b22b05113072dd416220a0df7c0b2fd160b29cc.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 766cf05..d16c376 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1748285041-8d50d17d839af992aa35ba597047910cf9e0c3fd-def4aa84cb21b505f52ce398a3a29962094a23a7.profdata
+chrome-android64-main-1748322038-88cc391695439732ceee672745e7c5e53a4ff7c8-4368a8c055078801f7bf560e6af22dee0f0f7b6a.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 75121aa..5c0076c5 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1748289504-5a78a4991f4bf92a93cc7a2ae35d8d605fad4c17-532a20f725c527d371febeefac67f20014f514b2.profdata
+chrome-mac-arm-main-1748325554-664a15165e0ceb945850dd5a082775c8ab93e329-8b22b05113072dd416220a0df7c0b2fd160b29cc.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 612627e..9760a8f8 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1748281879-ccab29a8196a7d38897915fe44e0ad7ab0166168-45948ebd114566ec45402d34c635daf1833726d9.profdata
+chrome-mac-main-1748303201-73697c30cd2b8abd94d958542c38809acbe4daf7-307f83dc4f47094bef4254c2eb0328caa2a89fac.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 400fca3..63477b6 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1748281879-71ed81f464062b9e978f33a4c510be0f8ed3fb60-45948ebd114566ec45402d34c635daf1833726d9.profdata
+chrome-win-arm64-main-1748325554-07d2b5778e3c34de3227bc2fcb2d111934f9910c-8b22b05113072dd416220a0df7c0b2fd160b29cc.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 88c342d..284edca 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1748260543-369d748d0e83b5094a87f8601251a6774bf4ba8b-436cf5a446bcda10aa2bc655f57ce243f534330d.profdata
+chrome-win32-main-1748271590-2a551700f9d030765c42f243be9ecdc0dc7450fe-daa8ac3dcd1dee6432e80ebc62dd87d5065a5cbc.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 54a9015..4d2e280 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1748260543-1b8a25b0391224b1b4bf93020837290e05fc6b4c-436cf5a446bcda10aa2bc655f57ce243f534330d.profdata
+chrome-win64-main-1748281879-234a98277139900e8be77d2d533023427847b92b-45948ebd114566ec45402d34c635daf1833726d9.profdata
diff --git a/chrome/renderer/actor/tool_executor.cc b/chrome/renderer/actor/tool_executor.cc
index eac8bda..39a5fb13 100644
--- a/chrome/renderer/actor/tool_executor.cc
+++ b/chrome/renderer/actor/tool_executor.cc
@@ -25,12 +25,7 @@
 
 namespace actor {
 
-ToolExecutor::ToolExecutor(RenderFrame* frame) : frame_(*frame) {
-  // TODO(crbug.com/398260855): Currently, this is created only for the main
-  // frame but eventually this will have to support all local roots in a page.
-  CHECK(frame->IsMainFrame());
-  CHECK(!frame->IsInFencedFrameTree());
-}
+ToolExecutor::ToolExecutor(RenderFrame* frame) : frame_(*frame) {}
 
 ToolExecutor::~ToolExecutor() = default;
 
diff --git a/chrome/renderer/extensions/api/chrome_extensions_renderer_api_provider.cc b/chrome/renderer/extensions/api/chrome_extensions_renderer_api_provider.cc
index 477d5b5..673db324 100644
--- a/chrome/renderer/extensions/api/chrome_extensions_renderer_api_provider.cc
+++ b/chrome/renderer/extensions/api/chrome_extensions_renderer_api_provider.cc
@@ -119,7 +119,7 @@
   source_map->RegisterSource("notifications",
                              IDR_NOTIFICATIONS_CUSTOM_BINDINGS_JS);
 
-#if BUILDFLAG(ENABLE_EXTENSIONS)
+#if BUILDFLAG(ENABLE_EXTENSIONS_CORE)
   source_map->RegisterSource("action", IDR_ACTION_CUSTOM_BINDINGS_JS);
   source_map->RegisterSource("browserAction",
                              IDR_BROWSER_ACTION_CUSTOM_BINDINGS_JS);
@@ -221,7 +221,7 @@
   source_map->RegisterSource("chromeWebViewInternal",
                              IDR_CHROME_WEB_VIEW_INTERNAL_CUSTOM_BINDINGS_JS);
   source_map->RegisterSource("chromeWebView", IDR_CHROME_WEB_VIEW_JS);
-#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS_CORE)
 }
 
 void ChromeExtensionsRendererAPIProvider::EnableCustomElementAllowlist() const {
diff --git a/chrome/renderer/resources/renderer_resources.grd b/chrome/renderer/resources/renderer_resources.grd
index 57c536c5..5ea2739 100644
--- a/chrome/renderer/resources/renderer_resources.grd
+++ b/chrome/renderer/resources/renderer_resources.grd
@@ -16,9 +16,6 @@
 
       <!-- Extension libraries. -->
       <if expr="enable_extensions_core">
-        <include name="IDR_NOTIFICATIONS_CUSTOM_BINDINGS_JS" file="extensions\notifications_custom_bindings.js" type="BINDATA" />
-      </if>
-      <if expr="enable_extensions">
         <!-- Custom bindings for extension APIs. -->
         <include name="IDR_ACTION_CUSTOM_BINDINGS_JS" file="extensions\action_custom_bindings.js" type="BINDATA" />
         <include name="IDR_BROWSER_ACTION_CUSTOM_BINDINGS_JS" file="extensions\browser_action_custom_bindings.js" type="BINDATA" />
@@ -40,6 +37,7 @@
         <include name="IDR_IMAGE_WRITER_PRIVATE_CUSTOM_BINDINGS_JS" file="extensions\image_writer_private_custom_bindings.js" type="BINDATA" />
         <include name="IDR_INPUT_IME_CUSTOM_BINDINGS_JS" file="extensions\input.ime_custom_bindings.js" type="BINDATA" />
         <include name="IDR_MEDIA_GALLERIES_CUSTOM_BINDINGS_JS" file="extensions\media_galleries_custom_bindings.js" type="BINDATA" />
+        <include name="IDR_NOTIFICATIONS_CUSTOM_BINDINGS_JS" file="extensions\notifications_custom_bindings.js" type="BINDATA" />
         <include name="IDR_OMNIBOX_CUSTOM_BINDINGS_JS" file="extensions\omnibox_custom_bindings.js" type="BINDATA" />
         <include name="IDR_PAGE_ACTION_CUSTOM_BINDINGS_JS" file="extensions\page_action_custom_bindings.js" type="BINDATA" />
         <include name="IDR_PAGE_CAPTURE_CUSTOM_BINDINGS_JS" file="extensions\page_capture_custom_bindings.js" type="BINDATA" />
diff --git a/chrome/services/printing/print_backend_service_impl.cc b/chrome/services/printing/print_backend_service_impl.cc
index 68be156a..e9ea872 100644
--- a/chrome/services/printing/print_backend_service_impl.cc
+++ b/chrome/services/printing/print_backend_service_impl.cc
@@ -17,7 +17,6 @@
 #include "base/containers/span.h"
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/sequenced_task_runner.h"
@@ -952,7 +951,7 @@
   int cookie = document_helper.document_cookie();
   auto item =
       std::ranges::find(documents_, cookie, &DocumentHelper::document_cookie);
-  CHECK(item != documents_.end(), base::NotFatalUntil::M130)
+  CHECK(item != documents_.end())
       << "Document " << cookie << " to be deleted not found";
   documents_.erase(item);
 
diff --git a/chrome/test/base/testing_profile_manager.cc b/chrome/test/base/testing_profile_manager.cc
index ac701cb..6eecb40b 100644
--- a/chrome/test/base/testing_profile_manager.cc
+++ b/chrome/test/base/testing_profile_manager.cc
@@ -13,7 +13,6 @@
 #include "base/functional/bind.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/test_file_util.h"
@@ -257,7 +256,7 @@
   DCHECK(called_set_up_);
 
   auto it = testing_profiles_.find(kGuestProfileName);
-  CHECK(it != testing_profiles_.end(), base::NotFatalUntil::M130);
+  CHECK(it != testing_profiles_.end());
 
   profile_manager_->profiles_info_.erase(ProfileManager::GetGuestProfilePath());
 }
@@ -267,7 +266,7 @@
   DCHECK(called_set_up_);
 
   auto it = testing_profiles_.find(kSystemProfileName);
-  CHECK(it != testing_profiles_.end(), base::NotFatalUntil::M130);
+  CHECK(it != testing_profiles_.end());
 
   profile_manager_->profiles_info_.erase(
       ProfileManager::GetSystemProfilePath());
diff --git a/chrome/test/data/actor/positioned_iframe.html b/chrome/test/data/actor/positioned_iframe.html
new file mode 100644
index 0000000..700448d
--- /dev/null
+++ b/chrome/test/data/actor/positioned_iframe.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta name="viewport" content="width=device-width,minimum-scale=1">
+    <title>Positioned Iframe Test Case</title>
+    <style>
+      /* Make the outer page scrollable */
+      body {
+        width: 200vw;
+        height: 200vh;
+      }
+      /* Position the iframe in the bottom right quadrant of the viewport */
+      iframe {
+        position: absolute;
+        width: 50vw;
+        height: 50vh;
+        bottom: 20px;
+        right: 20px;
+      }
+    </style>
+  </head>
+  <iframe id="iframe"></iframe>
+  <script>
+    // Browser tests manually navigate the subframe. For manual reproduction
+    // locally append ?path=<path-to-file> to the URL.
+    const params = new URLSearchParams(location.search.substr(1));
+    const path = params.get('path');
+    if (path) {
+      document.getElementById('iframe').src = path;
+    }
+  </script>
+</html>
diff --git a/chromecast/base/device_capabilities_impl.cc b/chromecast/base/device_capabilities_impl.cc
index d09dcd1..7bf5c9d0 100644
--- a/chromecast/base/device_capabilities_impl.cc
+++ b/chromecast/base/device_capabilities_impl.cc
@@ -14,7 +14,6 @@
 #include "base/json/json_writer.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/values.h"
@@ -169,7 +168,7 @@
                                         const Validator* validator) {
   base::AutoLock auto_lock(validation_lock_);
   auto validator_it = validator_map_.find(key);
-  CHECK(validator_it != validator_map_.end(), base::NotFatalUntil::M130);
+  CHECK(validator_it != validator_map_.end());
   // Check that validator being unregistered matches the original for |key|.
   // This prevents managers from accidentally unregistering incorrect
   // validators.
diff --git a/chromecast/cast_core/runtime/browser/core_streaming_config_manager.cc b/chromecast/cast_core/runtime/browser/core_streaming_config_manager.cc
index 915399f5..8088e95 100644
--- a/chromecast/cast_core/runtime/browser/core_streaming_config_manager.cc
+++ b/chromecast/cast_core/runtime/browser/core_streaming_config_manager.cc
@@ -10,7 +10,6 @@
 
 #include "base/containers/contains.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/task/sequenced_task_runner.h"
 #include "chromecast/shared/platform_info_serializer.h"
@@ -135,7 +134,7 @@
       auto it = std::ranges::find(
           audio_limits, converted_codec,
           &cast_streaming::ReceiverConfig::AudioLimits::codec);
-      CHECK(it != audio_limits.end(), base::NotFatalUntil::M130);
+      CHECK(it != audio_limits.end());
       if (it->max_sample_rate) {
         it->max_sample_rate =
             std::max(it->max_sample_rate.value(), info.max_samples_per_second);
diff --git a/chromecast/device/bluetooth/le/remote_characteristic_impl.cc b/chromecast/device/bluetooth/le/remote_characteristic_impl.cc
index 62f54e69..b14cd6ee 100644
--- a/chromecast/device/bluetooth/le/remote_characteristic_impl.cc
+++ b/chromecast/device/bluetooth/le/remote_characteristic_impl.cc
@@ -7,7 +7,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "chromecast/base/bind_to_task_runner.h"
 #include "chromecast/device/bluetooth/le/gatt_client_manager_impl.h"
@@ -240,7 +239,7 @@
   }
 
   auto it = uuid_to_descriptor_.find(RemoteDescriptor::kCccdUuid);
-  CHECK(it != uuid_to_descriptor_.end(), base::NotFatalUntil::M130);
+  CHECK(it != uuid_to_descriptor_.end());
 
   // CCCD must exist. |fake_cccd_| should have been created if it doesn't exist.
   std::vector<uint8_t> write_val = indication
diff --git a/chromecast/device/bluetooth/le/remote_device_impl.cc b/chromecast/device/bluetooth/le/remote_device_impl.cc
index 661c56e..caa8be1 100644
--- a/chromecast/device/bluetooth/le/remote_device_impl.cc
+++ b/chromecast/device/bluetooth/le/remote_device_impl.cc
@@ -7,7 +7,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
 #include "chromecast/base/bind_to_task_runner.h"
@@ -594,8 +593,7 @@
 
   LOG(ERROR) << __func__ << " failed";
   auto it = handle_to_characteristic_read_cbs_.find(characteristic->handle());
-  CHECK(it != handle_to_characteristic_read_cbs_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(it != handle_to_characteristic_read_cbs_.end());
   DCHECK(!it->second.empty());
   std::move(it->second.front()).Run(false, {});
   it->second.pop();
@@ -616,8 +614,7 @@
 
   LOG(ERROR) << __func__ << " failed";
   auto it = handle_to_characteristic_write_cbs_.find(characteristic->handle());
-  CHECK(it != handle_to_characteristic_write_cbs_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(it != handle_to_characteristic_write_cbs_.end());
   DCHECK(!it->second.empty());
   std::move(it->second.front()).Run(false);
   it->second.pop();
@@ -635,7 +632,7 @@
 
   LOG(ERROR) << __func__ << " failed";
   auto it = handle_to_descriptor_read_cbs_.find(descriptor->handle());
-  CHECK(it != handle_to_descriptor_read_cbs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != handle_to_descriptor_read_cbs_.end());
   DCHECK(!it->second.empty());
   std::move(it->second.front()).Run(false, {});
   it->second.pop();
@@ -654,7 +651,7 @@
 
   LOG(ERROR) << __func__ << " failed";
   auto it = handle_to_descriptor_write_cbs_.find(descriptor->handle());
-  CHECK(it != handle_to_descriptor_write_cbs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != handle_to_descriptor_write_cbs_.end());
   DCHECK(!it->second.empty());
   std::move(it->second.front()).Run(false);
   it->second.pop();
diff --git a/chromecast/renderer/feature_manager.cc b/chromecast/renderer/feature_manager.cc
index f8f44d03..404142d 100644
--- a/chromecast/renderer/feature_manager.cc
+++ b/chromecast/renderer/feature_manager.cc
@@ -12,7 +12,6 @@
 #include "base/check.h"
 #include "base/containers/contains.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/values.h"
 #include "chromecast/base/cast_features.h"
 #include "chromecast/common/feature_constants.h"
@@ -143,7 +142,7 @@
 const chromecast::shell::mojom::FeaturePtr& FeatureManager::GetFeature(
     const std::string& feature) const {
   auto itor = features_map_.find(feature);
-  CHECK(itor != features_map_.end(), base::NotFatalUntil::M130);
+  CHECK(itor != features_map_.end());
   return itor->second;
 }
 
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 148a643..dbf0a866 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-16289.0.0-1068983
\ No newline at end of file
+16296.0.0-1069154
\ No newline at end of file
diff --git a/chromeos/components/sensors/fake_sensor_device.cc b/chromeos/components/sensors/fake_sensor_device.cc
index c30c533..611e24bf 100644
--- a/chromeos/components/sensors/fake_sensor_device.cc
+++ b/chromeos/components/sensors/fake_sensor_device.cc
@@ -9,7 +9,6 @@
 
 #include "base/containers/flat_map.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/task/sequenced_task_runner.h"
 
@@ -143,7 +142,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   auto it = clients_.find(id);
-  CHECK(it != clients_.end(), base::NotFatalUntil::M130);
+  CHECK(it != clients_.end());
 
   for (int32_t index : iio_chn_indices) {
     DCHECK_LT(static_cast<size_t>(index), it->second.channels_enabled.size());
diff --git a/chromeos/ui/base/file_icon_util.cc b/chromeos/ui/base/file_icon_util.cc
index f1e2a391..11e67ae 100644
--- a/chromeos/ui/base/file_icon_util.cc
+++ b/chromeos/ui/base/file_icon_util.cc
@@ -13,7 +13,6 @@
 #include "base/files/file_path.h"
 #include "base/memory/raw_ref.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chromeos/ui/vector_icons/vector_icons.h"
@@ -148,7 +147,7 @@
 const IconParams& GetIconParamsFromIconType(IconType icon) {
   const auto& icon_type_to_icon_params = GetIconTypeToIconParamsMap();
   const auto& it = icon_type_to_icon_params.find(icon);
-  CHECK(it != icon_type_to_icon_params.end(), base::NotFatalUntil::M130);
+  CHECK(it != icon_type_to_icon_params.end());
 
   return it->second;
 }
@@ -369,7 +368,7 @@
   const auto& icon_type = internal::GetIconTypeForPath(filepath);
   const auto& icon_type_to_icon_params = GetIconTypeToIconParamsMap();
   const auto& it = icon_type_to_icon_params.find(icon_type);
-  CHECK(it != icon_type_to_icon_params.end(), base::NotFatalUntil::M130);
+  CHECK(it != icon_type_to_icon_params.end());
 
   return ResolveColor(it->second.color_id, dark_background);
 }
diff --git a/clank b/clank
index 7b3b668..fec1ce3 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 7b3b66843fe0c37489709a09bf6e4c57c6087f53
+Subproject commit fec1ce382177719159584b9189b455c4416f1004
diff --git a/components/account_manager_core/chromeos/account_manager.cc b/components/account_manager_core/chromeos/account_manager.cc
index 74b4002..5137159 100644
--- a/components/account_manager_core/chromeos/account_manager.cc
+++ b/components/account_manager_core/chromeos/account_manager.cc
@@ -23,7 +23,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task/sequenced_task_runner.h"
@@ -572,7 +571,7 @@
 
   DCHECK_EQ(init_state_, InitializationState::kInitialized);
   auto it = accounts_.find(account_key);
-  CHECK(it != accounts_.end(), base::NotFatalUntil::M130)
+  CHECK(it != accounts_.end())
       << "UpdateToken cannot be used for adding accounts";
   UpsertAccountInternal(account_key, AccountInfo{it->second.raw_email, token});
 }
diff --git a/components/app_restore/restore_data.cc b/components/app_restore/restore_data.cc
index 115178ba..75856eeb 100644
--- a/components/app_restore/restore_data.cc
+++ b/components/app_restore/restore_data.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
 #include "components/app_constants/constants.h"
@@ -277,7 +276,7 @@
 
   // Move to the next window_id.
   auto data_it = it->second.find(window_id);
-  CHECK(data_it != it->second.end(), base::NotFatalUntil::M130);
+  CHECK(data_it != it->second.end());
   ++data_it;
   if (data_it == it->second.end())
     chrome_app_id_to_current_window_id_.erase(app_id);
diff --git a/components/autofill/content/browser/content_autofill_driver.cc b/components/autofill/content/browser/content_autofill_driver.cc
index e363d565..1c2adfb 100644
--- a/components/autofill/content/browser/content_autofill_driver.cc
+++ b/components/autofill/content/browser/content_autofill_driver.cc
@@ -422,8 +422,7 @@
     // TODO(crbug.com/380129810): When `return ukm::kInvalidSourceId` is
     // removed, FormInteractionsUkmLogger::CanLog() doesn't need to check the
     // `ukm::SourceId` anymore.
-    NOTREACHED(base::NotFatalUntil::M134);
-    return ukm::kInvalidSourceId;
+    NOTREACHED();
   }
   return render_frame_host_->GetPageUkmSourceId();
 }
diff --git a/components/autofill/core/browser/data_model/addresses/autofill_structured_address_name_unittest.cc b/components/autofill/core/browser/data_model/addresses/autofill_structured_address_name_unittest.cc
index 66d7bfa..ad42f8fb 100644
--- a/components/autofill/core/browser/data_model/addresses/autofill_structured_address_name_unittest.cc
+++ b/components/autofill/core/browser/data_model/addresses/autofill_structured_address_name_unittest.cc
@@ -129,14 +129,7 @@
     : public testing::TestWithParam<NameParserTestRecord> {};
 
 // Tests the parsing of full names into their subcomponents.
-#if BUILDFLAG(IS_IOS)
-// TODO(crbug.com/394860914): This test currently fails on the platform when run
-// as part of the full test suite.
-#define MAYBE_ParseFullName DISABLED_ParseFullName
-#else
-#define MAYBE_ParseFullName ParseFullName
-#endif  // BUILDFLAG(IOS)
-TEST_P(AutofillStructuredNameParseFullNameTest, MAYBE_ParseFullName) {
+TEST_P(AutofillStructuredNameParseFullNameTest, ParseFullName) {
   base::test::ScopedFeatureList scoped_feature_list_{
       features::kAutofillSupportLastNamePrefix};
   auto test_case = GetParam();
diff --git a/components/autofill/core/browser/foundations/autofill_driver_router.cc b/components/autofill/core/browser/foundations/autofill_driver_router.cc
index a4a7f7d0..22c8dfa6 100644
--- a/components/autofill/core/browser/foundations/autofill_driver_router.cc
+++ b/components/autofill/core/browser/foundations/autofill_driver_router.cc
@@ -95,10 +95,10 @@
                         found_driver_deleted);
   if (driver_is_dying) {
     if (found_token_has_driver) {
-      CHECK(found_driver, base::NotFatalUntil::M135);
-      CHECK(found_driver_deleted, base::NotFatalUntil::M135);
+      CHECK(found_driver);
+      CHECK(found_driver_deleted);
     } else {
-      CHECK(!found_driver, base::NotFatalUntil::M135);
+      CHECK(!found_driver);
     }
   }
 }
diff --git a/components/autofill/ios/browser/autofill_driver_ios_factory.mm b/components/autofill/ios/browser/autofill_driver_ios_factory.mm
index b5aa211..e4507e0d 100644
--- a/components/autofill/ios/browser/autofill_driver_ios_factory.mm
+++ b/components/autofill/ios/browser/autofill_driver_ios_factory.mm
@@ -49,7 +49,7 @@
 }
 
 AutofillDriverIOSFactory::~AutofillDriverIOSFactory() {
-  CHECK(web_state_destroyed_, base::NotFatalUntil::M135);
+  CHECK(web_state_destroyed_);
   for (auto& observer : AutofillDriverFactory::observers()) {
     observer.OnAutofillDriverFactoryDestroyed(*this);
   }
@@ -66,7 +66,7 @@
 // and that `client_` is still alive.
 void AutofillDriverIOSFactory::WebStateDestroyed(
     web::WebState* destroyed_web_state) {
-  CHECK(web_state(), base::NotFatalUntil::M135);
+  CHECK(web_state());
   if (web_state()) {
     for (const auto& [frame_id, driver] : driver_map_) {
       if (driver) {
diff --git a/components/background_fetch/background_fetch_delegate_base.cc b/components/background_fetch/background_fetch_delegate_base.cc
index d4ecd4e5..c7df45983 100644
--- a/components/background_fetch/background_fetch_delegate_base.cc
+++ b/components/background_fetch/background_fetch_delegate_base.cc
@@ -10,7 +10,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/task/sequenced_task_runner.h"
 #include "build/build_config.h"
@@ -287,8 +286,7 @@
 
   // Update the upload progress.
   auto it = job_details->current_fetch_guids.find(download_guid);
-  CHECK(it != job_details->current_fetch_guids.end(),
-        base::NotFatalUntil::M130);
+  CHECK(it != job_details->current_fetch_guids.end());
   job_details->fetch_description->uploaded_bytes += it->second.body_size_bytes;
 }
 
diff --git a/components/bookmarks/browser/url_index.cc b/components/bookmarks/browser/url_index.cc
index b973c2e1..2f9369f 100644
--- a/components/bookmarks/browser/url_index.cc
+++ b/components/bookmarks/browser/url_index.cc
@@ -9,7 +9,6 @@
 #include "base/containers/adapters.h"
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/uuid.h"
 #include "components/bookmarks/browser/url_and_title.h"
 #include "components/bookmarks/common/url_load_stats.h"
@@ -169,7 +168,7 @@
   url_lock_.AssertAcquired();
   if (node->is_url()) {
     auto i = nodes_ordered_by_url_set_.find(node);
-    CHECK(i != nodes_ordered_by_url_set_.end(), base::NotFatalUntil::M130);
+    CHECK(i != nodes_ordered_by_url_set_.end());
     // i points to the first node with the URL, advance until we find the
     // node we're removing.
     while (*i != node) {
diff --git a/components/browsing_data/content/browsing_data_model.cc b/components/browsing_data/content/browsing_data_model.cc
index 20225f5..50ace0c 100644
--- a/components/browsing_data/content/browsing_data_model.cc
+++ b/components/browsing_data/content/browsing_data_model.cc
@@ -17,7 +17,6 @@
 #include "base/functional/callback.h"
 #include "base/functional/overloaded.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "components/attribution_reporting/features.h"
 #include "components/browsing_data/content/browsing_data_quota_helper.h"
 #include "components/browsing_data/content/shared_worker_info.h"
@@ -755,8 +754,7 @@
 BrowsingDataModel::BrowsingDataEntryView
 BrowsingDataModel::Iterator::operator*() const {
   DCHECK(outer_iterator_ != outer_end_iterator_);
-  CHECK(inner_iterator_ != outer_iterator_->second.end(),
-        base::NotFatalUntil::M130);
+  CHECK(inner_iterator_ != outer_iterator_->second.end());
   return BrowsingDataEntryView(outer_iterator_->first, inner_iterator_->first,
                                inner_iterator_->second);
 }
diff --git a/components/cdm/browser/media_drm_storage_impl.cc b/components/cdm/browser/media_drm_storage_impl.cc
index fd21123..2c7d060 100644
--- a/components/cdm/browser/media_drm_storage_impl.cc
+++ b/components/cdm/browser/media_drm_storage_impl.cc
@@ -16,7 +16,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
 #include "components/prefs/pref_registry_simple.h"
@@ -557,7 +556,7 @@
 
     // Now call any callbacks waiting for this origin ID to be allocated.
     auto entry = pending_requests_.find({pref_service, origin});
-    CHECK(entry != pending_requests_.end(), base::NotFatalUntil::M130);
+    CHECK(entry != pending_requests_.end());
 
     std::vector<MediaDrmStorageImpl::OriginIdObtainedCB> callbacks;
     callbacks.swap(entry->second);
diff --git a/components/chromeos_camera/mojo_jpeg_encode_accelerator_service.cc b/components/chromeos_camera/mojo_jpeg_encode_accelerator_service.cc
index 4519ff0..eaca32b 100644
--- a/components/chromeos_camera/mojo_jpeg_encode_accelerator_service.cc
+++ b/components/chromeos_camera/mojo_jpeg_encode_accelerator_service.cc
@@ -19,7 +19,6 @@
 #include "base/memory/read_only_shared_memory_region.h"
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/memory/writable_shared_memory_region.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/trace_event/trace_event.h"
 #include "components/chromeos_camera/common/dmabuf.mojom.h"
@@ -371,7 +370,7 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   auto iter = encode_cb_map_.find(task_id);
-  CHECK(iter != encode_cb_map_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != encode_cb_map_.end());
   EncodeWithDmaBufCallback encode_cb = std::move(iter->second);
   encode_cb_map_.erase(iter);
   std::move(encode_cb).Run(encoded_picture_size, error);
diff --git a/components/content_settings/core/browser/content_settings_pref_provider.cc b/components/content_settings/core/browser/content_settings_pref_provider.cc
index fdcd09a..c7aeb13 100644
--- a/components/content_settings/core/browser/content_settings_pref_provider.cc
+++ b/components/content_settings/core/browser/content_settings_pref_provider.cc
@@ -14,7 +14,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/time/default_clock.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
@@ -416,7 +415,7 @@
 
 ContentSettingsPref* PrefProvider::GetPref(ContentSettingsType type) const {
   auto it = content_settings_prefs_.find(type);
-  CHECK(it != content_settings_prefs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != content_settings_prefs_.end());
   return it->second.get();
 }
 
diff --git a/components/content_settings/core/browser/content_settings_rule.cc b/components/content_settings/core/browser/content_settings_rule.cc
index 00a5a071..3bdb42c 100644
--- a/components/content_settings/core/browser/content_settings_rule.cc
+++ b/components/content_settings/core/browser/content_settings_rule.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 
 namespace content_settings {
 
@@ -44,7 +43,7 @@
 
 std::unique_ptr<Rule> ConcatenationIterator::Next() {
   auto current_iterator = iterators_.begin();
-  CHECK(current_iterator != iterators_.end(), base::NotFatalUntil::M130);
+  CHECK(current_iterator != iterators_.end());
   DCHECK((*current_iterator)->HasNext());
   std::unique_ptr<Rule> next_rule = (*current_iterator)->Next();
   if (!(*current_iterator)->HasNext()) {
diff --git a/components/content_settings/core/common/cookie_settings_base.cc b/components/content_settings/core/common/cookie_settings_base.cc
index 39766d36c..ab08cd9 100644
--- a/components/content_settings/core/common/cookie_settings_base.cc
+++ b/components/content_settings/core/common/cookie_settings_base.cc
@@ -12,7 +12,6 @@
 #include "base/check.h"
 #include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/rand_util.h"
 #include "base/types/optional_ref.h"
@@ -177,7 +176,7 @@
 bool CookieSettingsBase::CookieSettingWithMetadata::
     BlockedByThirdPartyCookieBlocking() const {
   const bool out = !IsAllowed(cookie_setting_) && allow_partitioned_cookies_;
-  CHECK(!out || is_third_party_request_, base::NotFatalUntil::M130);
+  CHECK(!out || is_third_party_request_);
   return out;
 }
 
diff --git a/components/domain_reliability/context.cc b/components/domain_reliability/context.cc
index 67fa014..6336aa2a 100644
--- a/components/domain_reliability/context.cc
+++ b/components/domain_reliability/context.cc
@@ -13,7 +13,6 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/sparse_histogram.h"
-#include "base/not_fatal_until.h"
 #include "base/rand_util.h"
 #include "base/values.h"
 #include "components/domain_reliability/dispatcher.h"
@@ -216,7 +215,7 @@
 void DomainReliabilityContext::CommitUpload() {
   auto current = beacons_.begin();
   while (uploading_beacons_size_ > 0) {
-    CHECK(current != beacons_.end(), base::NotFatalUntil::M130);
+    CHECK(current != beacons_.end());
 
     auto last = current;
     ++current;
diff --git a/components/domain_reliability/dispatcher.cc b/components/domain_reliability/dispatcher.cc
index d72b181..d62f92b 100644
--- a/components/domain_reliability/dispatcher.cc
+++ b/components/domain_reliability/dispatcher.cc
@@ -10,7 +10,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/timer/timer.h"
 #include "components/domain_reliability/util.h"
 
@@ -131,7 +130,7 @@
     eligible_tasks_.erase(task);
 
   auto it = tasks_.find(task);
-  CHECK(it != tasks_.end(), base::NotFatalUntil::M130);
+  CHECK(it != tasks_.end());
   tasks_.erase(it);
 }
 
diff --git a/components/domain_reliability/uploader.cc b/components/domain_reliability/uploader.cc
index dc0f48ed..8754be72 100644
--- a/components/domain_reliability/uploader.cc
+++ b/components/domain_reliability/uploader.cc
@@ -10,7 +10,6 @@
 #include "base/functional/callback.h"
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/supports_user_data.h"
 #include "components/domain_reliability/util.h"
 #include "net/base/elements_upload_data_stream.h"
@@ -179,7 +178,7 @@
     DCHECK(!shutdown_);
 
     auto request_it = uploads_.find(request);
-    CHECK(request_it != uploads_.end(), base::NotFatalUntil::M130);
+    CHECK(request_it != uploads_.end());
 
     int http_response_code = -1;
     base::TimeDelta retry_after;
diff --git a/components/download/internal/background_service/model_impl.cc b/components/download/internal/background_service/model_impl.cc
index 6e740df0..9e70178 100644
--- a/components/download/internal/background_service/model_impl.cc
+++ b/components/download/internal/background_service/model_impl.cc
@@ -8,7 +8,6 @@
 #include <memory>
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/trace_event/memory_usage_estimator.h"
 #include "components/download/internal/background_service/entry.h"
 #include "components/download/internal/background_service/model_stats.h"
@@ -65,7 +64,7 @@
   DCHECK(store_->IsInitialized());
 
   const auto& it = entries_.find(guid);
-  CHECK(it != entries_.end(), base::NotFatalUntil::M130);
+  CHECK(it != entries_.end());
 
   // Pull out a separate guid and a DownloadClient so that when we destroy the
   // entry we don't destroy the std::string that is backing the guid.
diff --git a/components/download/internal/common/parallel_download_job.cc b/components/download/internal/common/parallel_download_job.cc
index 6fc62de..9e5125b 100644
--- a/components/download/internal/common/parallel_download_job.cc
+++ b/components/download/internal/common/parallel_download_job.cc
@@ -8,7 +8,6 @@
 
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/time/time.h"
 #include "components/download/internal/common/parallel_download_utils.h"
 #include "components/download/public/common/download_create_info.h"
@@ -110,7 +109,7 @@
   }
 
   auto it = workers_.find(offset);
-  CHECK(it != workers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != workers_.end());
   it->second->Cancel(false);
 }
 
diff --git a/components/drive/service/fake_drive_service.cc b/components/drive/service/fake_drive_service.cc
index 776b2a12..d80b60e 100644
--- a/components/drive/service/fake_drive_service.cc
+++ b/components/drive/service/fake_drive_service.cc
@@ -19,7 +19,6 @@
 #include "base/hash/md5.h"
 #include "base/json/json_string_value_serializer.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/escape.h"
 #include "base/strings/string_number_conversions.h"
@@ -650,7 +649,7 @@
     start_page_token = std::make_unique<StartPageToken>(*start_page_token_);
   } else {
     auto it = team_drive_start_page_tokens_.find(team_drive_id);
-    CHECK(it != team_drive_start_page_tokens_.end(), base::NotFatalUntil::M130);
+    CHECK(it != team_drive_start_page_tokens_.end());
     start_page_token = std::make_unique<StartPageToken>(*(it->second));
   }
   ++start_page_token_load_count_;
diff --git a/components/exo/buffer.cc b/components/exo/buffer.cc
index 0d8e4382..06ef4ecf 100644
--- a/components/exo/buffer.cc
+++ b/components/exo/buffer.cc
@@ -18,7 +18,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
@@ -947,7 +946,7 @@
 
 void Buffer::FenceSignalled(uint64_t commit_id) {
   auto iter = buffer_releases_.find(commit_id);
-  CHECK(iter != buffer_releases_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != buffer_releases_.end());
   std::move(iter->second.buffer_release_callback).Run();
   buffer_releases_.erase(iter);
 }
diff --git a/components/exo/client_controlled_accelerators.cc b/components/exo/client_controlled_accelerators.cc
index c83720d..456e82c 100644
--- a/components/exo/client_controlled_accelerators.cc
+++ b/components/exo/client_controlled_accelerators.cc
@@ -6,7 +6,6 @@
 
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
-#include "base/not_fatal_until.h"
 
 namespace exo {
 
@@ -32,7 +31,7 @@
 bool ClientControlledAcceleratorTarget::AcceleratorPressed(
     const ui::Accelerator& accelerator) {
   auto it = accelerators_.find(accelerator);
-  CHECK(it != accelerators_.end(), base::NotFatalUntil::M130);
+  CHECK(it != accelerators_.end());
   ClientControlledAcceleratorAction action = it->second;
 
   switch (action) {
diff --git a/components/exo/data_offer.cc b/components/exo/data_offer.cc
index 156aa466..c8a0c230 100644
--- a/components/exo/data_offer.cc
+++ b/components/exo/data_offer.cc
@@ -15,7 +15,6 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/pickle.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
@@ -387,7 +386,7 @@
                             scoped_refptr<base::RefCountedMemory> data) {
   // Update cache from nullptr to data.
   const auto cache_it = data_cache_.find(mime_type);
-  CHECK(cache_it != data_cache_.end(), base::NotFatalUntil::M130);
+  CHECK(cache_it != data_cache_.end());
   DCHECK(!cache_it->second);
   data_cache_.erase(cache_it);
   data_cache_.emplace(mime_type, data);
diff --git a/components/exo/frame_timing_history.cc b/components/exo/frame_timing_history.cc
index a0d08d4c..c154023 100644
--- a/components/exo/frame_timing_history.cc
+++ b/components/exo/frame_timing_history.cc
@@ -6,7 +6,6 @@
 
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 
 namespace exo {
 namespace {
@@ -83,7 +82,7 @@
     base::TimeTicks received_time) {
   auto iter = pending_submitted_time_.find(frame_token);
 
-  CHECK(iter != pending_submitted_time_.end(), base::NotFatalUntil::M130)
+  CHECK(iter != pending_submitted_time_.end())
       << "Frame submitted time information is missing. Frame Token: "
       << frame_token;
 
diff --git a/components/exo/surface.cc b/components/exo/surface.cc
index 533d4114..fde3d476 100644
--- a/components/exo/surface.cc
+++ b/components/exo/surface.cc
@@ -19,7 +19,6 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -596,7 +595,7 @@
   if (sub_surface->is_augmented()) {
     auto* render_layer = sub_surface;
     auto it = FindListEntry(render_layers_, render_layer);
-    CHECK(it != render_layers_.end(), base::NotFatalUntil::M130);
+    CHECK(it != render_layers_.end());
     if (it->second == position) {
       return;
     }
@@ -608,7 +607,7 @@
                sub_surface->AsTracedValue(), "position", position.ToString());
 
   auto it = FindListEntry(pending_sub_surfaces_, sub_surface);
-  CHECK(it != pending_sub_surfaces_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_sub_surfaces_.end());
   if (it->second == position) {
     return;
   }
diff --git a/components/exo/wayland/clients/rects.cc b/components/exo/wayland/clients/rects.cc
index 1175f12..39d6ecf 100644
--- a/components/exo/wayland/clients/rects.cc
+++ b/components/exo/wayland/clients/rects.cc
@@ -29,7 +29,6 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/message_loop/message_pump_type.h"
-#include "base/not_fatal_until.h"
 #include "base/scoped_generic.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task/single_thread_task_executor.h"
@@ -211,7 +210,7 @@
   auto it = std::ranges::find(
       presentation->scheduled_frames, presentation_feedback,
       [](std::unique_ptr<Frame>& frame) { return frame->feedback.get(); });
-  CHECK(it != presentation->scheduled_frames.end(), base::NotFatalUntil::M130);
+  CHECK(it != presentation->scheduled_frames.end());
   presentation->scheduled_frames.erase(it);
   LOG(WARNING) << "Frame discarded";
 }
diff --git a/components/exo/wayland/clients/simple.cc b/components/exo/wayland/clients/simple.cc
index f848166..2226234 100644
--- a/components/exo/wayland/clients/simple.cc
+++ b/components/exo/wayland/clients/simple.cc
@@ -19,7 +19,6 @@
 
 #include "base/command_line.h"
 #include "base/containers/circular_deque.h"
-#include "base/not_fatal_until.h"
 #include "base/time/time.h"
 #include "components/exo/wayland/clients/client_helper.h"
 #include "third_party/skia/include/core/SkCanvas.h"
@@ -83,7 +82,7 @@
   auto it =
       std::ranges::find(presentation->submitted_frames, feedback,
                         [](Frame& frame) { return frame.feedback.get(); });
-  CHECK(it != presentation->submitted_frames.end(), base::NotFatalUntil::M130);
+  CHECK(it != presentation->submitted_frames.end());
   presentation->submitted_frames.erase(it);
 }
 
diff --git a/components/feature_engagement/internal/chrome_variations_configuration.cc b/components/feature_engagement/internal/chrome_variations_configuration.cc
index 5ee60f6..fe6b4c9 100644
--- a/components/feature_engagement/internal/chrome_variations_configuration.cc
+++ b/components/feature_engagement/internal/chrome_variations_configuration.cc
@@ -14,7 +14,6 @@
 #include "base/containers/contains.h"
 #include "base/feature_list.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "components/feature_engagement/public/configuration.h"
 #include "components/feature_engagement/public/configuration_provider.h"
@@ -221,14 +220,14 @@
 const FeatureConfig& ChromeVariationsConfiguration::GetFeatureConfig(
     const base::Feature& feature) const {
   auto it = configs_.find(feature.name);
-  CHECK(it != configs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != configs_.end());
   return it->second;
 }
 
 const FeatureConfig& ChromeVariationsConfiguration::GetFeatureConfigByName(
     const std::string& feature_name) const {
   auto it = configs_.find(feature_name);
-  CHECK(it != configs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != configs_.end());
   return it->second;
 }
 
@@ -248,14 +247,14 @@
 const GroupConfig& ChromeVariationsConfiguration::GetGroupConfig(
     const base::Feature& group) const {
   auto it = group_configs_.find(group.name);
-  CHECK(it != group_configs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != group_configs_.end());
   return it->second;
 }
 
 const GroupConfig& ChromeVariationsConfiguration::GetGroupConfigByName(
     const std::string& group_name) const {
   auto it = group_configs_.find(group_name);
-  CHECK(it != group_configs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != group_configs_.end());
   return it->second;
 }
 
diff --git a/components/feature_engagement/internal/display_lock_controller_impl.cc b/components/feature_engagement/internal/display_lock_controller_impl.cc
index 458ccf7..1af8b88 100644
--- a/components/feature_engagement/internal/display_lock_controller_impl.cc
+++ b/components/feature_engagement/internal/display_lock_controller_impl.cc
@@ -5,7 +5,6 @@
 #include "components/feature_engagement/internal/display_lock_controller_impl.h"
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/threading/thread_checker.h"
 #include "components/feature_engagement/public/tracker.h"
 
@@ -19,7 +18,7 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   auto it = outstanding_display_locks_.find(handle_id);
-  CHECK(it != outstanding_display_locks_.end(), base::NotFatalUntil::M130);
+  CHECK(it != outstanding_display_locks_.end());
   outstanding_display_locks_.erase(it);
 }
 
diff --git a/components/feature_engagement/internal/editable_configuration.cc b/components/feature_engagement/internal/editable_configuration.cc
index 1588245..78852908 100644
--- a/components/feature_engagement/internal/editable_configuration.cc
+++ b/components/feature_engagement/internal/editable_configuration.cc
@@ -8,7 +8,6 @@
 
 #include "base/check.h"
 #include "base/feature_list.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "components/feature_engagement/public/configuration.h"
 
@@ -41,14 +40,14 @@
 const FeatureConfig& EditableConfiguration::GetFeatureConfig(
     const base::Feature& feature) const {
   auto it = configs_.find(feature.name);
-  CHECK(it != configs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != configs_.end());
   return it->second;
 }
 
 const FeatureConfig& EditableConfiguration::GetFeatureConfigByName(
     const std::string& feature_name) const {
   auto it = configs_.find(feature_name);
-  CHECK(it != configs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != configs_.end());
   return it->second;
 }
 
@@ -68,14 +67,14 @@
 const GroupConfig& EditableConfiguration::GetGroupConfig(
     const base::Feature& group) const {
   auto it = group_configs_.find(group.name);
-  CHECK(it != group_configs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != group_configs_.end());
   return it->second;
 }
 
 const GroupConfig& EditableConfiguration::GetGroupConfigByName(
     const std::string& group_name) const {
   auto it = group_configs_.find(group_name);
-  CHECK(it != group_configs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != group_configs_.end());
   return it->second;
 }
 
diff --git a/components/gcm_driver/crypto/gcm_encryption_provider.cc b/components/gcm_driver/crypto/gcm_encryption_provider.cc
index 5b0b76f..a16d027 100644
--- a/components/gcm_driver/crypto/gcm_encryption_provider.cc
+++ b/components/gcm_driver/crypto/gcm_encryption_provider.cc
@@ -10,7 +10,6 @@
 #include "base/containers/span.h"
 #include "base/functional/bind.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/byte_conversions.h"
 #include "base/strings/strcat.h"
 #include "base/task/sequenced_task_runner.h"
@@ -178,10 +177,10 @@
     // the Encryption and Crypto-Key header values to derive the values.
 
     const auto& encryption_header = message.data.find(kEncryptionProperty);
-    CHECK(encryption_header != message.data.end(), base::NotFatalUntil::M130);
+    CHECK(encryption_header != message.data.end());
 
     const auto& crypto_key_header = message.data.find(kCryptoKeyProperty);
-    CHECK(crypto_key_header != message.data.end(), base::NotFatalUntil::M130);
+    CHECK(crypto_key_header != message.data.end());
 
     EncryptionHeaderIterator encryption_header_iterator(
         encryption_header->second.begin(), encryption_header->second.end());
diff --git a/components/gcm_driver/gcm_client_impl.cc b/components/gcm_driver/gcm_client_impl.cc
index 99e9637e..d3fb7da 100644
--- a/components/gcm_driver/gcm_client_impl.cc
+++ b/components/gcm_driver/gcm_client_impl.cc
@@ -17,7 +17,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/task/sequenced_task_runner.h"
@@ -873,8 +872,7 @@
       InstanceIDTokenInfo::FromRegistrationInfo(registration_info.get());
   if (instance_id_token_info) {
     auto instance_id_iter = instance_id_data_.find(registration_info->app_id);
-    CHECK(instance_id_iter != instance_id_data_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(instance_id_iter != instance_id_data_.end());
 
     request_handler = std::make_unique<InstanceIDGetTokenRequestHandler>(
         instance_id_iter->second.first,
diff --git a/components/gcm_driver/gcm_driver_desktop.cc b/components/gcm_driver/gcm_driver_desktop.cc
index b4cf05d..17c2038b 100644
--- a/components/gcm_driver/gcm_driver_desktop.cc
+++ b/components/gcm_driver/gcm_driver_desktop.cc
@@ -14,7 +14,6 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
@@ -1059,8 +1058,7 @@
     const std::string& instance_id,
     const std::string& extra_data) {
   auto iter = get_instance_id_data_callbacks_.find(app_id);
-  CHECK(iter != get_instance_id_data_callbacks_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(iter != get_instance_id_data_callbacks_.end());
 
   base::queue<GetInstanceIDDataCallback>& callbacks = iter->second;
   std::move(callbacks.front()).Run(instance_id, extra_data);
diff --git a/components/global_media_controls/public/media_session_item_producer.cc b/components/global_media_controls/public/media_session_item_producer.cc
index c3b70b65..ba051b0 100644
--- a/components/global_media_controls/public/media_session_item_producer.cc
+++ b/components/global_media_controls/public/media_session_item_producer.cc
@@ -6,7 +6,6 @@
 
 #include "base/containers/contains.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "components/global_media_controls/public/media_item_manager.h"
 #include "components/global_media_controls/public/media_item_ui.h"
@@ -414,7 +413,7 @@
 void MediaSessionItemProducer::SetAudioSinkId(const std::string& id,
                                               const std::string& sink_id) {
   auto it = sessions_.find(id);
-  CHECK(it != sessions_.end(), base::NotFatalUntil::M130);
+  CHECK(it != sessions_.end());
   it->second.SetAudioSinkId(sink_id);
 }
 
@@ -430,7 +429,7 @@
     const std::string& id,
     base::RepeatingCallback<void(bool)> callback) {
   auto it = sessions_.find(id);
-  CHECK(it != sessions_.end(), base::NotFatalUntil::M130);
+  CHECK(it != sessions_.end());
 
   return it->second.RegisterIsAudioDeviceSwitchingSupportedCallback(
       std::move(callback));
@@ -459,7 +458,7 @@
   DCHECK(base::Contains(inactive_session_ids_, id));
 
   auto it = sessions_.find(id);
-  CHECK(it != sessions_.end(), base::NotFatalUntil::M130);
+  CHECK(it != sessions_.end());
 
   inactive_session_ids_.erase(id);
 
diff --git a/components/history/core/browser/visit_database.cc b/components/history/core/browser/visit_database.cc
index b2abbadf..4b72ac14 100644
--- a/components/history/core/browser/visit_database.cc
+++ b/components/history/core/browser/visit_database.cc
@@ -15,7 +15,6 @@
 #include <utility>
 
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/time/time.h"
 #include "components/google/core/common/google_util.h"
@@ -330,7 +329,7 @@
         if (!ov.app_id && visit.app_id) {
           auto is_matched = [ov](VisitRow v) { return ov.url_id == v.url_id; };
           auto pos = std::find_if(visits->begin(), visits->end(), is_matched);
-          CHECK(pos != visits->end(), base::NotFatalUntil::M130);
+          CHECK(pos != visits->end());
           *pos = visit;
           found_urls[visit.url_id] = visit;
         }
diff --git a/components/history_clusters/core/similar_visit_deduper_cluster_finalizer.cc b/components/history_clusters/core/similar_visit_deduper_cluster_finalizer.cc
index 4592e9a..dc55ac7 100644
--- a/components/history_clusters/core/similar_visit_deduper_cluster_finalizer.cc
+++ b/components/history_clusters/core/similar_visit_deduper_cluster_finalizer.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 #include <unordered_map>
 
-#include "base/not_fatal_until.h"
 #include "components/history/core/browser/history_types.h"
 #include "components/history_clusters/core/on_device_clustering_util.h"
 #include "components/history_clusters/core/similar_visit.h"
@@ -35,8 +34,7 @@
     // We are guaranteed to find a matching canonical visit, due to our
     // prepass above.
     auto it = similar_visit_to_canonical_visits.find(SimilarVisit(visit));
-    CHECK(it != similar_visit_to_canonical_visits.end(),
-          base::NotFatalUntil::M130);
+    CHECK(it != similar_visit_to_canonical_visits.end());
     history::ClusterVisit* canonical_visit = it->second;
 
     // If a DIFFERENT visit is the canonical visit for this key, merge
diff --git a/components/image_fetcher/core/image_data_fetcher.cc b/components/image_fetcher/core/image_data_fetcher.cc
index 7fb415c..aaeeb40 100644
--- a/components/image_fetcher/core/image_data_fetcher.cc
+++ b/components/image_fetcher/core/image_data_fetcher.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "components/image_fetcher/core/image_fetcher_metrics_reporter.h"
 #include "net/base/data_url.h"
 #include "net/base/load_flags.h"
@@ -197,7 +196,7 @@
                                      const std::string& image_data) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto request_iter = pending_requests_.find(source);
-  CHECK(request_iter != pending_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(request_iter != pending_requests_.end());
   auto callback = std::move(request_iter->second->callback);
   pending_requests_.erase(request_iter);
   std::move(callback).Run(image_data, metadata);
diff --git a/components/image_fetcher/core/image_fetcher_impl.cc b/components/image_fetcher/core/image_fetcher_impl.cc
index 5103ef6..a642a285 100644
--- a/components/image_fetcher/core/image_fetcher_impl.cc
+++ b/components/image_fetcher/core/image_fetcher_impl.cc
@@ -7,7 +7,6 @@
 #include <string>
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "net/base/load_flags.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -84,7 +83,7 @@
                                          const std::string& image_data,
                                          const RequestMetadata& metadata) {
   auto it = pending_net_requests_.find(image_url);
-  CHECK(it != pending_net_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_net_requests_.end());
   ImageRequest* request = &it->second;
   DCHECK(request->image_data.empty());
   DCHECK_EQ(RequestMetadata::RESPONSE_CODE_INVALID,
@@ -114,7 +113,7 @@
                                       const gfx::Image& image) {
   // Get request for the given image_url from the request queue.
   auto image_iter = pending_net_requests_.find(image_url);
-  CHECK(image_iter != pending_net_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(image_iter != pending_net_requests_.end());
   ImageRequest* request = &image_iter->second;
 
   // Run all image callbacks.
diff --git a/components/media_router/common/providers/cast/channel/cast_message_handler.cc b/components/media_router/common/providers/cast/channel/cast_message_handler.cc
index bb58dd0..68367bc0 100644
--- a/components/media_router/common/providers/cast/channel/cast_message_handler.cc
+++ b/components/media_router/common/providers/cast/channel/cast_message_handler.cc
@@ -12,7 +12,6 @@
 
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/rand_util.h"
 #include "base/strings/stringprintf.h"
@@ -665,7 +664,7 @@
 void CastMessageHandler::PendingRequests::SetVolumeTimedOut(int request_id) {
   DVLOG(1) << __func__ << ", request_id: " << request_id;
   auto it = pending_volume_requests_by_id_.find(request_id);
-  CHECK(it != pending_volume_requests_by_id_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_volume_requests_by_id_.end());
   std::move(it->second->callback).Run(Result::kFailed);
   pending_volume_requests_by_id_.erase(it);
 }
diff --git a/components/metrics/metrics_features.cc b/components/metrics/metrics_features.cc
index 33596ed..ebd4936 100644
--- a/components/metrics/metrics_features.cc
+++ b/components/metrics/metrics_features.cc
@@ -22,4 +22,10 @@
              "MetricsLogTrimming",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+#if BUILDFLAG(IS_ANDROID)
+BASE_FEATURE(kResetMetricsUploadBackoffOnForeground,
+             "ResetMetricsUploadBackoffOnForeground",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+#endif  // BUILDFLAG(IS_ANDROID)
+
 }  // namespace metrics::features
diff --git a/components/metrics/metrics_features.h b/components/metrics/metrics_features.h
index 1e2e103..b239318 100644
--- a/components/metrics/metrics_features.h
+++ b/components/metrics/metrics_features.h
@@ -7,6 +7,7 @@
 
 #include "base/feature_list.h"
 #include "base/metrics/field_trial_params.h"
+#include "build/build_config.h"
 
 namespace metrics::features {
 
@@ -29,6 +30,26 @@
 // components/metrics/unsent_log_store.cc.
 BASE_DECLARE_FEATURE(kMetricsLogTrimming);
 
+#if BUILDFLAG(IS_ANDROID)
+// If enabled, when foregrounding, the ReportingService backoff will be reset so
+// that uploads are scheduled normally again.
+// Context: In crbug.com/420459511, it was discovered that starting from Android
+// 15, apps cannot issue network requests from the background (they will fail).
+// This resulted in the ReportingService being throttled due to the backoff
+// logic, with uploads being scheduled very far ahead in the future (up to 24h).
+// During this time, periodic ongoing logs stop getting created. Even if there
+// are other scenarios where logs get created (upon backgrounding and
+// foregrounding), those simply accumulate on disk since no logs are being
+// uploaded. This can eventually lead to log trimming which in turn leads to
+// data loss.
+// TODO: crbug.com/420459511 - This feature mitigates data loss, but doesn't fix
+// the issue that periodic ongoing logs stop being created while in the
+// background (which is supposed to be controlled by the `UMABackgroundSessions`
+// feature). Integrate with WorkManager, JobScheduler, and/or
+// `background_task::BackgroundTask` for a proper fix of background metrics.
+BASE_DECLARE_FEATURE(kResetMetricsUploadBackoffOnForeground);
+#endif  // BUILDFLAG(IS_ANDROID)
+
 }  // namespace metrics::features
 
 #endif  // COMPONENTS_METRICS_METRICS_FEATURES_H_
diff --git a/components/metrics/metrics_scheduler.cc b/components/metrics/metrics_scheduler.cc
index f0e8211..38160cf6 100644
--- a/components/metrics/metrics_scheduler.cc
+++ b/components/metrics/metrics_scheduler.cc
@@ -48,7 +48,7 @@
 void MetricsScheduler::TaskDone(base::TimeDelta next_interval) {
   DCHECK(callback_pending_);
   callback_pending_ = false;
-  interval_ = next_interval;
+  SetInterval(next_interval);
   if (running_)
     ScheduleNextTask();
 }
diff --git a/components/metrics/metrics_scheduler.h b/components/metrics/metrics_scheduler.h
index 91a529c..9cfbcfc 100644
--- a/components/metrics/metrics_scheduler.h
+++ b/components/metrics/metrics_scheduler.h
@@ -31,6 +31,9 @@
   // Stops scheduling uploads.
   void Stop();
 
+  // Whether the scheduler is running.
+  bool IsRunning() { return running_; }
+
   // Returns the initial delay before the task is run for the first time.
   static int GetInitialIntervalSeconds();
 
@@ -43,6 +46,13 @@
   // Called by the Timer when it's time to run the task.
   virtual void TriggerTask();
 
+  // Whether a callback is currently pending (i.e. TriggerTask() was run, but
+  // not its matching TaskDone()).
+  bool IsCallbackPending() { return callback_pending_; }
+
+  // Sets `interval_`.
+  void SetInterval(base::TimeDelta interval) { interval_ = interval; }
+
  private:
   // Schedules a future call to TriggerTask if one isn't already pending.
   void ScheduleNextTask();
diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc
index d35b42f..4cf0afbe 100644
--- a/components/metrics/metrics_service.cc
+++ b/components/metrics/metrics_service.cc
@@ -613,7 +613,7 @@
   base::RecordAction(base::UserMetricsAction("UMA_OnBackgrounded"));
   std::optional<bool> previous_is_in_foreground = is_in_foreground_;
   is_in_foreground_ = false;
-  reporting_service_.SetIsInForegound(false);
+  reporting_service_.OnAppEnterBackground();
   if (!keep_recording_in_background) {
     rotation_scheduler_->Stop();
     reporting_service_.Stop();
@@ -667,7 +667,7 @@
   base::RecordAction(base::UserMetricsAction("UMA_OnForegrounded"));
   std::optional<bool> previous_is_in_foreground = is_in_foreground_;
   is_in_foreground_ = true;
-  reporting_service_.SetIsInForegound(true);
+  reporting_service_.OnAppEnterForeground();
   state_manager_->LogHasSessionShutdownCleanly(false);
   StartSchedulerIfNecessary();
 
diff --git a/components/metrics/metrics_upload_scheduler.cc b/components/metrics/metrics_upload_scheduler.cc
index 64410590..7cf9263 100644
--- a/components/metrics/metrics_upload_scheduler.cc
+++ b/components/metrics/metrics_upload_scheduler.cc
@@ -82,6 +82,14 @@
   TaskDone(unsent_logs_interval_);
 }
 
+void MetricsUploadScheduler::RestartWithUnsentLogsInterval() {
+  CHECK(IsRunning());
+  CHECK(!IsCallbackPending());
+  Stop();
+  SetInterval(unsent_logs_interval_);
+  Start();
+}
+
 void MetricsUploadScheduler::UploadOverDataUsageCap() {
   TaskDone(base::Minutes(kOverDataUsageIntervalMinutes));
 }
diff --git a/components/metrics/metrics_upload_scheduler.h b/components/metrics/metrics_upload_scheduler.h
index 1b69bbc8..73a7824 100644
--- a/components/metrics/metrics_upload_scheduler.h
+++ b/components/metrics/metrics_upload_scheduler.h
@@ -33,6 +33,14 @@
   // Also stops the scheduler.
   void StopAndUploadCancelled();
 
+  // Re-schedules the next upload with the successful unsent logs interval (see
+  // GetUnsentLogsInterval() below). This is useful for resetting the scheduler
+  // when it is using backoff logic (see GetInitialBackoffInterval() below).
+  // This should only be called while the scheduler is running, but not while
+  // a callback is pending. This is currently only used for the feature
+  // kResetMetricsUploadBackoffOnForeground.
+  void RestartWithUnsentLogsInterval();
+
   // Callback from MetricsService when an upload is cancelled because it would
   // be over the allowed data usage cap.
   void UploadOverDataUsageCap();
diff --git a/components/metrics/reporting_service.cc b/components/metrics/reporting_service.cc
index 2b1887d..eb2d52d 100644
--- a/components/metrics/reporting_service.cc
+++ b/components/metrics/reporting_service.cc
@@ -64,14 +64,16 @@
 
 void ReportingService::Start() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (reporting_active_)
+  if (reporting_active_) {
     upload_scheduler_->Start();
+  }
 }
 
 void ReportingService::Stop() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (upload_scheduler_)
+  if (upload_scheduler_) {
     upload_scheduler_->Stop();
+  }
 }
 
 void ReportingService::EnableReporting() {
@@ -93,6 +95,56 @@
   return reporting_active_;
 }
 
+#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
+void ReportingService::OnAppEnterBackground() {
+  is_in_foreground_ = false;
+}
+
+void ReportingService::OnAppEnterForeground() {
+  is_in_foreground_ = true;
+
+#if BUILDFLAG(IS_ANDROID)
+  // Starting from Android 15, network requests initiated outside of a valid
+  // process lifecycle (e.g. in our case, while the app is in the background)
+  // will receive an exception:
+  // https://developer.android.com/about/versions/15/behavior-changes-all#background-network-access
+  // From our side, this manifests as the uploads failing with various errors
+  // (105 NAME_NOT_RESOLVED, 103 CONNECTION_ABORTED, 118 CONNECTION_TIMED_OUT,
+  // etc.). We have backoff logic to retry the uploads at increasingly long
+  // intervals when such errors are encountered -- with the assumption that
+  // something is currently wrong with the server -- but this is not true in
+  // this case. We should instead retry when the user foregrounds. Otherwise,
+  // the next upload attempt may unnecessarily get scheduled very far in the
+  // future (up to 24h) if the user leaves the app in the background for a long
+  // time, e.g. overnight. This has the side effect that when they actually
+  // start using Chrome again, logs don't get created periodically anymore. And
+  // although logs may be created through other means (e.g. upon backgrounding
+  // or foregrounding), they don't get uploaded because the next attempt is
+  // scheduled far in the future, which in turn results in an accumulation of
+  // logs on the device, which in turn results in logs being trimmed, which in
+  // turn results in data loss.
+  // See crbug.com/420459511.
+
+  // There are two scenarios of interest when the user foregrounds.
+  // First, the user foregrounds while we're waiting for the next scheduled
+  // upload (which may be far in the future because of the backoff logic). This
+  // is handled here -- we trigger the upload right away instead.
+  // Second, the user foregrounds while an upload initiated from the background
+  // is in progress (it can take a while before the request fails). In those
+  // cases, when the upload eventually fails, the upload will be re-scheduled,
+  // but we don't want it to use backoff interval logic since uploads should now
+  // start succeeding -- this is handled in OnLogUploadComplete() below.
+  if (upload_scheduler_ && upload_scheduler_->IsRunning() &&
+      !log_upload_in_progress_ &&
+      failures_started_from_background_.value_or(false) &&
+      base::FeatureList::IsEnabled(
+          features::kResetMetricsUploadBackoffOnForeground)) {
+    upload_scheduler_->RestartWithUnsentLogsInterval();
+  }
+#endif  // BUILDFLAG(IS_ANDROID)
+}
+#endif  // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
+
 //------------------------------------------------------------------------------
 // private methods
 //------------------------------------------------------------------------------
@@ -165,8 +217,14 @@
   if (!log_store()->has_staged_log())
     return;
 
-  DCHECK(!log_upload_in_progress_);
+  CHECK(!log_upload_in_progress_);
   log_upload_in_progress_ = true;
+#if BUILDFLAG(IS_ANDROID)
+  // Keep track of whether the upload was initiated from the background for the
+  // backoff reset logic (see feature kResetMetricsUploadBackoffOnForeground).
+  CHECK(!log_upload_initiated_from_background_.has_value());
+  log_upload_initiated_from_background_ = !is_in_foreground_;
+#endif  // BUILDFLAG(IS_ANDROID)
 
   if (!log_uploader_) {
     log_uploader_ = client_->CreateUploader(
@@ -201,8 +259,6 @@
     std::string_view force_discard_reason) {
   DVLOG(1) << "OnLogUploadComplete:" << response_code;
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(log_upload_in_progress_);
-  log_upload_in_progress_ = false;
 
   reporting_info_.set_last_response_code(response_code);
   reporting_info_.set_last_error_code(error_code);
@@ -295,6 +351,38 @@
     DVLOG(1) << "Stopping upload_scheduler_.";
     upload_scheduler_->Stop();
   }
+
+  CHECK(log_upload_in_progress_);
+  log_upload_in_progress_ = false;
+
+#if BUILDFLAG(IS_ANDROID)
+  // When `server_is_healthy` is false, representing a failure with the upload,
+  // then we will start using the backoff logic in `upload_scheduler_`. Keep
+  // track of if these failures only started happening while in the background.
+  // TODO: crbug.com/420459511: `server_is_healthy` is not accurate anymore,
+  // rename it here and other places.
+  if (!server_is_healthy) {
+    if (!failures_started_from_background_.has_value()) {
+      failures_started_from_background_ = log_upload_initiated_from_background_;
+    }
+    // Since Android 15, network requests initiated from the background will
+    // fail (see comment in `OnAppEnterForeground()` above for more details),
+    // even if the user foregrounds during the request. Don't use the backoff
+    // logic in this case since there's probably nothing wrong with the server
+    // (but only if the failures started happening from the background --
+    // otherwise, something wrong is probably going on).
+    if (*failures_started_from_background_ && is_in_foreground_ &&
+        base::FeatureList::IsEnabled(
+            features::kResetMetricsUploadBackoffOnForeground)) {
+      server_is_healthy = true;
+    }
+  } else {
+    failures_started_from_background_ = std::nullopt;
+  }
+  CHECK(log_upload_initiated_from_background_.has_value());
+  log_upload_initiated_from_background_ = std::nullopt;
+#endif  // BUILDFLAG(IS_ANDROID)
+
   upload_scheduler_->UploadFinished(server_is_healthy);
 }
 
diff --git a/components/metrics/reporting_service.h b/components/metrics/reporting_service.h
index be8f248..9533fca 100644
--- a/components/metrics/reporting_service.h
+++ b/components/metrics/reporting_service.h
@@ -77,9 +77,8 @@
   bool reporting_active() const;
 
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
-  void SetIsInForegound(bool is_in_foreground) {
-    is_in_foreground_ = is_in_foreground;
-  }
+  void OnAppEnterBackground();
+  void OnAppEnterForeground();
 #endif  // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
 
   // Registers local state prefs used by this class. This should only be called
@@ -151,6 +150,20 @@
   // Whether there is a current log upload in progress.
   bool log_upload_in_progress_;
 
+#if BUILDFLAG(IS_ANDROID)
+  // Whether the current log upload was initiated while the app was in the
+  // background. Set only when there is a log upload in progress (i.e. when
+  // `log_upload_in_progress_` above is true).
+  // TODO: crbug.com/420459511 - Consider putting this and
+  // `log_upload_in_progress_` together into a struct.
+  std::optional<bool> log_upload_initiated_from_background_ = std::nullopt;
+
+  // Set when the most recent uploads have failed. Its value will be whether the
+  // first failure was from an upload initiated from the background. Unset when
+  // a successful upload occurs.
+  std::optional<bool> failures_started_from_background_ = std::nullopt;
+#endif  // BUILDFLAG(IS_ANDROID)
+
   // The scheduler for determining when uploads should happen.
   std::unique_ptr<MetricsUploadScheduler> upload_scheduler_;
 
diff --git a/components/metrics/reporting_service_unittest.cc b/components/metrics/reporting_service_unittest.cc
index d29a99e..1d32ed9 100644
--- a/components/metrics/reporting_service_unittest.cc
+++ b/components/metrics/reporting_service_unittest.cc
@@ -14,10 +14,13 @@
 #include "base/functional/bind.h"
 #include "base/hash/sha1.h"
 #include "base/strings/string_util.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/test/test_simple_task_runner.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/test/task_environment.h"
 #include "components/metrics/log_store.h"
+#include "components/metrics/metrics_features.h"
 #include "components/metrics/metrics_log.h"
+#include "components/metrics/metrics_scheduler.h"
+#include "components/metrics/metrics_upload_scheduler.h"
 #include "components/metrics/test/test_metrics_service_client.h"
 #include "components/prefs/testing_pref_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -121,9 +124,7 @@
 
 class ReportingServiceTest : public testing::Test {
  public:
-  ReportingServiceTest()
-      : task_runner_(new base::TestSimpleTaskRunner),
-        task_runner_current_default_handle_(task_runner_) {
+  ReportingServiceTest() {
     ReportingService::RegisterPrefs(testing_local_state_.registry());
   }
 
@@ -135,9 +136,8 @@
   PrefService* GetLocalState() { return &testing_local_state_; }
 
  protected:
-  scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
-  base::SingleThreadTaskRunner::CurrentDefaultHandle
-      task_runner_current_default_handle_;
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   TestMetricsServiceClient client_;
 
  private:
@@ -152,25 +152,28 @@
   service.AddLog(TestLog("log2"));
 
   service.EnableReporting();
-  task_runner_->RunPendingTasks();
+  task_environment_.FastForwardBy(
+      base::Seconds(MetricsScheduler::GetInitialIntervalSeconds()));
   EXPECT_TRUE(client_.uploader()->is_uploading());
   EXPECT_EQ(1, client_.uploader()->reporting_info().attempt_count());
   EXPECT_FALSE(client_.uploader()->reporting_info().has_last_response_code());
 
   client_.uploader()->CompleteUpload(404);
-  task_runner_->RunPendingTasks();
+  task_environment_.FastForwardBy(
+      MetricsUploadScheduler::GetInitialBackoffInterval());
   EXPECT_TRUE(client_.uploader()->is_uploading());
   EXPECT_EQ(2, client_.uploader()->reporting_info().attempt_count());
   EXPECT_EQ(404, client_.uploader()->reporting_info().last_response_code());
 
   client_.uploader()->CompleteUpload(200);
-  task_runner_->RunPendingTasks();
+  task_environment_.FastForwardBy(
+      MetricsUploadScheduler::GetUnsentLogsInterval());
   EXPECT_TRUE(client_.uploader()->is_uploading());
   EXPECT_EQ(1, client_.uploader()->reporting_info().attempt_count());
   EXPECT_EQ(200, client_.uploader()->reporting_info().last_response_code());
 
   client_.uploader()->CompleteUpload(200);
-  EXPECT_EQ(0U, task_runner_->NumPendingTasks());
+  EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 0U);
   EXPECT_FALSE(client_.uploader()->is_uploading());
 }
 
@@ -183,19 +186,21 @@
   service.EnableReporting();
   client_.AllowMetricUploadForUserId(user_id);
 
-  task_runner_->RunPendingTasks();
+  task_environment_.FastForwardBy(
+      base::Seconds(MetricsScheduler::GetInitialIntervalSeconds()));
   EXPECT_TRUE(client_.uploader()->is_uploading());
   EXPECT_EQ(1, client_.uploader()->reporting_info().attempt_count());
   EXPECT_FALSE(client_.uploader()->reporting_info().has_last_response_code());
   client_.uploader()->CompleteUpload(200);
 
   // Upload 2nd log and last response code logged.
-  task_runner_->RunPendingTasks();
+  task_environment_.FastForwardBy(
+      MetricsUploadScheduler::GetUnsentLogsInterval());
   EXPECT_EQ(200, client_.uploader()->reporting_info().last_response_code());
   EXPECT_TRUE(client_.uploader()->is_uploading());
 
   client_.uploader()->CompleteUpload(200);
-  EXPECT_EQ(0U, task_runner_->NumPendingTasks());
+  EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 0U);
   EXPECT_FALSE(client_.uploader()->is_uploading());
 }
 
@@ -208,6 +213,8 @@
   // Log with user id should never be in uploading state if user upload
   // disabled. |client_.uploader()| should be nullptr since it is lazily
   // created when a log is to be uploaded for the first time.
+  task_environment_.FastForwardBy(
+      base::Seconds(MetricsScheduler::GetInitialIntervalSeconds()));
   EXPECT_EQ(client_.uploader(), nullptr);
 }
 
@@ -219,10 +226,12 @@
 
   // Simulate the server returning a 500 error, which indicates that the server
   // is unhealthy.
-  task_runner_->RunPendingTasks();
+  task_environment_.FastForwardBy(
+      base::Seconds(MetricsScheduler::GetInitialIntervalSeconds()));
   EXPECT_TRUE(client_.uploader()->is_uploading());
   client_.uploader()->CompleteUpload(500);
-  task_runner_->RunPendingTasks();
+  task_environment_.FastForwardBy(
+      MetricsUploadScheduler::GetInitialBackoffInterval());
   // Verify that the log is not discarded so that it can be re-sent later.
   EXPECT_TRUE(service.HasUnsentLogs());
   EXPECT_TRUE(client_.uploader()->is_uploading());
@@ -230,12 +239,131 @@
   // Simulate the server returning a 500 error again, but this time, with
   // |force_discard| set to true.
   client_.uploader()->CompleteUpload(500, /*force_discard=*/true);
-  task_runner_->RunPendingTasks();
   // Verify that the log was discarded, and that |service| is not uploading
   // anymore since there are no more logs.
   EXPECT_FALSE(service.HasUnsentLogs());
-  EXPECT_EQ(0U, task_runner_->NumPendingTasks());
+  EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 0U);
   EXPECT_FALSE(client_.uploader()->is_uploading());
 }
 
+#if BUILDFLAG(IS_ANDROID)
+TEST_F(ReportingServiceTest, ResetMetricsUploadBackoffOnForeground) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(
+      features::kResetMetricsUploadBackoffOnForeground);
+
+  TestReportingService service(&client_, GetLocalState());
+  service.AddLog(TestLog("log1"));
+  service.AddLog(TestLog("log2"));
+  service.AddLog(TestLog("log3"));
+
+  service.EnableReporting();
+
+  // Simulate the app being backgrounded.
+  service.OnAppEnterBackground();
+
+  // Simulate receiving a 105 (NAME_NOT_RESOLVED) error, which is one of the
+  // many errors returned when trying to do a network request while in the
+  // background on Android 15 and above.
+  task_environment_.FastForwardBy(
+      base::Seconds(MetricsScheduler::GetInitialIntervalSeconds()));
+  EXPECT_TRUE(client_.uploader()->is_uploading());
+  client_.uploader()->CompleteUpload(105);
+  // Verify that the upload has been re-scheduled with the the backoff interval.
+  EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 1U);
+  EXPECT_EQ(task_environment_.NextMainThreadPendingTaskDelay(),
+            MetricsUploadScheduler::GetInitialBackoffInterval());
+  // Simulate the app being foregrounded. The backoff should be reset, and the
+  // upload should have be re-scheduled with the normal interval.
+  service.OnAppEnterForeground();
+  EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 1U);
+  EXPECT_EQ(task_environment_.NextMainThreadPendingTaskDelay(),
+            MetricsUploadScheduler::GetUnsentLogsInterval());
+  // Simulate the successful upload of log1.
+  task_environment_.FastForwardBy(
+      MetricsUploadScheduler::GetUnsentLogsInterval());
+  EXPECT_TRUE(client_.uploader()->is_uploading());
+  client_.uploader()->CompleteUpload(200);
+
+  // The uploading of log2 should be scheduled with the normal interval as
+  // usual.
+  EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 1U);
+  EXPECT_EQ(task_environment_.NextMainThreadPendingTaskDelay(),
+            MetricsUploadScheduler::GetUnsentLogsInterval());
+  // Simulate the app being backgrounded and the upload being initiated.
+  service.OnAppEnterBackground();
+  task_environment_.FastForwardBy(
+      MetricsUploadScheduler::GetUnsentLogsInterval());
+  EXPECT_TRUE(client_.uploader()->is_uploading());
+  // Simulate the app being foregrounded while the upload is ongoing.
+  service.OnAppEnterForeground();
+  // Simulate the upload eventually completing with a 105 failure. The upload
+  // should have be re-scheduled, but *not* with the backoff interval.
+  client_.uploader()->CompleteUpload(105);
+  EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 1U);
+  EXPECT_EQ(task_environment_.NextMainThreadPendingTaskDelay(),
+            MetricsUploadScheduler::GetUnsentLogsInterval());
+  // Simulate the successful upload of log2.
+  task_environment_.FastForwardBy(
+      MetricsUploadScheduler::GetUnsentLogsInterval());
+  EXPECT_TRUE(client_.uploader()->is_uploading());
+  client_.uploader()->CompleteUpload(200);
+
+  // The uploading of log3 should be scheduled with the normal interval as
+  // usual.
+  EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 1U);
+  EXPECT_EQ(task_environment_.NextMainThreadPendingTaskDelay(),
+            MetricsUploadScheduler::GetUnsentLogsInterval());
+  // Simulate the upload failing (while still in the foreground).
+  task_environment_.FastForwardBy(
+      MetricsUploadScheduler::GetUnsentLogsInterval());
+  EXPECT_TRUE(client_.uploader()->is_uploading());
+  client_.uploader()->CompleteUpload(500);
+  // The upload should be re-scheduled with the backoff interval.
+  EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 1U);
+  EXPECT_EQ(task_environment_.NextMainThreadPendingTaskDelay(),
+            MetricsUploadScheduler::GetInitialBackoffInterval());
+  // Simulate the app being backgrounded, and the re-scheduled upload failing
+  // with yet another failure.
+  service.OnAppEnterBackground();
+  task_environment_.FastForwardBy(
+      MetricsUploadScheduler::GetInitialBackoffInterval());
+  EXPECT_TRUE(client_.uploader()->is_uploading());
+  client_.uploader()->CompleteUpload(105);
+  // The upload should be re-scheduled with an even longer backoff interval.
+  EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 1U);
+  base::TimeDelta current_backoff_interval =
+      task_environment_.NextMainThreadPendingTaskDelay();
+  EXPECT_GT(current_backoff_interval,
+            MetricsUploadScheduler::GetInitialBackoffInterval());
+  // Simulate the app being foregrounded. The backoff interval should *not* have
+  // been reset because the failures started while in the foreground.
+  service.OnAppEnterForeground();
+  EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 1U);
+  EXPECT_EQ(current_backoff_interval,
+            task_environment_.NextMainThreadPendingTaskDelay());
+  // Ditto when foregrounding during an upload.
+  service.OnAppEnterBackground();
+  task_environment_.FastForwardBy(current_backoff_interval);
+  EXPECT_TRUE(client_.uploader()->is_uploading());
+  service.OnAppEnterForeground();
+  client_.uploader()->CompleteUpload(105);
+  // The upload should have be re-scheduled, with an even longer backoff
+  // interval (i.e. it should not be reset) since, again, failures started from
+  // the foreground.
+  EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 1U);
+  base::TimeDelta current_backoff_interval2 =
+      task_environment_.NextMainThreadPendingTaskDelay();
+  EXPECT_GT(current_backoff_interval2, current_backoff_interval);
+  // Finally, simulate the successful upload of log3. There should be no more
+  // logs after that.
+  task_environment_.FastForwardBy(current_backoff_interval2);
+  EXPECT_TRUE(client_.uploader()->is_uploading());
+  client_.uploader()->CompleteUpload(200);
+  EXPECT_FALSE(service.HasUnsentLogs());
+  EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 0U);
+  EXPECT_FALSE(client_.uploader()->is_uploading());
+}
+#endif  // BUILDFLAG(IS_ANDROID)
+
 }  // namespace metrics
diff --git a/components/mirroring/browser/single_client_video_capture_host.cc b/components/mirroring/browser/single_client_video_capture_host.cc
index 88f29c6..be0f932e 100644
--- a/components/mirroring/browser/single_client_video_capture_host.cc
+++ b/components/mirroring/browser/single_client_video_capture_host.cc
@@ -7,7 +7,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/token.h"
 #include "content/public/browser/web_contents_media_capture_id.h"
 #include "media/capture/video/video_capture_buffer_pool.h"
@@ -239,7 +238,7 @@
   DVLOG(3) << __func__ << ": buffer_id=" << frame.buffer_id;
   DCHECK(observer_);
   const auto id_iter = id_map_.find(frame.buffer_id);
-  CHECK(id_iter != id_map_.end(), base::NotFatalUntil::M130);
+  CHECK(id_iter != id_map_.end());
   const int buffer_context_id = id_iter->second;
   const auto insert_result = buffer_context_map_.emplace(
       std::make_pair(buffer_context_id,
@@ -256,7 +255,7 @@
   DVLOG(3) << __func__ << ": buffer_id=" << buffer_id;
 
   const auto id_iter = id_map_.find(buffer_id);
-  CHECK(id_iter != id_map_.end(), base::NotFatalUntil::M130);
+  CHECK(id_iter != id_map_.end());
   const int buffer_context_id = id_iter->second;
   id_map_.erase(id_iter);
   if (buffer_context_map_.find(buffer_context_id) ==
diff --git a/components/no_state_prefetch/browser/no_state_prefetch_manager.cc b/components/no_state_prefetch/browser/no_state_prefetch_manager.cc
index 33d333a3..8dfb872 100644
--- a/components/no_state_prefetch/browser/no_state_prefetch_manager.cc
+++ b/components/no_state_prefetch/browser/no_state_prefetch_manager.cc
@@ -24,7 +24,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/field_trial.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/string_util.h"
 #include "base/system/sys_info.h"
@@ -302,7 +301,7 @@
   DCHECK(entry);
 
   auto it = FindIteratorForNoStatePrefetchContents(entry);
-  CHECK(it != active_prefetches_.end(), base::NotFatalUntil::M130);
+  CHECK(it != active_prefetches_.end());
   to_delete_prefetches_.push_back(std::move(*it));
   active_prefetches_.erase(it);
   // Destroy the old WebContents relatively promptly to reduce resource usage.
diff --git a/components/omnibox/browser/favicon_cache.cc b/components/omnibox/browser/favicon_cache.cc
index 380b4b7a..17e008e5 100644
--- a/components/omnibox/browser/favicon_cache.cc
+++ b/components/omnibox/browser/favicon_cache.cc
@@ -8,7 +8,6 @@
 
 #include "base/containers/lru_cache.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "components/favicon/core/favicon_service.h"
 #include "components/omnibox/browser/autocomplete_result.h"
 
@@ -153,7 +152,7 @@
   lru_cache_.Put(request, image);
 
   auto it = pending_requests_.find(request);
-  CHECK(it != pending_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_requests_.end());
   for (auto& callback : it->second) {
     std::move(callback).Run(image);
   }
diff --git a/components/omnibox/browser/history_fuzzy_provider.cc b/components/omnibox/browser/history_fuzzy_provider.cc
index 8676272f..24d4f9d 100644
--- a/components/omnibox/browser/history_fuzzy_provider.cc
+++ b/components/omnibox/browser/history_fuzzy_provider.cc
@@ -19,7 +19,6 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/system/sys_info.h"
 #include "base/time/time.h"
@@ -648,7 +647,7 @@
   // so ranking of the final result set will be more nuanced than ranking here.
   ACMatches::const_iterator it = std::min_element(
       matches.begin(), matches.end(), AutocompleteMatch::MoreRelevant);
-  CHECK(it != matches.end(), base::NotFatalUntil::M130);
+  CHECK(it != matches.end());
   matches_.push_back(*it);
 
   // Update match in place. Note, `match.provider` will be reassigned after
diff --git a/components/omnibox/browser/history_url_provider.cc b/components/omnibox/browser/history_url_provider.cc
index 299dd6ba..d50b081 100644
--- a/components/omnibox/browser/history_url_provider.cc
+++ b/components/omnibox/browser/history_url_provider.cc
@@ -16,7 +16,6 @@
 #include "base/location.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/sequenced_task_runner.h"
@@ -1087,9 +1086,8 @@
   // keep this one since it is rated the highest.
   history::HistoryMatches::iterator first(std::ranges::find_first_of(
       *matches, remove, history::HistoryMatch::EqualsGURL));
-  CHECK(first != matches->end(), base::NotFatalUntil::M130)
-      << "We should have always found at least the "
-         "original URL.";
+  CHECK(first != matches->end()) << "We should have always found at least the "
+                                    "original URL.";
 
   // Find any following occurrences of any URL in the redirect chain, these
   // should be deleted.
diff --git a/components/omnibox/browser/url_index_private_data.cc b/components/omnibox/browser/url_index_private_data.cc
index 7358a88ae..d1ee9fe 100644
--- a/components/omnibox/browser/url_index_private_data.cc
+++ b/components/omnibox/browser/url_index_private_data.cc
@@ -22,7 +22,6 @@
 #include "base/i18n/case_conversion.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/stl_util.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
@@ -699,7 +698,7 @@
     auto hist_pos = history_info_map_.find(history_id);
     const history::URLRow& hist_item = hist_pos->second.url_row;
     auto starts_pos = word_starts_map_.find(history_id);
-    CHECK(starts_pos != word_starts_map_.end(), base::NotFatalUntil::M130);
+    CHECK(starts_pos != word_starts_map_.end());
 
     bool is_highly_visited_host =
         !host_filter.empty() ||
@@ -881,8 +880,7 @@
   // Reconcile any changes to word usage.
   for (WordID word_id : word_id_set) {
     auto word_id_history_map_iter = word_id_history_map_.find(word_id);
-    CHECK(word_id_history_map_iter != word_id_history_map_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(word_id_history_map_iter != word_id_history_map_.end());
 
     word_id_history_map_iter->second.erase(history_id);
     if (!word_id_history_map_iter->second.empty())
diff --git a/components/optimization_guide/core/prediction_manager.cc b/components/optimization_guide/core/prediction_manager.cc
index f965285..e5716a4 100644
--- a/components/optimization_guide/core/prediction_manager.cc
+++ b/components/optimization_guide/core/prediction_manager.cc
@@ -17,7 +17,6 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/histogram_macros_local.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/path_service.h"
 #include "base/sequence_checker.h"
@@ -319,8 +318,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto registration_info =
       model_registration_info_map_.find(optimization_target);
-  CHECK(registration_info != model_registration_info_map_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(registration_info != model_registration_info_map_.end());
 
   auto& observers = registration_info->second.model_observers;
   DCHECK(observers.HasObserver(observer));
diff --git a/components/optimization_guide/internal b/components/optimization_guide/internal
index e6fa5c8..8848d156 160000
--- a/components/optimization_guide/internal
+++ b/components/optimization_guide/internal
@@ -1 +1 @@
-Subproject commit e6fa5c8b549ff20533d07a862d25cb639e3bb1ab
+Subproject commit 8848d156621b845a0d411609ddd1567b8c8db42b
diff --git a/components/paint_preview/common/paint_preview_tracker.cc b/components/paint_preview/common/paint_preview_tracker.cc
index 2dc8a20..1433f2b 100644
--- a/components/paint_preview/common/paint_preview_tracker.cc
+++ b/components/paint_preview/common/paint_preview_tracker.cc
@@ -16,7 +16,6 @@
 
 #include "base/check.h"
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "components/paint_preview/common/glyph_usage.h"
 #include "components/paint_preview/common/mojom/paint_preview_recorder.mojom.h"
 #include "third_party/skia/include/core/SkCanvas.h"
@@ -167,7 +166,7 @@
   auto it = subframe_pics_.find(content_id);
   // DCHECK is sufficient as |subframe_pics_| has same entries as
   // |content_id_to_proxy_id|.
-  CHECK(it != subframe_pics_.end(), base::NotFatalUntil::M130);
+  CHECK(it != subframe_pics_.end());
 
   SkRect rect = it->second->cullRect();
   SkMatrix subframe_offset = SkMatrix::Translate(rect.x(), rect.y());
diff --git a/components/password_manager/core/browser/affiliation/affiliated_match_helper.cc b/components/password_manager/core/browser/affiliation/affiliated_match_helper.cc
index c6af628e..90bcd86f 100644
--- a/components/password_manager/core/browser/affiliation/affiliated_match_helper.cc
+++ b/components/password_manager/core/browser/affiliation/affiliated_match_helper.cc
@@ -11,7 +11,6 @@
 
 #include "base/barrier_callback.h"
 #include "base/barrier_closure.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "components/affiliations/core/browser/affiliation_service.h"
 #include "components/password_manager/core/browser/password_form.h"
@@ -209,7 +208,7 @@
   // icon URL). We expect to always find a matching facet URI in the results.
   auto facet = std::ranges::find(results, facet_uri, &Facet::uri);
 
-  CHECK(facet != results.end(), base::NotFatalUntil::M130);
+  CHECK(facet != results.end());
   form->app_display_name = facet->branding_info.name;
   form->app_icon_url = facet->branding_info.icon_url;
 
diff --git a/components/password_manager/core/browser/form_parsing/form_data_parser.cc b/components/password_manager/core/browser/form_parsing/form_data_parser.cc
index e787083..83a17fb 100644
--- a/components/password_manager/core/browser/form_parsing/form_data_parser.cc
+++ b/components/password_manager/core/browser/form_parsing/form_data_parser.cc
@@ -21,7 +21,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/raw_ptr_exclusion.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_split.h"
 #include "build/build_config.h"
 #include "components/autofill/core/browser/field_types.h"
@@ -748,8 +747,7 @@
     FormDataParser::Mode mode,
     Interactability best_interactability,
     bool is_fallback) {
-  CHECK(first_relevant_password != processed_fields.end(),
-        base::NotFatalUntil::M130);
+  CHECK(first_relevant_password != processed_fields.end());
 
   // For saving filter out empty fields and fields with values which are not
   // username.
@@ -873,8 +871,7 @@
       }
     }
   }
-  CHECK(first_relevant_password != processed_fields.end(),
-        base::NotFatalUntil::M130);
+  CHECK(first_relevant_password != processed_fields.end());
 
   if (found_fields->username) {
     return;
diff --git a/components/password_manager/core/browser/import/csv_password_sequence.cc b/components/password_manager/core/browser/import/csv_password_sequence.cc
index b1138d9..0d39bd21 100644
--- a/components/password_manager/core/browser/import/csv_password_sequence.cc
+++ b/components/password_manager/core/browser/import/csv_password_sequence.cc
@@ -11,7 +11,6 @@
 
 #include "base/containers/fixed_flat_map.h"
 #include "base/containers/flat_set.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "components/password_manager/core/browser/import/csv_field_parser.h"
 #include "components/password_manager/core/browser/import/csv_password.h"
@@ -75,7 +74,7 @@
   // Trim leading/trailing whitespaces from |name|.
   base::TrimWhitespaceASCII(name, base::TRIM_ALL, &trimmed_name);
   auto it = kNoteLabelsPriority.find(base::ToLowerASCII(trimmed_name));
-  CHECK(it != kNoteLabelsPriority.end(), base::NotFatalUntil::M130);
+  CHECK(it != kNoteLabelsPriority.end());
   return it->second;
 }
 
diff --git a/components/payments/content/installable_payment_app_crawler.cc b/components/payments/content/installable_payment_app_crawler.cc
index d7daee0..7eaaef8 100644
--- a/components/payments/content/installable_payment_app_crawler.cc
+++ b/components/payments/content/installable_payment_app_crawler.cc
@@ -9,7 +9,6 @@
 
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/payments/content/icon/icon_size.h"
@@ -510,7 +509,7 @@
   switch (crawling_mode_) {
     case CrawlingMode::kJustInTimeInstallation: {
       auto it = installable_apps_.find(method_manifest_url);
-      CHECK(it != installable_apps_.end(), base::NotFatalUntil::M130);
+      CHECK(it != installable_apps_.end());
       DCHECK(
           IsSameOriginWith(GURL(it->second->sw_scope), web_app_manifest_url));
       if (icon.drawsNothing() &&
@@ -532,8 +531,7 @@
     case CrawlingMode::kInstalledAppMetadataRefresh: {
       auto it =
           method_manifest_urls_for_metadata_refresh_.find(method_manifest_url);
-      CHECK(it != method_manifest_urls_for_metadata_refresh_.end(),
-            base::NotFatalUntil::M130);
+      CHECK(it != method_manifest_urls_for_metadata_refresh_.end());
       if (icon.drawsNothing()) {
         log_.Warn("Failed to refetch a valid icon from web app manifest \"" +
                   web_app_manifest_url.spec() +
diff --git a/components/payments/core/payment_manifest_downloader.cc b/components/payments/core/payment_manifest_downloader.cc
index af2de5f..2e6959b 100644
--- a/components/payments/core/payment_manifest_downloader.cc
+++ b/components/payments/core/payment_manifest_downloader.cc
@@ -13,7 +13,6 @@
 #include "base/containers/contains.h"
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
@@ -187,7 +186,7 @@
     const network::mojom::URLResponseHead& response_head,
     std::vector<std::string>* to_be_removed_headers) {
   auto download_it = downloads_.find(url_loader);
-  CHECK(download_it != downloads_.end(), base::NotFatalUntil::M130);
+  CHECK(download_it != downloads_.end());
 
   std::unique_ptr<Download> download = std::move(download_it->second);
   downloads_.erase(download_it);
@@ -248,7 +247,7 @@
     scoped_refptr<net::HttpResponseHeaders> headers,
     int net_error) {
   auto download_it = downloads_.find(url_loader);
-  CHECK(download_it != downloads_.end(), base::NotFatalUntil::M130);
+  CHECK(download_it != downloads_.end());
 
   std::unique_ptr<Download> download = std::move(download_it->second);
   downloads_.erase(download_it);
diff --git a/components/performance_manager/execution_context_priority/boosting_vote_aggregator.cc b/components/performance_manager/execution_context_priority/boosting_vote_aggregator.cc
index 51890ae..d49dd2b9 100644
--- a/components/performance_manager/execution_context_priority/boosting_vote_aggregator.cc
+++ b/components/performance_manager/execution_context_priority/boosting_vote_aggregator.cc
@@ -9,7 +9,6 @@
 #include <tuple>
 #include <utility>
 
-#include "base/not_fatal_until.h"
 #include "components/performance_manager/public/execution_context/execution_context.h"
 
 // This voter allows expressing "priority boosts" which are used to resolve
@@ -503,7 +502,7 @@
 BoostingVoteAggregator::NodeDataMap::iterator
 BoostingVoteAggregator::FindNodeData(const ExecutionContext* node) {
   auto it = nodes_.find(node);
-  CHECK(it != nodes_.end(), base::NotFatalUntil::M130);
+  CHECK(it != nodes_.end());
   return it;
 }
 
@@ -531,7 +530,7 @@
   // Otherwise, this node has inherited its priority. Find the active incoming
   // edge and use the active reason for that edge.
   auto edge_it = GetActiveInboundEdge(layer_bit, node);
-  CHECK(edge_it != reverse_edges_.end(), base::NotFatalUntil::M130);
+  CHECK(edge_it != reverse_edges_.end());
   DCHECK(edge_it->second->GetReasonCount());
   return edge_it->second->GetActiveReason();
 }
diff --git a/components/performance_manager/execution_context_priority/inherit_client_priority_voter.cc b/components/performance_manager/execution_context_priority/inherit_client_priority_voter.cc
index bd30b4d..5fe654f 100644
--- a/components/performance_manager/execution_context_priority/inherit_client_priority_voter.cc
+++ b/components/performance_manager/execution_context_priority/inherit_client_priority_voter.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 #include "components/performance_manager/public/execution_context/execution_context.h"
 #include "components/performance_manager/public/execution_context/execution_context_registry.h"
 #include "components/performance_manager/public/graph/graph.h"
@@ -115,7 +114,7 @@
   // priority.
 
   auto it = voting_channels_.find(GetExecutionContext(frame_node));
-  CHECK(it != voting_channels_.end(), base::NotFatalUntil::M130);
+  CHECK(it != voting_channels_.end());
   auto& voting_channel = it->second;
 
   const std::optional<Vote> inherited_vote = GetVoteFromClient(frame_node);
@@ -151,7 +150,7 @@
 
   // Get the voting channel for the client.
   auto it = voting_channels_.find(GetExecutionContext(client_frame_node));
-  CHECK(it != voting_channels_.end(), base::NotFatalUntil::M130);
+  CHECK(it != voting_channels_.end());
   auto& voting_channel = it->second;
 
   const std::optional<Vote> vote = GetVoteFromClient(client_frame_node);
@@ -166,7 +165,7 @@
 
   // Get the voting channel for the client.
   auto it = voting_channels_.find(GetExecutionContext(client_frame_node));
-  CHECK(it != voting_channels_.end(), base::NotFatalUntil::M130);
+  CHECK(it != voting_channels_.end());
   auto& voting_channel = it->second;
 
   voting_channel.InvalidateVote(GetExecutionContext(worker_node));
@@ -180,7 +179,7 @@
 
   // Get the voting channel for the client.
   auto it = voting_channels_.find(GetExecutionContext(client_worker_node));
-  CHECK(it != voting_channels_.end(), base::NotFatalUntil::M130);
+  CHECK(it != voting_channels_.end());
   auto& voting_channel = it->second;
 
   const std::optional<Vote> inherited_vote =
@@ -196,7 +195,7 @@
 
   // Get the voting channel for the client.
   auto it = voting_channels_.find(GetExecutionContext(client_worker_node));
-  CHECK(it != voting_channels_.end(), base::NotFatalUntil::M130);
+  CHECK(it != voting_channels_.end());
   auto& voting_channel = it->second;
 
   voting_channel.InvalidateVote(GetExecutionContext(worker_node));
@@ -215,7 +214,7 @@
   // priority.
 
   auto it = voting_channels_.find(GetExecutionContext(worker_node));
-  CHECK(it != voting_channels_.end(), base::NotFatalUntil::M130);
+  CHECK(it != voting_channels_.end());
   auto& voting_channel = it->second;
 
   const std::optional<Vote> inherited_vote = GetVoteFromClient(worker_node);
diff --git a/components/performance_manager/execution_context_priority/max_vote_aggregator.cc b/components/performance_manager/execution_context_priority/max_vote_aggregator.cc
index 3d0b243..ff56b68 100644
--- a/components/performance_manager/execution_context_priority/max_vote_aggregator.cc
+++ b/components/performance_manager/execution_context_priority/max_vote_aggregator.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 #include <tuple>
 
-#include "base/not_fatal_until.h"
 
 namespace performance_manager {
 namespace execution_context_priority {
@@ -117,7 +116,7 @@
 MaxVoteAggregator::VoteDataMap::iterator MaxVoteAggregator::GetVoteData(
     const ExecutionContext* execution_context) {
   auto it = vote_data_map_.find(execution_context);
-  CHECK(it != vote_data_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != vote_data_map_.end());
   return it;
 }
 
@@ -142,7 +141,7 @@
 void MaxVoteAggregator::VoteData::UpdateVote(VoterId voter_id,
                                              const Vote& new_vote) {
   auto it = heap_handles_.find(voter_id);
-  CHECK(it != heap_handles_.end(), base::NotFatalUntil::M130);
+  CHECK(it != heap_handles_.end());
   base::HeapHandle* heap_handle = it->second;
 
   votes_.Modify(*heap_handle, [&new_vote](StampedVote& element) {
@@ -152,7 +151,7 @@
 
 void MaxVoteAggregator::VoteData::RemoveVote(VoterId voter_id) {
   auto it = heap_handles_.find(voter_id);
-  CHECK(it != heap_handles_.end(), base::NotFatalUntil::M130);
+  CHECK(it != heap_handles_.end());
   base::HeapHandle* heap_handle = it->second;
   heap_handles_.erase(it);
 
diff --git a/components/performance_manager/execution_context_priority/override_vote_aggregator.cc b/components/performance_manager/execution_context_priority/override_vote_aggregator.cc
index d88dab3..0a07b979 100644
--- a/components/performance_manager/execution_context_priority/override_vote_aggregator.cc
+++ b/components/performance_manager/execution_context_priority/override_vote_aggregator.cc
@@ -4,8 +4,6 @@
 
 #include "components/performance_manager/public/execution_context_priority/override_vote_aggregator.h"
 
-#include "base/not_fatal_until.h"
-
 namespace performance_manager {
 namespace execution_context_priority {
 
@@ -175,7 +173,7 @@
 OverrideVoteAggregator::VoteDataMap::iterator
 OverrideVoteAggregator::GetVoteData(const ExecutionContext* execution_context) {
   auto it = vote_data_map_.find(execution_context);
-  CHECK(it != vote_data_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != vote_data_map_.end());
   return it;
 }
 
diff --git a/components/performance_manager/graph/page_node_impl.cc b/components/performance_manager/graph/page_node_impl.cc
index 7801cdd..6d5f43d 100644
--- a/components/performance_manager/graph/page_node_impl.cc
+++ b/components/performance_manager/graph/page_node_impl.cc
@@ -10,7 +10,6 @@
 #include "base/check_op.h"
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/strcat.h"
 #include "base/time/default_tick_clock.h"
 #include "base/trace_event/typed_macros.h"
@@ -76,7 +75,7 @@
   // committed url can be set, so the initial main frame URL is always empty.
   // TODO(crbug.com/40121561): Remove `visible_url` from the constructor in M132
   // if no issues are found with this CHECK.
-  CHECK(main_frame_url_.value().is_empty(), base::NotFatalUntil::M132);
+  CHECK(main_frame_url_.value().is_empty());
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   if (is_audible_.value()) {
     audible_change_time_ = base::TimeTicks::Now();
diff --git a/components/performance_manager/performance_manager_registry_impl.cc b/components/performance_manager/performance_manager_registry_impl.cc
index 6fd0fe0..eed994a7 100644
--- a/components/performance_manager/performance_manager_registry_impl.cc
+++ b/components/performance_manager/performance_manager_registry_impl.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "components/performance_manager/embedder/binders.h"
 #include "components/performance_manager/graph/page_node_impl.h"
@@ -138,7 +137,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   auto it = worker_watchers_.find(browser_context);
-  CHECK(it != worker_watchers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != worker_watchers_.end());
   it->second->TearDown();
   worker_watchers_.erase(it);
 
diff --git a/components/performance_manager/performance_manager_tab_helper.cc b/components/performance_manager/performance_manager_tab_helper.cc
index 63107cf..7a8f956 100644
--- a/components/performance_manager/performance_manager_tab_helper.cc
+++ b/components/performance_manager/performance_manager_tab_helper.cc
@@ -12,7 +12,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/supports_user_data.h"
 #include "components/guest_view/buildflags/buildflags.h"
@@ -256,7 +255,7 @@
 void PerformanceManagerTabHelper::RenderFrameDeleted(
     content::RenderFrameHost* render_frame_host) {
   auto it = frames_.find(render_frame_host);
-  CHECK(it != frames_.end(), base::NotFatalUntil::M130);
+  CHECK(it != frames_.end());
 
   std::unique_ptr<FrameNodeImpl> frame_node = std::move(it->second);
 
@@ -621,7 +620,7 @@
     content::RenderFrameHost* render_frame_host,
     mojo::PendingReceiver<mojom::DocumentCoordinationUnit> receiver) {
   auto it = frames_.find(render_frame_host);
-  CHECK(it != frames_.end(), base::NotFatalUntil::M130);
+  CHECK(it != frames_.end());
 
   auto* frame_node = it->second.get();
   frame_node->Bind(std::move(receiver));
diff --git a/components/performance_manager/public/voting/voting.h b/components/performance_manager/public/voting/voting.h
index 07072ec..0ac89659 100644
--- a/components/performance_manager/public/voting/voting.h
+++ b/components/performance_manager/public/voting/voting.h
@@ -50,7 +50,6 @@
 #include "base/containers/flat_map.h"
 #include "base/dcheck_is_on.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/types/id_type.h"
 #include "base/types/pass_key.h"
 
@@ -300,7 +299,7 @@
 #if DCHECK_IS_ON()
   // Ensure that a vote exists for this context.
   auto it = votes_.find(context);
-  CHECK(it != votes_.end(), base::NotFatalUntil::M130);
+  CHECK(it != votes_.end());
 
   // Ensure the vote was actually changed.
   DCHECK(new_vote != it->second);
diff --git a/components/performance_manager/tab_helper_frame_node_source.cc b/components/performance_manager/tab_helper_frame_node_source.cc
index da6ffa3..811e525 100644
--- a/components/performance_manager/tab_helper_frame_node_source.cc
+++ b/components/performance_manager/tab_helper_frame_node_source.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 
@@ -140,7 +139,7 @@
     PerformanceManagerTabHelper* performance_manager_tab_helper,
     FrameNodeImpl* frame_node) {
   auto it = observed_frame_nodes_.find(performance_manager_tab_helper);
-  CHECK(it != observed_frame_nodes_.end(), base::NotFatalUntil::M130);
+  CHECK(it != observed_frame_nodes_.end());
 
   base::flat_set<raw_ptr<FrameNodeImpl, CtnExperimental>>& frame_nodes =
       it->second;
diff --git a/components/performance_manager/test_support/voting.h b/components/performance_manager/test_support/voting.h
index 6db90fd..1c2662ef 100644
--- a/components/performance_manager/test_support/voting.h
+++ b/components/performance_manager/test_support/voting.h
@@ -7,7 +7,6 @@
 
 #include "base/containers/contains.h"
 #include "base/containers/flat_map.h"
-#include "base/not_fatal_until.h"
 #include "components/performance_manager/public/voting/voting.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -155,7 +154,7 @@
                                                 const ContextType* context,
                                                 const VoteImpl& new_vote) {
   auto it = votes_by_voter_id_[voter_id].find(context);
-  CHECK(it != votes_by_voter_id_[voter_id].end(), base::NotFatalUntil::M130);
+  CHECK(it != votes_by_voter_id_[voter_id].end());
   it->second = new_vote;
 }
 
@@ -164,7 +163,7 @@
     VoterId<VoteImpl> voter_id,
     const ContextType* context) {
   auto it = votes_by_voter_id_.find(voter_id);
-  CHECK(it != votes_by_voter_id_.end(), base::NotFatalUntil::M130);
+  CHECK(it != votes_by_voter_id_.end());
 
   base::flat_map<const ContextType*, VoteImpl>& votes = it->second;
   size_t removed = votes.erase(context);
diff --git a/components/performance_manager/v8_memory/v8_context_tracker_internal.cc b/components/performance_manager/v8_memory/v8_context_tracker_internal.cc
index e4964b9..1710f714 100644
--- a/components/performance_manager/v8_memory/v8_context_tracker_internal.cc
+++ b/components/performance_manager/v8_memory/v8_context_tracker_internal.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 #include "components/performance_manager/v8_memory/v8_context_tracker_helpers.h"
 
 namespace performance_manager {
@@ -418,7 +417,7 @@
 void V8ContextTrackerDataStore::Destroy(
     const blink::ExecutionContextToken& token) {
   auto it = global_execution_context_datas_.find(token);
-  CHECK(it != global_execution_context_datas_.end(), base::NotFatalUntil::M130);
+  CHECK(it != global_execution_context_datas_.end());
   auto* ec_data = it->get();
   if (ec_data->destroyed) {
     DCHECK_LT(0u, destroyed_execution_context_count_);
@@ -433,7 +432,7 @@
 
 void V8ContextTrackerDataStore::Destroy(const blink::RemoteFrameToken& token) {
   auto it = global_remote_frame_datas_.find(token);
-  CHECK(it != global_remote_frame_datas_.end(), base::NotFatalUntil::M130);
+  CHECK(it != global_remote_frame_datas_.end());
   auto* rf_data = it->get();
   rf_data->process_data()->Remove(PassKey(), rf_data);
   global_remote_frame_datas_.erase(it);
@@ -441,7 +440,7 @@
 
 void V8ContextTrackerDataStore::Destroy(const blink::V8ContextToken& token) {
   auto it = global_v8_context_datas_.find(token);
-  CHECK(it != global_v8_context_datas_.end(), base::NotFatalUntil::M130);
+  CHECK(it != global_v8_context_datas_.end());
   auto* v8_data = it->get();
   if (v8_data->detached) {
     DCHECK_LT(0u, detached_v8_context_count_);
diff --git a/components/performance_manager/worker_watcher.cc b/components/performance_manager/worker_watcher.cc
index 1833e64..9f18a027 100644
--- a/components/performance_manager/worker_watcher.cc
+++ b/components/performance_manager/worker_watcher.cc
@@ -14,7 +14,6 @@
 #include "base/functional/overloaded.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "components/performance_manager/frame_node_source.h"
 #include "components/performance_manager/graph/frame_node_impl.h"
@@ -196,7 +195,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   auto it = dedicated_worker_nodes_.find(dedicated_worker_token);
-  CHECK(it != dedicated_worker_nodes_.end(), base::NotFatalUntil::M130);
+  CHECK(it != dedicated_worker_nodes_.end());
 
   auto worker_node = std::move(it->second);
 
@@ -276,7 +275,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   auto it = shared_worker_nodes_.find(shared_worker_token);
-  CHECK(it != shared_worker_nodes_.end(), base::NotFatalUntil::M130);
+  CHECK(it != shared_worker_nodes_.end());
 
   auto worker_node = std::move(it->second);
 
@@ -367,7 +366,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   auto it = service_worker_nodes_.find(version_id);
-  CHECK(it != service_worker_nodes_.end(), base::NotFatalUntil::M130);
+  CHECK(it != service_worker_nodes_.end());
 
   auto service_worker_node = std::move(it->second);
 
@@ -451,13 +450,13 @@
 
   // First get clients for this worker.
   auto it = service_worker_clients_.find(version_id);
-  CHECK(it != service_worker_clients_.end(), base::NotFatalUntil::M130);
+  CHECK(it != service_worker_clients_.end());
 
   base::flat_map<std::string /*client_uuid*/, content::ServiceWorkerClientInfo>&
       clients = it->second;
 
   auto it2 = clients.find(client_uuid);
-  CHECK(it2 != clients.end(), base::NotFatalUntil::M130);
+  CHECK(it2 != clients.end());
   const content::ServiceWorkerClientInfo client = it2->second;
   clients.erase(it2);
 
@@ -586,8 +585,7 @@
     // RemoveFrameClientConnection() call was still expected even though the
     // client frame node no longer exist.
     auto it = detached_frame_count_per_worker_.find(worker_node);
-    CHECK(it != detached_frame_count_per_worker_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(it != detached_frame_count_per_worker_.end());
 
     int& count = it->second;
     DCHECK_GT(count, 0);
@@ -654,8 +652,7 @@
 #if DCHECK_IS_ON()
     if (IsServiceWorkerNode(worker_node)) {
       auto it = missing_service_worker_clients_.find(worker_node);
-      CHECK(it != missing_service_worker_clients_.end(),
-            base::NotFatalUntil::M130);
+      CHECK(it != missing_service_worker_clients_.end());
       DCHECK_EQ(1u, it->second.erase(content::ServiceWorkerClientInfo(
                         client_dedicated_worker_token)));
       if (it->second.empty()) {
@@ -669,7 +666,7 @@
   // Remove |worker_node| from the set of child workers of this dedicated
   // worker.
   auto it = dedicated_worker_child_workers_.find(client_dedicated_worker_token);
-  CHECK(it != dedicated_worker_child_workers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != dedicated_worker_child_workers_.end());
   auto& child_workers = it->second;
 
   size_t removed = child_workers.erase(worker_node);
@@ -724,8 +721,7 @@
 #if DCHECK_IS_ON()
     DCHECK(IsServiceWorkerNode(worker_node));
     auto it = missing_service_worker_clients_.find(worker_node);
-    CHECK(it != missing_service_worker_clients_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(it != missing_service_worker_clients_.end());
     DCHECK_EQ(1u, it->second.erase(content::ServiceWorkerClientInfo(
                       client_shared_worker_token)));
     if (it->second.empty())
@@ -736,8 +732,7 @@
 
   // Remove |worker_node| from the set of child workers of this shared worker.
   auto child_it = shared_worker_child_workers_.find(client_shared_worker_token);
-  CHECK(child_it != shared_worker_child_workers_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(child_it != shared_worker_child_workers_.end());
   auto& child_workers = child_it->second;
 
   size_t removed = child_workers.erase(worker_node);
@@ -812,8 +807,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   auto it = frame_node_child_worker_connections_.find(render_frame_host_id);
-  CHECK(it != frame_node_child_worker_connections_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(it != frame_node_child_worker_connections_.end());
 
   // Clean up all child workers of this frame node.
   WorkerNodeConnections child_worker_connections = std::move(it->second);
@@ -861,8 +855,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   auto it = frame_node_child_worker_connections_.find(render_frame_host_id);
-  CHECK(it != frame_node_child_worker_connections_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(it != frame_node_child_worker_connections_.end());
   auto& child_worker_connections = it->second;
 
   DCHECK_LE(1u, child_worker_connections[child_worker_node]);
diff --git a/components/permissions/android/permissions_reprompt_controller_android.cc b/components/permissions/android/permissions_reprompt_controller_android.cc
index 6a45c6c5..f49405b 100644
--- a/components/permissions/android/permissions_reprompt_controller_android.cc
+++ b/components/permissions/android/permissions_reprompt_controller_android.cc
@@ -5,7 +5,6 @@
 #include "components/permissions/android/permissions_reprompt_controller_android.h"
 
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 #include "components/permissions/android/android_permission_util.h"
 #include "components/permissions/permissions_client.h"
 #include "content/public/browser/web_contents.h"
@@ -35,7 +34,7 @@
     const RequestKey& request_key,
     bool success) {
   auto it = pending_callbacks_.find(request_key);
-  CHECK(it != pending_callbacks_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_callbacks_.end());
 
   for (auto& callback : it->second.second) {
     std::move(callback).Run(success);
diff --git a/components/permissions/bluetooth_chooser_controller.cc b/components/permissions/bluetooth_chooser_controller.cc
index 8d183fd..c6724a8 100644
--- a/components/permissions/bluetooth_chooser_controller.cc
+++ b/components/permissions/bluetooth_chooser_controller.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 
 #include "base/check_op.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/strings/grit/components_branded_strings.h"
@@ -75,10 +74,9 @@
   DCHECK_LT(index, devices_.size());
   const std::string& device_id = devices_[index].id;
   const auto& device_name_it = device_id_to_name_map_.find(device_id);
-  CHECK(device_name_it != device_id_to_name_map_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(device_name_it != device_id_to_name_map_.end());
   const auto& it = device_name_counts_.find(device_name_it->second);
-  CHECK(it != device_name_counts_.end(), base::NotFatalUntil::M130);
+  CHECK(it != device_name_counts_.end());
   return it->second == 1
              ? device_name_it->second
              : l10n_util::GetStringFUTF16(
@@ -178,7 +176,7 @@
       name_it->second = device_name;
 
       const auto& it = device_name_counts_.find(previous_device_name);
-      CHECK(it != device_name_counts_.end(), base::NotFatalUntil::M130);
+      CHECK(it != device_name_counts_.end());
       DCHECK_GT(it->second, 0);
 
       if (--(it->second) == 0)
@@ -190,7 +188,7 @@
     auto device_it =
         std::ranges::find(devices_, device_id, &BluetoothDeviceInfo::id);
 
-    CHECK(device_it != devices_.end(), base::NotFatalUntil::M130);
+    CHECK(device_it != devices_.end());
     // When Bluetooth device scanning stops, the |signal_strength_level|
     // is -1, and in this case, should still use the previously stored
     // signal strength level value.
@@ -224,7 +222,7 @@
     devices_.erase(device_it);
 
     const auto& it = device_name_counts_.find(name_it->second);
-    CHECK(it != device_name_counts_.end(), base::NotFatalUntil::M130);
+    CHECK(it != device_name_counts_.end());
     DCHECK_GT(it->second, 0);
 
     if (--(it->second) == 0)
diff --git a/components/permissions/bluetooth_scanning_prompt_controller.cc b/components/permissions/bluetooth_scanning_prompt_controller.cc
index df7f295..f43fffd 100644
--- a/components/permissions/bluetooth_scanning_prompt_controller.cc
+++ b/components/permissions/bluetooth_scanning_prompt_controller.cc
@@ -6,7 +6,6 @@
 
 #include <algorithm>
 
-#include "base/not_fatal_until.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/strings/grit/components_strings.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -66,10 +65,9 @@
   DCHECK_LT(index, device_ids_.size());
   const std::string& device_id = device_ids_[index];
   const auto& device_name_it = device_id_to_name_map_.find(device_id);
-  CHECK(device_name_it != device_id_to_name_map_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(device_name_it != device_id_to_name_map_.end());
   const auto& it = device_name_counts_.find(device_name_it->second);
-  CHECK(it != device_name_counts_.end(), base::NotFatalUntil::M130);
+  CHECK(it != device_name_counts_.end());
   return it->second == 1
              ? device_name_it->second
              : l10n_util::GetStringFUTF16(
@@ -120,7 +118,7 @@
       name_it->second = device_name_for_display;
 
       const auto& it = device_name_counts_.find(previous_device_name);
-      CHECK(it != device_name_counts_.end(), base::NotFatalUntil::M130);
+      CHECK(it != device_name_counts_.end());
       DCHECK_GT(it->second, 0);
 
       if (--(it->second) == 0)
@@ -131,7 +129,7 @@
 
     auto device_id_it = std::ranges::find(device_ids_, device_id);
 
-    CHECK(device_id_it != device_ids_.end(), base::NotFatalUntil::M130);
+    CHECK(device_id_it != device_ids_.end());
     if (view())
       view()->OnOptionUpdated(device_id_it - device_ids_.begin());
     return;
diff --git a/components/permissions/permission_context_base.cc b/components/permissions/permission_context_base.cc
index 4daa429fe..05321f0 100644
--- a/components/permissions/permission_context_base.cc
+++ b/components/permissions/permission_context_base.cc
@@ -18,7 +18,6 @@
 #include "base/logging.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/field_trial_params.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -552,7 +551,7 @@
 
   auto request = pending_requests_.find(request_data.id.ToString());
   CHECK(request->second.first);
-  CHECK(request != pending_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(request != pending_requests_.end());
   // Check if `request` has `BrowserPermissionCallback`. The call back might be
   // missing if a permission prompt was preignored and we already notified an
   // origin about it.
diff --git a/components/persistent_cache/sqlite/vfs/sqlite_sandboxed_vfs.cc b/components/persistent_cache/sqlite/vfs/sqlite_sandboxed_vfs.cc
index 2a52ddf7..8e20a8a0 100644
--- a/components/persistent_cache/sqlite/vfs/sqlite_sandboxed_vfs.cc
+++ b/components/persistent_cache/sqlite/vfs/sqlite_sandboxed_vfs.cc
@@ -12,6 +12,8 @@
 #include "base/files/file_util.h"
 #include "base/synchronization/lock.h"
 #include "sql/sandboxed_vfs.h"
+#include "sql/sandboxed_vfs_file.h"
+#include "sql/sandboxed_vfs_file_impl.h"
 #include "third_party/sqlite/sqlite3.h"
 
 namespace persistent_cache {
@@ -45,6 +47,17 @@
   return g_instance;
 }
 
+sql::SandboxedVfsFile* SqliteSandboxedVfsDelegate::RetrieveSandboxedVfsFile(
+    base::File file,
+    base::FilePath file_path,
+    sql::SandboxedVfsFileType file_type,
+    sql::SandboxedVfs* vfs) {
+  // TODO(crbug.com/377475540): Specialize the sql::SandboxedVfsFile for the
+  // needs of persistent cache.
+  return new sql::SandboxedVfsFileImpl(std::move(file), std::move(file_path),
+                                       file_type, vfs);
+}
+
 base::File SqliteSandboxedVfsDelegate::OpenFile(
     const base::FilePath& file_path,
     int /*sqlite_requested_flags*/) {
diff --git a/components/persistent_cache/sqlite/vfs/sqlite_sandboxed_vfs.h b/components/persistent_cache/sqlite/vfs/sqlite_sandboxed_vfs.h
index da3ab18..de3578ed 100644
--- a/components/persistent_cache/sqlite/vfs/sqlite_sandboxed_vfs.h
+++ b/components/persistent_cache/sqlite/vfs/sqlite_sandboxed_vfs.h
@@ -18,6 +18,7 @@
 #include "components/persistent_cache/sqlite/vfs/sandboxed_file.h"
 #include "components/persistent_cache/sqlite/vfs/sqlite_database_vfs_file_set.h"
 #include "sql/sandboxed_vfs.h"
+#include "sql/sandboxed_vfs_file.h"
 
 namespace persistent_cache {
 
@@ -59,6 +60,12 @@
 
   static SqliteSandboxedVfsDelegate* GetInstance();
 
+  sql::SandboxedVfsFile* RetrieveSandboxedVfsFile(
+      base::File file,
+      base::FilePath file_path,
+      sql::SandboxedVfsFileType file_type,
+      sql::SandboxedVfs* vfs) override;
+
   // `sql::SandboxedVfs::Delegate` overrides.
   [[nodiscard]] base::File OpenFile(const base::FilePath& file_path,
                                     int sqlite_requested_flags) override;
diff --git a/components/policy/core/browser/url_blocklist_manager.cc b/components/policy/core/browser/url_blocklist_manager.cc
index 98d73d5..5ba2938c 100644
--- a/components/policy/core/browser/url_blocklist_manager.cc
+++ b/components/policy/core/browser/url_blocklist_manager.cc
@@ -16,7 +16,6 @@
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
 #include "base/location.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/task/thread_pool.h"
@@ -266,7 +265,7 @@
   const FilterComponents* highest_priority_filter = nullptr;
   for (const auto& pattern_id : url_matcher_->MatchURL(url)) {
     const auto it = filters_.find(pattern_id);
-    CHECK(it != filters_.end(), base::NotFatalUntil::M130);
+    CHECK(it != filters_.end());
     const FilterComponents& filter = it->second;
     if (!highest_priority_filter ||
         FilterTakesPrecedence(filter, *highest_priority_filter)) {
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/SelectParserRelaxationEnabled.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/SelectParserRelaxationEnabled.yaml
index fb66a56..8f4cd8db 100644
--- a/components/policy/resources/templates/policy_definitions/Miscellaneous/SelectParserRelaxationEnabled.yaml
+++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/SelectParserRelaxationEnabled.yaml
@@ -1,6 +1,6 @@
 caption: Controls whether the new HTML parser behavior for the &lt;select&gt; element is enabled
 desc: |2-
-  The HTML parser is being changed to allow additional HTML tags inside the &lt;select&gt; element. This policy allows the old HTML parser behavior to be used until M138.
+  The HTML parser is being changed to allow additional HTML tags inside the &lt;select&gt; element. This policy allows the old HTML parser behavior to be used until M136.
 
   If this policy is enabled or not set, then the HTML parser will allow additional tags inside the &lt;select&gt; element.
 
@@ -22,11 +22,11 @@
 schema:
   type: boolean
 supported_on:
-- chrome.*:131-138
-- chrome_os:131-138
-- android:131-138
-- webview_android:131-138
+- chrome.*:131-
+- chrome_os:131-
+- android:131-
+- webview_android:131-
 tags: []
 type: main
-deprecated: true
+deprecated: false
 device_only: false
diff --git a/components/policy/test_support/client_storage.cc b/components/policy/test_support/client_storage.cc
index 84348c6..9b884e5 100644
--- a/components/policy/test_support/client_storage.cc
+++ b/components/policy/test_support/client_storage.cc
@@ -8,7 +8,6 @@
 
 #include "base/check.h"
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "crypto/hash.h"
 
 namespace policy {
@@ -80,7 +79,7 @@
   const std::string& device_id = it->second;
   DCHECK(!device_id.empty());
   auto it_clients = clients_.find(device_id);
-  CHECK(it_clients != clients_.end(), base::NotFatalUntil::M130);
+  CHECK(it_clients != clients_.end());
 
   clients_.erase(it_clients, clients_.end());
   registered_tokens_.erase(it, registered_tokens_.end());
diff --git a/components/safe_browsing/core/browser/db/v4_database.cc b/components/safe_browsing/core/browser/db/v4_database.cc
index b2f59bef..82652a76 100644
--- a/components/safe_browsing/core/browser/db/v4_database.cc
+++ b/components/safe_browsing/core/browser/db/v4_database.cc
@@ -15,7 +15,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -308,7 +307,7 @@
       continue;
     }
     const auto& store_pair = store_map_->find(identifier);
-    CHECK(store_pair != store_map_->end(), base::NotFatalUntil::M130);
+    CHECK(store_pair != store_map_->end());
     stores.emplace_back(identifier, store_pair->second.get());
   }
 
diff --git a/components/safe_browsing/core/browser/db/v4_get_hash_protocol_manager.cc b/components/safe_browsing/core/browser/db/v4_get_hash_protocol_manager.cc
index ba8877b..4cf805d 100644
--- a/components/safe_browsing/core/browser/db/v4_get_hash_protocol_manager.cc
+++ b/components/safe_browsing/core/browser/db/v4_get_hash_protocol_manager.cc
@@ -13,7 +13,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_split.h"
 #include "base/timer/timer.h"
 #include "base/trace_event/trace_event.h"
@@ -792,8 +791,7 @@
     int response_code,
     const std::string& data) {
   auto it = pending_hash_requests_.find(url_loader);
-  CHECK(it != pending_hash_requests_.end(), base::NotFatalUntil::M130)
-      << "Request not found";
+  CHECK(it != pending_hash_requests_.end()) << "Request not found";
   RecordHttpResponseOrErrorCode("SafeBrowsing.V4GetHash.Network.Result",
                                 net_error, response_code);
 
diff --git a/components/safe_browsing/core/browser/db/v4_local_database_manager.cc b/components/safe_browsing/core/browser/db/v4_local_database_manager.cc
index 850717a0..ce0a135 100644
--- a/components/safe_browsing/core/browser/db/v4_local_database_manager.cc
+++ b/components/safe_browsing/core/browser/db/v4_local_database_manager.cc
@@ -23,7 +23,6 @@
 #include "base/memory/ref_counted.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_tokenizer.h"
 #include "base/task/sequenced_task_runner.h"
@@ -738,7 +737,7 @@
     SBThreatType threat_type = GetSBThreatTypeForList(fhi.list_id);
 
     const auto& it = std::ranges::find(full_hashes, fhi.full_hash);
-    CHECK(it != full_hashes.end(), base::NotFatalUntil::M130);
+    CHECK(it != full_hashes.end());
     (*full_hash_threat_types)[it - full_hashes.begin()] = threat_type;
 
     if (severity < most_severe_yet) {
@@ -765,7 +764,7 @@
 SBThreatType V4LocalDatabaseManager::GetSBThreatTypeForList(
     const ListIdentifier& list_id) {
   auto it = std::ranges::find(list_infos_, list_id, &ListInfo::list_id);
-  CHECK(list_infos_.end() != it, base::NotFatalUntil::M130);
+  CHECK(list_infos_.end() != it);
   DCHECK_NE(SBThreatType::SB_THREAT_TYPE_SAFE, it->sb_threat_type());
   DCHECK_NE(SBThreatType::SB_THREAT_TYPE_UNUSED, it->sb_threat_type());
   return it->sb_threat_type();
diff --git a/components/safe_browsing/core/browser/ping_manager.cc b/components/safe_browsing/core/browser/ping_manager.cc
index 181c9630..2e107953 100644
--- a/components/safe_browsing/core/browser/ping_manager.cc
+++ b/components/safe_browsing/core/browser/ping_manager.cc
@@ -18,7 +18,6 @@
 #include "base/functional/callback.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/rand_util.h"
 #include "base/strings/escape.h"
@@ -248,7 +247,7 @@
     network::SimpleURLLoader* source,
     std::unique_ptr<std::string> response_body) {
   auto it = safebrowsing_reports_.find(source);
-  CHECK(it != safebrowsing_reports_.end(), base::NotFatalUntil::M130);
+  CHECK(it != safebrowsing_reports_.end());
   safebrowsing_reports_.erase(it);
   if (!on_url_loader_complete_callback_.is_null()) {
     std::move(on_url_loader_complete_callback_).Run();
diff --git a/components/safe_browsing/core/browser/realtime/url_lookup_service_base.cc b/components/safe_browsing/core/browser/realtime/url_lookup_service_base.cc
index 86bdc70..ce07457 100644
--- a/components/safe_browsing/core/browser/realtime/url_lookup_service_base.cc
+++ b/components/safe_browsing/core/browser/realtime/url_lookup_service_base.cc
@@ -10,7 +10,6 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/rand_util.h"
 #include "base/strings/strcat.h"
 #include "base/task/sequenced_task_runner.h"
@@ -471,8 +470,7 @@
   CHECK(first_request_start_time_);
 
   auto it = pending_requests_.find(url);
-  CHECK(it != pending_requests_.end(), base::NotFatalUntil::M130)
-      << "Request not found";
+  CHECK(it != pending_requests_.end()) << "Request not found";
 
   RecordTimesWithAndWithoutSuffix("SafeBrowsing.RT.Network.Time",
                                   GetMetricSuffix(),
diff --git a/components/saved_tab_groups/public/saved_tab_group.cc b/components/saved_tab_groups/public/saved_tab_group.cc
index 762ebbd..ce0310b 100644
--- a/components/saved_tab_groups/public/saved_tab_group.cc
+++ b/components/saved_tab_groups/public/saved_tab_group.cc
@@ -11,7 +11,6 @@
 #include <vector>
 
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
 #include "base/uuid.h"
@@ -493,7 +492,7 @@
   base::UmaHistogramBoolean(
       "TabGroups.SavedTabGroups.TabRemovedFromGroupWasLastTab",
       saved_tabs_.empty());
-  CHECK(allow_empty_groups || !saved_tabs_.empty(), base::NotFatalUntil::M135);
+  CHECK(allow_empty_groups || !saved_tabs_.empty());
 }
 
 SavedTabGroup SavedTabGroup::CopyBaseFieldsWithTabs() const {
diff --git a/components/search_engines/template_url_fetcher.cc b/components/search_engines/template_url_fetcher.cc
index dcf12b4..52534ff0 100644
--- a/components/search_engines/template_url_fetcher.cc
+++ b/components/search_engines/template_url_fetcher.cc
@@ -9,7 +9,6 @@
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
@@ -281,6 +280,6 @@
 void TemplateURLFetcher::RequestCompleted(RequestDelegate* request) {
   auto i = std::ranges::find(requests_, request,
                              &std::unique_ptr<RequestDelegate>::get);
-  CHECK(i != requests_.end(), base::NotFatalUntil::M130);
+  CHECK(i != requests_.end());
   requests_.erase(i);
 }
diff --git a/components/search_engines/util.cc b/components/search_engines/util.cc
index e16a3aa..6280078 100644
--- a/components/search_engines/util.cc
+++ b/components/search_engines/util.cc
@@ -18,7 +18,6 @@
 #include "base/check_is_test.h"
 #include "base/check_op.h"
 #include "base/feature_list.h"
-#include "base/not_fatal_until.h"
 #include "base/time/time.h"
 #include "components/country_codes/country_codes.h"
 #include "components/prefs/pref_service.h"
@@ -462,7 +461,7 @@
   // Remove items.
   for (const TemplateURL* removed_engine : actions.removed_engines) {
     auto j = FindTemplateURL(template_urls, removed_engine);
-    CHECK(j != template_urls->end(), base::NotFatalUntil::M130);
+    CHECK(j != template_urls->end());
     DCHECK(!default_search_provider ||
            (*j)->prepopulate_id() !=
                default_search_provider->prepopulate_id() ||
diff --git a/components/segmentation_platform/internal/metadata/metadata_utils.cc b/components/segmentation_platform/internal/metadata/metadata_utils.cc
index beb04e9..041c7805 100644
--- a/components/segmentation_platform/internal/metadata/metadata_utils.cc
+++ b/components/segmentation_platform/internal/metadata/metadata_utils.cc
@@ -9,7 +9,6 @@
 #include <algorithm>
 
 #include "base/metrics/metrics_hashes.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -452,7 +451,7 @@
     if (iter == metadata.discrete_mappings().end())
       return input_score;
   }
-  CHECK(iter != metadata.discrete_mappings().end(), base::NotFatalUntil::M130);
+  CHECK(iter != metadata.discrete_mappings().end());
 
   const auto& mapping = iter->second;
 
diff --git a/components/services/storage/dom_storage/session_storage_namespace_impl.cc b/components/services/storage/dom_storage/session_storage_namespace_impl.cc
index 7c5ac182..4c22901 100644
--- a/components/services/storage/dom_storage/session_storage_namespace_impl.cc
+++ b/components/services/storage/dom_storage/session_storage_namespace_impl.cc
@@ -9,7 +9,6 @@
 #include <utility>
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 
 namespace storage {
 
@@ -235,7 +234,7 @@
     // from the map is to call DeleteNamespace, which would have called this
     // method on the parent if there were children, and resolved our clone
     // dependency.
-    CHECK(parent_it != namespaces_map.end(), base::NotFatalUntil::M130);
+    CHECK(parent_it != namespaces_map.end());
     parent = parent_it->second.get();
   }
 
@@ -261,7 +260,7 @@
       // The child must be in the map, as the only way to add it to
       // |child_namespaces_waiting_for_clone_call_| is to call
       // CloneNamespace, which always adds it to the map.
-      CHECK(child_it != namespaces_map.end(), base::NotFatalUntil::M130);
+      CHECK(child_it != namespaces_map.end());
       child_it->second->SetPendingPopulationFromParentNamespace(
           parent->namespace_id_);
     }
diff --git a/components/services/storage/sandboxed_vfs_delegate.cc b/components/services/storage/sandboxed_vfs_delegate.cc
index 04f9725..e6b6331 100644
--- a/components/services/storage/sandboxed_vfs_delegate.cc
+++ b/components/services/storage/sandboxed_vfs_delegate.cc
@@ -12,6 +12,7 @@
 #include "base/files/file_error_or.h"
 #include "base/files/file_path.h"
 #include "components/services/storage/public/cpp/filesystem/filesystem_proxy.h"
+#include "sql/sandboxed_vfs_file_impl.h"
 
 namespace storage {
 
@@ -21,6 +22,15 @@
 
 SandboxedVfsDelegate::~SandboxedVfsDelegate() = default;
 
+sql::SandboxedVfsFile* SandboxedVfsDelegate::RetrieveSandboxedVfsFile(
+    base::File file,
+    base::FilePath file_path,
+    sql::SandboxedVfsFileType file_type,
+    sql::SandboxedVfs* vfs) {
+  return new sql::SandboxedVfsFileImpl(std::move(file), std::move(file_path),
+                                       file_type, vfs);
+}
+
 base::File SandboxedVfsDelegate::OpenFile(const base::FilePath& file_path,
                                           int sqlite_requested_flags) {
   return filesystem_
diff --git a/components/services/storage/sandboxed_vfs_delegate.h b/components/services/storage/sandboxed_vfs_delegate.h
index 9f1c80d..7cc1cacf 100644
--- a/components/services/storage/sandboxed_vfs_delegate.h
+++ b/components/services/storage/sandboxed_vfs_delegate.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "sql/sandboxed_vfs.h"
+#include "sql/sandboxed_vfs_file.h"
 
 namespace storage {
 
@@ -19,6 +20,12 @@
   ~SandboxedVfsDelegate() override;
 
   // sql::SandboxedVfs::Delegate implementation:
+  sql::SandboxedVfsFile* RetrieveSandboxedVfsFile(
+      base::File file,
+      base::FilePath file_path,
+      sql::SandboxedVfsFileType file_type,
+      sql::SandboxedVfs* vfs) override;
+
   base::File OpenFile(const base::FilePath& file_path,
                       int sqlite_requested_flags) override;
   std::optional<sql::SandboxedVfs::PathAccessInfo> GetPathAccess(
diff --git a/components/services/storage/service_worker/service_worker_disk_cache.cc b/components/services/storage/service_worker/service_worker_disk_cache.cc
index 3eb22bb..5b07cb0 100644
--- a/components/services/storage/service_worker/service_worker_disk_cache.cc
+++ b/components/services/storage/service_worker/service_worker_disk_cache.cc
@@ -15,7 +15,6 @@
 #include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/ref_counted.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task/single_thread_task_runner.h"
 #include "net/base/cache_type.h"
@@ -310,7 +309,7 @@
 void ServiceWorkerDiskCache::DidGetEntryResult(uint64_t call_id,
                                                disk_cache::EntryResult result) {
   auto it = active_entry_calls_.find(call_id);
-  CHECK(it != active_entry_calls_.end(), base::NotFatalUntil::M130);
+  CHECK(it != active_entry_calls_.end());
   EntryCallback callback = std::move(it->second);
   active_entry_calls_.erase(it);
 
@@ -326,7 +325,7 @@
 
 void ServiceWorkerDiskCache::DidDoomEntry(uint64_t call_id, int net_error) {
   auto it = active_doom_calls_.find(call_id);
-  CHECK(it != active_doom_calls_.end(), base::NotFatalUntil::M130);
+  CHECK(it != active_doom_calls_.end());
   net::CompletionOnceCallback callback = std::move(it->second);
   active_doom_calls_.erase(it);
 
diff --git a/components/services/storage/service_worker/service_worker_storage_control_impl.cc b/components/services/storage/service_worker/service_worker_storage_control_impl.cc
index 17464f3..188cc88 100644
--- a/components/services/storage/service_worker/service_worker_storage_control_impl.cc
+++ b/components/services/storage/service_worker/service_worker_storage_control_impl.cc
@@ -6,7 +6,6 @@
 
 #include "base/containers/contains.h"
 #include "base/debug/alias.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "components/services/storage/service_worker/service_worker_resource_ops.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -109,7 +108,7 @@
 
 void ServiceWorkerStorageControlImpl::OnNoLiveVersion(int64_t version_id) {
   auto it = live_versions_.find(version_id);
-  CHECK(it != live_versions_.end(), base::NotFatalUntil::M130);
+  CHECK(it != live_versions_.end());
   if (it->second->purgeable_resources().size() > 0) {
     storage_->PurgeResources(it->second->purgeable_resources());
   }
diff --git a/components/signin/internal/identity_manager/fake_profile_oauth2_token_service_delegate.cc b/components/signin/internal/identity_manager/fake_profile_oauth2_token_service_delegate.cc
index b551df5..84c9edf 100644
--- a/components/signin/internal/identity_manager/fake_profile_oauth2_token_service_delegate.cc
+++ b/components/signin/internal/identity_manager/fake_profile_oauth2_token_service_delegate.cc
@@ -10,7 +10,6 @@
 #include <optional>
 #include <vector>
 
-#include "base/not_fatal_until.h"
 #include "base/strings/strcat.h"
 #include "build/build_config.h"
 #include "components/signin/internal/identity_manager/profile_oauth2_token_service.h"
@@ -32,7 +31,7 @@
     OAuth2AccessTokenConsumer* consumer,
     const std::string& token_binding_challenge) {
   auto it = refresh_tokens_.find(account_id);
-  CHECK(it != refresh_tokens_.end(), base::NotFatalUntil::M130);
+  CHECK(it != refresh_tokens_.end());
   return GaiaAccessTokenFetcher::
       CreateExchangeRefreshTokenForAccessTokenInstance(
           consumer, url_loader_factory, it->second);
@@ -219,7 +218,7 @@
     ProfileOAuth2TokenService* to_service,
     const CoreAccountId& account_id) {
   auto it = refresh_tokens_.find(account_id);
-  CHECK(it != refresh_tokens_.end(), base::NotFatalUntil::M130);
+  CHECK(it != refresh_tokens_.end());
   to_service->GetDelegate()->UpdateCredentials(account_id, it->second);
   RevokeCredentials(account_id);
 }
diff --git a/components/storage_monitor/portable_device_watcher_win.cc b/components/storage_monitor/portable_device_watcher_win.cc
index 27373c7..5a65fd80 100644
--- a/components/storage_monitor/portable_device_watcher_win.cc
+++ b/components/storage_monitor/portable_device_watcher_win.cc
@@ -19,7 +19,6 @@
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/thread_pool.h"
@@ -669,7 +668,7 @@
        ++storage_object_iter) {
     std::string storage_id = storage_object_iter->object_persistent_id;
     MTPStorageMap::iterator storage_map_iter = storage_map_.find(storage_id);
-    CHECK(storage_map_iter != storage_map_.end(), base::NotFatalUntil::M130);
+    CHECK(storage_map_iter != storage_map_.end());
     if (storage_notifications_) {
       storage_notifications_->ProcessDetach(
           storage_map_iter->second.device_id());
diff --git a/components/storage_monitor/storage_monitor_linux.cc b/components/storage_monitor/storage_monitor_linux.cc
index 21b4ecd..e1b400a9 100644
--- a/components/storage_monitor/storage_monitor_linux.cc
+++ b/components/storage_monitor/storage_monitor_linux.cc
@@ -25,7 +25,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
-#include "base/not_fatal_until.h"
 #include "base/process/kill.h"
 #include "base/process/launch.h"
 #include "base/process/process.h"
@@ -330,13 +329,12 @@
     // |mount_point|.
     if (new_iter == new_mtab.end() || (new_iter->second != mount_device)) {
       auto priority = mount_priority_map_.find(mount_device);
-      CHECK(priority != mount_priority_map_.end(), base::NotFatalUntil::M130);
+      CHECK(priority != mount_priority_map_.end());
       ReferencedMountPoint::const_iterator has_priority =
           priority->second.find(mount_point);
       if (StorageInfo::IsRemovableDevice(
               old_iter->second.storage_info.device_id())) {
-        CHECK(has_priority != priority->second.end(),
-              base::NotFatalUntil::M130);
+        CHECK(has_priority != priority->second.end());
         if (has_priority->second) {
           receiver()->ProcessDetach(old_iter->second.storage_info.device_id());
         }
@@ -428,7 +426,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   auto priority = mount_priority_map_.find(mount_device);
-  CHECK(priority != mount_priority_map_.end(), base::NotFatalUntil::M130);
+  CHECK(priority != mount_priority_map_.end());
   const base::FilePath& other_mount_point = priority->second.begin()->first;
   priority->second[mount_point] = false;
   mount_info_map_[mount_point] =
diff --git a/components/sync/engine/cycle/nudge_tracker.cc b/components/sync/engine/cycle/nudge_tracker.cc
index 83c8a80a..39bb4f7 100644
--- a/components/sync/engine/cycle/nudge_tracker.cc
+++ b/components/sync/engine/cycle/nudge_tracker.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 #include <utility>
 
-#include "base/not_fatal_until.h"
 #include "components/sync/protocol/data_type_progress_marker.pb.h"
 #include "components/sync/protocol/sync_enums.pb.h"
 
@@ -31,8 +30,7 @@
 bool NudgeTracker::IsSyncRequired(DataTypeSet types) const {
   for (DataType type : types) {
     TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
-    CHECK(tracker_it != type_trackers_.end(), base::NotFatalUntil::M130)
-        << DataTypeToDebugString(type);
+    CHECK(tracker_it != type_trackers_.end()) << DataTypeToDebugString(type);
     if (tracker_it->second->IsSyncRequired()) {
       return true;
     }
@@ -48,8 +46,7 @@
 
   for (DataType type : types) {
     TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
-    CHECK(tracker_it != type_trackers_.end(), base::NotFatalUntil::M130)
-        << DataTypeToDebugString(type);
+    CHECK(tracker_it != type_trackers_.end()) << DataTypeToDebugString(type);
     if (tracker_it->second->IsGetUpdatesRequired()) {
       return true;
     }
@@ -60,8 +57,7 @@
 void NudgeTracker::RecordSuccessfulCommitMessage(DataTypeSet types) {
   for (DataType type : types) {
     TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
-    CHECK(tracker_it != type_trackers_.end(), base::NotFatalUntil::M130)
-        << DataTypeToDebugString(type);
+    CHECK(tracker_it != type_trackers_.end()) << DataTypeToDebugString(type);
     tracker_it->second->RecordSuccessfulCommitMessage();
   }
 }
@@ -72,8 +68,7 @@
 
   for (DataType type : types) {
     TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
-    CHECK(tracker_it != type_trackers_.end(), base::NotFatalUntil::M130)
-        << DataTypeToDebugString(type);
+    CHECK(tracker_it != type_trackers_.end()) << DataTypeToDebugString(type);
     tracker_it->second->RecordSuccessfulSyncCycleIfNotBlocked();
   }
 }
@@ -81,8 +76,7 @@
 void NudgeTracker::RecordInitialSyncDone(DataTypeSet types) {
   for (DataType type : types) {
     TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
-    CHECK(tracker_it != type_trackers_.end(), base::NotFatalUntil::M130)
-        << DataTypeToDebugString(type);
+    CHECK(tracker_it != type_trackers_.end()) << DataTypeToDebugString(type);
     tracker_it->second->RecordInitialSyncDone();
   }
 }
@@ -97,8 +91,7 @@
 base::TimeDelta NudgeTracker::RecordLocalRefreshRequest(DataTypeSet types) {
   for (DataType type : types) {
     TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
-    CHECK(tracker_it != type_trackers_.end(), base::NotFatalUntil::M130)
-        << DataTypeToDebugString(type);
+    CHECK(tracker_it != type_trackers_.end()) << DataTypeToDebugString(type);
     tracker_it->second->RecordLocalRefreshRequest();
   }
   return kLocalRefreshDelay;
@@ -106,19 +99,19 @@
 
 base::TimeDelta NudgeTracker::GetRemoteInvalidationDelay(DataType type) const {
   TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
-  CHECK(tracker_it != type_trackers_.end(), base::NotFatalUntil::M130);
+  CHECK(tracker_it != type_trackers_.end());
   return tracker_it->second->GetRemoteInvalidationDelay();
 }
 
 void NudgeTracker::RecordInitialSyncRequired(DataType type) {
   TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
-  CHECK(tracker_it != type_trackers_.end(), base::NotFatalUntil::M130);
+  CHECK(tracker_it != type_trackers_.end());
   tracker_it->second->RecordInitialSyncRequired();
 }
 
 void NudgeTracker::RecordCommitConflict(DataType type) {
   TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
-  CHECK(tracker_it != type_trackers_.end(), base::NotFatalUntil::M130);
+  CHECK(tracker_it != type_trackers_.end());
   tracker_it->second->RecordCommitConflict();
 }
 
@@ -144,7 +137,7 @@
                                     base::TimeDelta length,
                                     base::TimeTicks now) {
   TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
-  CHECK(tracker_it != type_trackers_.end(), base::NotFatalUntil::M130);
+  CHECK(tracker_it != type_trackers_.end());
   tracker_it->second->BackOffType(length, now);
 }
 
@@ -157,7 +150,7 @@
 void NudgeTracker::SetHasPendingInvalidations(DataType type,
                                               bool has_invalidation) {
   TypeTrackerMap::const_iterator tracker_it = type_trackers_.find(type);
-  CHECK(tracker_it != type_trackers_.end(), base::NotFatalUntil::M130);
+  CHECK(tracker_it != type_trackers_.end());
   tracker_it->second->SetHasPendingInvalidations(has_invalidation);
 }
 
@@ -200,7 +193,7 @@
 
 base::TimeDelta NudgeTracker::GetTypeLastBackoffInterval(DataType type) const {
   auto tracker_it = type_trackers_.find(type);
-  CHECK(tracker_it != type_trackers_.end(), base::NotFatalUntil::M130);
+  CHECK(tracker_it != type_trackers_.end());
 
   return tracker_it->second->GetLastBackoffInterval();
 }
diff --git a/components/sync/engine/get_updates_processor.cc b/components/sync/engine/get_updates_processor.cc
index 1bf5d971..da73fa50 100644
--- a/components/sync/engine/get_updates_processor.cc
+++ b/components/sync/engine/get_updates_processor.cc
@@ -12,7 +12,6 @@
 #include <vector>
 
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/trace_event/trace_event.h"
 #include "components/sync/base/data_type.h"
 #include "components/sync/engine/cycle/status_controller.h"
@@ -204,7 +203,7 @@
 
   for (DataType type : gu_types) {
     auto handler_it = update_handler_map_->find(type);
-    CHECK(handler_it != update_handler_map_->end(), base::NotFatalUntil::M130)
+    CHECK(handler_it != update_handler_map_->end())
         << "Failed to look up handler for " << DataTypeToDebugString(type);
     sync_pb::DataTypeProgressMarker* progress_marker =
         get_updates->add_from_progress_marker();
diff --git a/components/sync/engine/loopback_server/loopback_server.cc b/components/sync/engine/loopback_server/loopback_server.cc
index 327a34d..15e39cb 100644
--- a/components/sync/engine/loopback_server/loopback_server.cc
+++ b/components/sync/engine/loopback_server/loopback_server.cc
@@ -15,7 +15,6 @@
 #include "base/format_macros.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/clamped_math.h"
 #include "base/rand_util.h"
 #include "base/sequence_checker.h"
@@ -546,7 +545,7 @@
     // NIGORI is the only permanent item type that should be updated by the
     // client.
     EntityMap::const_iterator iter = entities_.find(client_entity.id_string());
-    CHECK(iter != entities_.end(), base::NotFatalUntil::M130);
+    CHECK(iter != entities_.end());
     entity = PersistentPermanentEntity::CreateUpdatedNigoriEntity(
         client_entity, *iter->second);
   } else if (type == syncer::BOOKMARKS) {
@@ -602,7 +601,7 @@
     const std::string& entity_id,
     sync_pb::CommitResponse_EntryResponse* entry_response) {
   EntityMap::const_iterator iter = entities_.find(entity_id);
-  CHECK(iter != entities_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != entities_.end());
   const LoopbackServerEntity& entity = *iter->second;
   entry_response->set_response_type(response_type_override_
                                         ? response_type_override_.Run(entity)
@@ -684,7 +683,7 @@
     }
 
     EntityMap::const_iterator iter = entities_.find(entity_id);
-    CHECK(iter != entities_.end(), base::NotFatalUntil::M130);
+    CHECK(iter != entities_.end());
     committed_data_types.Put(iter->second->GetDataType());
 
     if (observer_for_tests_) {
diff --git a/components/sync/service/data_type_manager_impl.cc b/components/sync/service/data_type_manager_impl.cc
index 745b26a..27bc5bd 100644
--- a/components/sync/service/data_type_manager_impl.cc
+++ b/components/sync/service/data_type_manager_impl.cc
@@ -453,8 +453,7 @@
         controllers_.at(type);
 
     // An active type's controller must be RUNNING.
-    CHECK_EQ(controller->state(), DataTypeController::RUNNING,
-             base::NotFatalUntil::M134)
+    CHECK_EQ(controller->state(), DataTypeController::RUNNING)
         << " actual=" << DataTypeController::StateToString(controller->state())
         << " for " << DataTypeToDebugString(type);
 
diff --git a/components/sync/service/model_load_manager.cc b/components/sync/service/model_load_manager.cc
index f526b13..10c8f91 100644
--- a/components/sync/service/model_load_manager.cc
+++ b/components/sync/service/model_load_manager.cc
@@ -13,7 +13,6 @@
 #include "base/functional/callback_helpers.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/timer/elapsed_timer.h"
 #include "components/sync/base/data_type.h"
 #include "components/sync/base/features.h"
@@ -169,7 +168,7 @@
 
   for (DataType type : types) {
     auto dtc_iter = controllers_->find(type);
-    CHECK(dtc_iter != controllers_->end(), base::NotFatalUntil::M130);
+    CHECK(dtc_iter != controllers_->end());
     DataTypeController* dtc = dtc_iter->second.get();
     if (dtc->state() == DataTypeController::NOT_RUNNING) {
       LoadModelsForType(dtc);
diff --git a/components/sync_device_info/fake_device_info_tracker.cc b/components/sync_device_info/fake_device_info_tracker.cc
index d716123..ca12c91 100644
--- a/components/sync_device_info/fake_device_info_tracker.cc
+++ b/components/sync_device_info/fake_device_info_tracker.cc
@@ -9,7 +9,6 @@
 
 #include "base/check.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "components/sync/protocol/sync_enums.pb.h"
 #include "components/sync_device_info/device_info.h"
@@ -107,8 +106,7 @@
 void FakeDeviceInfoTracker::Replace(const DeviceInfo* old_device,
                                     const DeviceInfo* new_device) {
   auto it = std::ranges::find(devices_, old_device);
-  CHECK(devices_.end() != it, base::NotFatalUntil::M130)
-      << "Tracker doesn't contain device";
+  CHECK(devices_.end() != it) << "Tracker doesn't contain device";
   *it = new_device;
   for (auto& observer : observers_) {
     observer.OnDeviceInfoChange();
diff --git a/components/sync_sessions/tab_node_pool.cc b/components/sync_sessions/tab_node_pool.cc
index f5e21395..f159b3a 100644
--- a/components/sync_sessions/tab_node_pool.cc
+++ b/components/sync_sessions/tab_node_pool.cc
@@ -9,7 +9,6 @@
 #include <utility>
 
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "components/sync/base/data_type.h"
 #include "components/sync/protocol/session_specifics.pb.h"
 #include "components/sync_sessions/synced_tab_delegate.h"
@@ -40,7 +39,7 @@
   // This is a new node association, the sync node should be free.
   // Remove node from free node pool and then associate it with the tab.
   auto it = free_nodes_pool_.find(tab_node_id);
-  CHECK(it != free_nodes_pool_.end(), base::NotFatalUntil::M130);
+  CHECK(it != free_nodes_pool_.end());
   free_nodes_pool_.erase(it);
 
   DCHECK(nodeid_tabid_map_.find(tab_node_id) == nodeid_tabid_map_.end());
diff --git a/components/ui_devtools/devtools_server.cc b/components/ui_devtools/devtools_server.cc
index 67c381c..1ff9f03d 100644
--- a/components/ui_devtools/devtools_server.cc
+++ b/components/ui_devtools/devtools_server.cc
@@ -15,7 +15,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
-#include "base/not_fatal_until.h"
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -350,7 +349,7 @@
 void UiDevToolsServer::OnWebSocketMessage(int connection_id, std::string data) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_);
   auto it = connections_.find(connection_id);
-  CHECK(it != connections_.end(), base::NotFatalUntil::M130);
+  CHECK(it != connections_.end());
   UiDevToolsClient* client = it->second;
   client->Dispatch(data);
 }
diff --git a/components/ui_devtools/ui_element.cc b/components/ui_devtools/ui_element.cc
index 97847bfbb..5ab22cf 100644
--- a/components/ui_devtools/ui_element.cc
+++ b/components/ui_devtools/ui_element.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 
 #include "base/check_op.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "components/ui_devtools/protocol.h"
 #include "components/ui_devtools/ui_element_delegate.h"
@@ -62,7 +61,7 @@
 void UIElement::AddChild(UIElement* child, UIElement* before) {
   if (before) {
     auto iter = std::ranges::find(children_, before);
-    CHECK(iter != children_.end(), base::NotFatalUntil::M130);
+    CHECK(iter != children_.end());
     children_.insert(iter, child);
   } else {
     children_.push_back(child);
@@ -92,13 +91,13 @@
   if (notify_delegate)
     delegate_->OnUIElementRemoved(child);
   auto iter = std::ranges::find(children_, child);
-  CHECK(iter != children_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != children_.end());
   children_.erase(iter);
 }
 
 void UIElement::ReorderChild(UIElement* child, int index) {
   auto i = std::ranges::find(children_, child);
-  CHECK(i != children_.end(), base::NotFatalUntil::M130);
+  CHECK(i != children_.end());
   DCHECK_GE(index, 0);
   DCHECK_LT(static_cast<size_t>(index), children_.size());
 
diff --git a/components/ui_devtools/views/window_element.cc b/components/ui_devtools/views/window_element.cc
index 7ddbc9c0..28b0ce3 100644
--- a/components/ui_devtools/views/window_element.cc
+++ b/components/ui_devtools/views/window_element.cc
@@ -6,7 +6,6 @@
 
 #include <algorithm>
 
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/to_string.h"
 #include "components/ui_devtools/protocol.h"
@@ -27,7 +26,7 @@
 int GetIndexOfChildInParent(aura::Window* window) {
   const aura::Window::Windows& siblings = window->parent()->children();
   auto it = std::ranges::find(siblings, window);
-  CHECK(it != siblings.end(), base::NotFatalUntil::M130);
+  CHECK(it != siblings.end());
   return std::distance(siblings.begin(), it);
 }
 
diff --git a/components/ukm/ukm_service.cc b/components/ukm/ukm_service.cc
index dd399486..a0caee64 100644
--- a/components/ukm/ukm_service.cc
+++ b/components/ukm/ukm_service.cc
@@ -331,7 +331,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DVLOG(DebuggingLogLevel::Medium) << "UkmService::OnAppEnterForeground";
 
-  reporting_service_.SetIsInForegound(true);
+  reporting_service_.OnAppEnterForeground();
 
   // If initialize_started_ is false, UKM has not yet been started, so bail. The
   // scheduler will instead be started via EnableReporting().
@@ -346,7 +346,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DVLOG(DebuggingLogLevel::Medium) << "UkmService::OnAppEnterBackground";
 
-  reporting_service_.SetIsInForegound(false);
+  reporting_service_.OnAppEnterBackground();
 
   if (!initialize_started_) {
     return;
diff --git a/components/url_pattern_index/url_pattern_index.cc b/components/url_pattern_index/url_pattern_index.cc
index 7422c43c..4ee48d5 100644
--- a/components/url_pattern_index/url_pattern_index.cc
+++ b/components/url_pattern_index/url_pattern_index.cc
@@ -16,7 +16,6 @@
 #include "base/functional/callback.h"
 #include "base/memory/raw_ref.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_util.h"
@@ -84,13 +83,13 @@
 
 flat::ActivationType ProtoToFlatActivationType(proto::ActivationType type) {
   const auto it = GetActivationTypeMap().find(type);
-  CHECK(it != GetActivationTypeMap().end(), base::NotFatalUntil::M130);
+  CHECK(it != GetActivationTypeMap().end());
   return it->second;
 }
 
 flat::ElementType ProtoToFlatElementType(proto::ElementType type) {
   const auto it = GetElementTypeMap().find(type);
-  CHECK(it != GetElementTypeMap().end(), base::NotFatalUntil::M130);
+  CHECK(it != GetElementTypeMap().end());
   return it->second;
 }
 
diff --git a/components/value_store/test_value_store_factory.cc b/components/value_store/test_value_store_factory.cc
index 109e28d..2ee77992 100644
--- a/components/value_store/test_value_store_factory.cc
+++ b/components/value_store/test_value_store_factory.cc
@@ -6,7 +6,6 @@
 
 #include "base/containers/contains.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "components/value_store/leveldb_value_store.h"
 #include "components/value_store/testing_value_store.h"
 
@@ -51,7 +50,7 @@
 ValueStore* TestValueStoreFactory::GetExisting(
     const base::FilePath& directory) const {
   auto it = value_store_map_.find(directory);
-  CHECK(it != value_store_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != value_store_map_.end());
   return it->second;
 }
 
diff --git a/components/viz/client/client_resource_provider.cc b/components/viz/client/client_resource_provider.cc
index 39a2909..7969370a 100644
--- a/components/viz/client/client_resource_provider.cc
+++ b/components/viz/client/client_resource_provider.cc
@@ -11,7 +11,6 @@
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/task/bind_post_task.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
@@ -267,7 +266,7 @@
   imports.reserve(export_ids.size());
   for (const ResourceId id : export_ids) {
     auto it = imported_resources_.find(id);
-    CHECK(it != imported_resources_.end(), base::NotFatalUntil::M130);
+    CHECK(it != imported_resources_.end());
     imports.push_back(&it->second);
   }
 
@@ -451,7 +450,7 @@
 void ClientResourceProvider::RemoveImportedResource(ResourceId id) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   auto it = imported_resources_.find(id);
-  CHECK(it != imported_resources_.end(), base::NotFatalUntil::M130);
+  CHECK(it != imported_resources_.end());
   ImportedResource& imported = it->second;
   imported.marked_for_deletion = true;
   // We clear the callback here, as we will hold onto `imported` until it has
@@ -532,7 +531,7 @@
 
 bool ClientResourceProvider::InUseByConsumer(ResourceId id) {
   auto it = imported_resources_.find(id);
-  CHECK(it != imported_resources_.end(), base::NotFatalUntil::M130);
+  CHECK(it != imported_resources_.end());
   ImportedResource& imported = it->second;
   return imported.exported_count > 0 || imported.returned_lost;
 }
diff --git a/components/viz/host/client_frame_sink_video_capturer.cc b/components/viz/host/client_frame_sink_video_capturer.cc
index 11fe619..64df2e7 100644
--- a/components/viz/host/client_frame_sink_video_capturer.cc
+++ b/components/viz/host/client_frame_sink_video_capturer.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "media/capture/mojom/video_capture_buffer.mojom.h"
 #include "media/capture/mojom/video_capture_types.mojom.h"
@@ -261,7 +260,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   const auto it = std::ranges::find(overlays_, overlay);
-  CHECK(it != overlays_.end(), base::NotFatalUntil::M130);
+  CHECK(it != overlays_.end());
   overlays_.erase(it);
 }
 
diff --git a/components/viz/host/host_frame_sink_manager.cc b/components/viz/host/host_frame_sink_manager.cc
index 06b9f85..6edcf11 100644
--- a/components/viz/host/host_frame_sink_manager.cc
+++ b/components/viz/host/host_frame_sink_manager.cc
@@ -12,7 +12,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
@@ -495,7 +494,7 @@
 uint32_t HostFrameSinkManager::CacheBackBufferForRootSink(
     const FrameSinkId& root_sink_id) {
   auto it = frame_sink_data_map_.find(root_sink_id);
-  CHECK(it != frame_sink_data_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != frame_sink_data_map_.end());
   DCHECK(it->second.is_root);
   DCHECK(it->second.IsFrameSinkRegistered());
   DCHECK(frame_sink_manager_remote_);
diff --git a/components/viz/service/display/display_resource_provider.cc b/components/viz/service/display/display_resource_provider.cc
index 022f4af7..c958737 100644
--- a/components/viz/service/display/display_resource_provider.cc
+++ b/components/viz/service/display/display_resource_provider.cc
@@ -8,7 +8,6 @@
 #include <string>
 
 #include "base/atomic_sequence_num.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_math.h"
 #include "base/strings/stringprintf.h"
@@ -228,7 +227,7 @@
 
 void DisplayResourceProvider::DestroyChild(int child_id) {
   auto it = children_.find(child_id);
-  CHECK(it != children_.end(), base::NotFatalUntil::M130);
+  CHECK(it != children_.end());
   DestroyChildInternal(it, NORMAL);
 }
 
@@ -301,7 +300,7 @@
 DisplayResourceProvider::GetChildToParentMap(int child) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = children_.find(child);
-  CHECK(it != children_.end(), base::NotFatalUntil::M130);
+  CHECK(it != children_.end());
   DCHECK(!it->second.marked_for_deletion);
   return it->second.child_to_parent_map;
 }
@@ -316,7 +315,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(id);
   auto it = resources_.find(id);
-  CHECK(it != resources_.end(), base::NotFatalUntil::M130);
+  CHECK(it != resources_.end());
   return &it->second;
 }
 
diff --git a/components/viz/service/display/display_resource_provider_null.cc b/components/viz/service/display/display_resource_provider_null.cc
index a7f7a77..b864b07 100644
--- a/components/viz/service/display/display_resource_provider_null.cc
+++ b/components/viz/service/display/display_resource_provider_null.cc
@@ -7,7 +7,6 @@
 #include <utility>
 #include <vector>
 
-#include "base/not_fatal_until.h"
 
 namespace viz {
 
@@ -28,7 +27,7 @@
 
   for (ResourceId local_id : unused) {
     auto it = resources_.find(local_id);
-    CHECK(it != resources_.end(), base::NotFatalUntil::M130);
+    CHECK(it != resources_.end());
     ChildResource& resource = it->second;
 
     ResourceId child_id = resource.transferable.id;
diff --git a/components/viz/service/display/display_resource_provider_skia.cc b/components/viz/service/display/display_resource_provider_skia.cc
index 6f1b1d47..c3b5cef 100644
--- a/components/viz/service/display/display_resource_provider_skia.cc
+++ b/components/viz/service/display/display_resource_provider_skia.cc
@@ -10,7 +10,6 @@
 
 #include "base/containers/contains.h"
 #include "base/containers/flat_set.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "components/viz/service/display/resource_fence.h"
 #include "gpu/command_buffer/service/scheduler_sequence.h"
@@ -142,7 +141,7 @@
     bool maybe_concurrent_reads,
     bool raw_draw_is_possible) {
   auto it = resource_provider_->resources_.find(id);
-  CHECK(it != resource_provider_->resources_.end(), base::NotFatalUntil::M130);
+  CHECK(it != resource_provider_->resources_.end());
 
   ChildResource& resource = it->second;
   DCHECK(resource.is_gpu_resource_type());
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc
index d8a9188..038e79c 100644
--- a/components/viz/service/display/skia_renderer.cc
+++ b/components/viz/service/display/skia_renderer.cc
@@ -22,7 +22,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/angle_conversions.h"
 #include "base/task/bind_post_task.h"
 #include "base/task/single_thread_task_runner.h"
@@ -2101,8 +2100,7 @@
                                return render_pass->id == nested_render_pass_id;
                              });
 
-    CHECK(it != current_frame()->render_passes_in_draw_order->end(),
-          base::NotFatalUntil::M130);
+    CHECK(it != current_frame()->render_passes_in_draw_order->end());
     const auto& nested_render_pass = *it;
     if (!nested_render_pass->filters.IsEmpty() ||
         !nested_render_pass->backdrop_filters.IsEmpty()) {
@@ -4017,7 +4015,7 @@
   } else {
     // A real render pass that was turned into an image
     auto it = render_pass_backings_.find(quad->render_pass_id);
-    CHECK(render_pass_backings_.end() != it, base::NotFatalUntil::M130);
+    CHECK(render_pass_backings_.end() != it);
     // This function is called after AllocateRenderPassResourceIfNeeded, so
     // there should be backing ready.
     src_quad_backing = &it->second;
@@ -4202,7 +4200,7 @@
 gfx::Size SkiaRenderer::GetRenderPassBackingPixelSize(
     const AggregatedRenderPassId& render_pass_id) {
   auto it = render_pass_backings_.find(render_pass_id);
-  CHECK(it != render_pass_backings_.end(), base::NotFatalUntil::M130);
+  CHECK(it != render_pass_backings_.end());
   return it->second.size;
 }
 
diff --git a/components/viz/service/display/software_renderer.cc b/components/viz/service/display/software_renderer.cc
index 4e0d3e7..8740f6a 100644
--- a/components/viz/service/display/software_renderer.cc
+++ b/components/viz/service/display/software_renderer.cc
@@ -9,7 +9,6 @@
 #include <vector>
 
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/process/memory.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
@@ -242,7 +241,7 @@
     current_framebuffer_canvas_.reset();
   } else {
     auto it = render_pass_bitmaps_.find(render_pass->id);
-    CHECK(it != render_pass_bitmaps_.end(), base::NotFatalUntil::M130);
+    CHECK(it != render_pass_bitmaps_.end());
     SkBitmap& bitmap = it->second.bitmap;
 
     current_framebuffer_canvas_ = std::make_unique<SkCanvas>(
diff --git a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
index d7e471af..a122f6b 100644
--- a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
+++ b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
@@ -14,7 +14,6 @@
 #include "base/compiler_specific.h"
 #include "base/debug/alias.h"
 #include "base/feature_list.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "build/build_config.h"
 #include "components/viz/common/features.h"
@@ -352,7 +351,7 @@
   // have been replaced.
   for (const auto& mailbox : overlay_mailboxes) {
     auto it = overlays_.find(mailbox);
-    CHECK(it != overlays_.end(), base::NotFatalUntil::M130);
+    CHECK(it != overlays_.end());
     it->Unref();
   }
 
diff --git a/components/viz/service/surfaces/surface_allocation_group.cc b/components/viz/service/surfaces/surface_allocation_group.cc
index 34756332..b12980ee 100644
--- a/components/viz/service/surfaces/surface_allocation_group.cc
+++ b/components/viz/service/surfaces/surface_allocation_group.cc
@@ -9,7 +9,6 @@
 #include <utility>
 
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "components/viz/service/surfaces/surface.h"
 #include "components/viz/service/surfaces/surface_manager.h"
 
@@ -45,7 +44,7 @@
 
 void SurfaceAllocationGroup::UnregisterSurface(Surface* surface) {
   auto it = std::ranges::find(surfaces_, surface);
-  CHECK(it != surfaces_.end(), base::NotFatalUntil::M130);
+  CHECK(it != surfaces_.end());
   surfaces_.erase(it);
   MaybeMarkForDestruction();
 }
diff --git a/components/viz/service/surfaces/surface_manager.cc b/components/viz/service/surfaces/surface_manager.cc
index 3e86ae60..172f05a1 100644
--- a/components/viz/service/surfaces/surface_manager.cc
+++ b/components/viz/service/surfaces/surface_manager.cc
@@ -16,7 +16,6 @@
 #include "base/containers/queue.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/time/default_tick_clock.h"
@@ -586,7 +585,7 @@
 void SurfaceManager::DestroySurfaceInternal(const SurfaceId& surface_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = surface_map_.find(surface_id);
-  CHECK(it != surface_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != surface_map_.end());
   // Make sure that the surface is removed from the map before being actually
   // destroyed. An ack could be sent during the destruction of a surface which
   // could trigger a synchronous frame submission to a half-destroyed surface
diff --git a/components/viz/test/fake_skia_output_surface.cc b/components/viz/test/fake_skia_output_surface.cc
index 8d60c9e..16ea22d5 100644
--- a/components/viz/test/fake_skia_output_surface.cc
+++ b/components/viz/test/fake_skia_output_surface.cc
@@ -10,7 +10,6 @@
 
 #include "base/functional/bind.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/task/bind_post_task.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
@@ -211,7 +210,7 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   auto it = sk_surfaces_.find(id);
-  CHECK(it != sk_surfaces_.end(), base::NotFatalUntil::M130);
+  CHECK(it != sk_surfaces_.end());
   return it->second->makeImageSnapshot();
 }
 
@@ -222,7 +221,7 @@
 
   for (const auto& id : ids) {
     auto it = sk_surfaces_.find(id);
-    CHECK(it != sk_surfaces_.end(), base::NotFatalUntil::M130);
+    CHECK(it != sk_surfaces_.end());
     sk_surfaces_.erase(it);
   }
 
diff --git a/components/web_package/web_bundle_parser.cc b/components/web_package/web_bundle_parser.cc
index 706831ee..eeea7db1 100644
--- a/components/web_package/web_bundle_parser.cc
+++ b/components/web_package/web_bundle_parser.cc
@@ -15,7 +15,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/checked_math.h"
 #include "base/strings/string_number_conversions.h"
@@ -585,8 +584,7 @@
     base::flat_map<GURL, mojom::BundleResponseLocationPtr> requests;
 
     auto responses_section = section_offsets_.find(kResponsesSection);
-    CHECK(responses_section != section_offsets_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(responses_section != section_offsets_.end());
     const uint64_t responses_section_offset = responses_section->second.first;
     const uint64_t responses_section_length = responses_section->second.second;
 
diff --git a/components/webui/flags/flags_state.cc b/components/webui/flags/flags_state.cc
index 9680fa1..26b5f04 100644
--- a/components/webui/flags/flags_state.cc
+++ b/components/webui/flags/flags_state.cc
@@ -22,7 +22,6 @@
 #include "base/logging.h"
 #include "base/metrics/field_trial.h"
 #include "base/metrics/field_trial_params.h"
-#include "base/not_fatal_until.h"
 #include "base/stl_util.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_tokenizer.h"
@@ -377,7 +376,7 @@
 
   for (const std::string& entry_name : enabled_entries) {
     const auto& entry_it = name_to_switch_map.find(entry_name);
-    CHECK(entry_it != name_to_switch_map.end(), base::NotFatalUntil::M130);
+    CHECK(entry_it != name_to_switch_map.end());
 
     const SwitchEntry& entry = entry_it->second;
     if (!entry.switch_name.empty()) {
diff --git a/components/wifi/wifi_service_win.cc b/components/wifi/wifi_service_win.cc
index fa973b0..e23ca60 100644
--- a/components/wifi/wifi_service_win.cc
+++ b/components/wifi/wifi_service_win.cc
@@ -31,7 +31,6 @@
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
-#include "base/not_fatal_until.h"
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -1386,8 +1385,7 @@
               onc::connection_state::kConnected) {
             NetworkList::iterator previous_network_properties =
                 FindNetwork(*network_list, network_properties.guid);
-            CHECK(previous_network_properties != network_list->end(),
-                  base::NotFatalUntil::M130);
+            CHECK(previous_network_properties != network_list->end());
             previous_network_properties->connection_state =
                 network_properties.connection_state;
           }
diff --git a/content/browser/android/content_view_statics.cc b/content/browser/android/content_view_statics.cc
index c980590..c06e0ac 100644
--- a/content/browser/android/content_view_statics.cc
+++ b/content/browser/android/content_view_statics.cc
@@ -11,7 +11,6 @@
 #include "base/android/scoped_java_ref.h"
 #include "base/check.h"
 #include "base/lazy_instance.h"
-#include "base/not_fatal_until.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_process_host_observer.h"
@@ -80,7 +79,7 @@
  private:
   void StopWatching(content::RenderProcessHost* host) {
     auto pos = suspended_processes_.find(host->GetDeprecatedID());
-    CHECK(pos != suspended_processes_.end(), base::NotFatalUntil::M130);
+    CHECK(pos != suspended_processes_.end());
     host->RemoveObserver(this);
     suspended_processes_.erase(pos);
   }
diff --git a/content/browser/background_fetch/background_fetch_job_controller.cc b/content/browser/background_fetch/background_fetch_job_controller.cc
index dbed81e0..c7c18e9b 100644
--- a/content/browser/background_fetch/background_fetch_job_controller.cc
+++ b/content/browser/background_fetch/background_fetch_job_controller.cc
@@ -8,7 +8,6 @@
 
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
-#include "base/not_fatal_until.h"
 #include "content/browser/background_fetch/background_fetch_cross_origin_filter.h"
 #include "content/browser/background_fetch/background_fetch_data_manager.h"
 #include "content/browser/background_fetch/background_fetch_request_match_params.h"
@@ -368,8 +367,7 @@
   --pending_downloads_;
   ++completed_downloads_;
   auto it = active_request_finished_callbacks_.find(request->download_guid());
-  CHECK(it != active_request_finished_callbacks_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(it != active_request_finished_callbacks_.end());
   std::move(it->second).Run(registration_id(), std::move(request));
   active_request_finished_callbacks_.erase(it);
 }
diff --git a/content/browser/background_fetch/background_fetch_scheduler.cc b/content/browser/background_fetch/background_fetch_scheduler.cc
index 2049d37..b793e28 100644
--- a/content/browser/background_fetch/background_fetch_scheduler.cc
+++ b/content/browser/background_fetch/background_fetch_scheduler.cc
@@ -7,7 +7,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/metrics/field_trial_params.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "content/browser/background_fetch/background_fetch_data_manager.h"
 #include "content/browser/background_fetch/background_fetch_delegate_proxy.h"
@@ -245,7 +244,7 @@
     return;
 
   auto it = completed_fetches_.find(registration_id.unique_id());
-  CHECK(it != completed_fetches_.end(), base::NotFatalUntil::M130);
+  CHECK(it != completed_fetches_.end());
 
   blink::mojom::BackgroundFetchRegistrationDataPtr& registration_data =
       it->second->registration;
diff --git a/content/browser/background_sync/background_sync_context_impl.cc b/content/browser/background_sync/background_sync_context_impl.cc
index a718478..c842263e 100644
--- a/content/browser/background_sync/background_sync_context_impl.cc
+++ b/content/browser/background_sync/background_sync_context_impl.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/task/task_traits.h"
 #include "build/build_config.h"
@@ -99,7 +98,7 @@
   DCHECK(service);
 
   auto iter = one_shot_sync_services_.find(service);
-  CHECK(iter != one_shot_sync_services_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != one_shot_sync_services_.end());
   one_shot_sync_services_.erase(iter);
 }
 
@@ -109,7 +108,7 @@
   DCHECK(service);
 
   auto iter = periodic_sync_services_.find(service);
-  CHECK(iter != periodic_sync_services_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != periodic_sync_services_.end());
   periodic_sync_services_.erase(iter);
 }
 
diff --git a/content/browser/browser_child_process_host_impl.cc b/content/browser/browser_child_process_host_impl.cc
index 7b8dcad..d963f46b 100644
--- a/content/browser/browser_child_process_host_impl.cc
+++ b/content/browser/browser_child_process_host_impl.cc
@@ -20,7 +20,6 @@
 #include "base/metrics/histogram_shared_memory.h"
 #include "base/metrics/persistent_histogram_allocator.h"
 #include "base/metrics/persistent_memory_allocator.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -95,7 +94,7 @@
 void NotifyProcessLaunchedAndConnected(const ChildProcessData& data) {
   // Assert that the process is valid, as guaranteed in a comment on the
   // declaration of `BrowserChildProcessLaunchedAndConnected()`.
-  CHECK(data.GetProcess().IsValid(), base::NotFatalUntil::M130);
+  CHECK(data.GetProcess().IsValid());
 
   for (auto& observer : g_browser_child_process_observers.Get())
     observer.BrowserChildProcessLaunchedAndConnected(data);
diff --git a/content/browser/browser_url_handler_impl.cc b/content/browser/browser_url_handler_impl.cc
index 461f44cb..765c759 100644
--- a/content/browser/browser_url_handler_impl.cc
+++ b/content/browser/browser_url_handler_impl.cc
@@ -8,7 +8,6 @@
 
 #include <algorithm>
 
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "content/browser/renderer_host/debug_urls.h"
 #include "content/browser/webui/web_ui_impl.h"
@@ -174,7 +173,7 @@
 void BrowserURLHandlerImpl::RemoveHandlerForTesting(URLHandler handler) {
   const auto it =
       std::ranges::find(url_handlers_, handler, &HandlerPair::first);
-  CHECK(url_handlers_.end() != it, base::NotFatalUntil::M130);
+  CHECK(url_handlers_.end() != it);
   url_handlers_.erase(it);
 }
 
diff --git a/content/browser/cache_storage/cache_storage.cc b/content/browser/cache_storage/cache_storage.cc
index 7263aff1..42f2244 100644
--- a/content/browser/cache_storage/cache_storage.cc
+++ b/content/browser/cache_storage/cache_storage.cc
@@ -26,7 +26,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -1022,7 +1021,7 @@
   // The CacheStorage is not actively being referenced.  Close the cache
   // immediately.
   auto cache_map_it = cache_map_.find(cache->cache_name());
-  CHECK(cache_map_it != cache_map_.end(), base::NotFatalUntil::M130);
+  CHECK(cache_map_it != cache_map_.end());
 
   cache_map_it->second.reset();
 }
@@ -1229,7 +1228,7 @@
   cache_index_->FinalizeDoomedCache();
 
   auto map_iter = cache_map_.find(impl->cache_name());
-  CHECK(map_iter != cache_map_.end(), base::NotFatalUntil::M130);
+  CHECK(map_iter != cache_map_.end());
 
   doomed_caches_.insert(
       std::make_pair(map_iter->second.get(), std::move(map_iter->second)));
@@ -1259,7 +1258,7 @@
 
   cache_loader_->CleanUpDeletedCache(doomed_cache);
   auto doomed_caches_iter = doomed_caches_.find(doomed_cache);
-  CHECK(doomed_caches_iter != doomed_caches_.end(), base::NotFatalUntil::M130);
+  CHECK(doomed_caches_iter != doomed_caches_.end());
   doomed_caches_.erase(doomed_caches_iter);
 }
 
diff --git a/content/browser/cache_storage/cache_storage_index.cc b/content/browser/cache_storage/cache_storage_index.cc
index a4e7acd..619d3b80 100644
--- a/content/browser/cache_storage/cache_storage_index.cc
+++ b/content/browser/cache_storage/cache_storage_index.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 
 namespace content {
 
@@ -43,7 +42,7 @@
 void CacheStorageIndex::Delete(const std::u16string& cache_name) {
   DCHECK(!has_doomed_cache_);
   auto it = cache_metadata_map_.find(cache_name);
-  CHECK(it != cache_metadata_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != cache_metadata_map_.end());
   ordered_cache_metadata_.erase(it->second);
   cache_metadata_map_.erase(it);
   storage_size_ = CacheStorage::kSizeUnknown;
@@ -152,7 +151,7 @@
 void CacheStorageIndex::DoomCache(const std::u16string& cache_name) {
   DCHECK(!has_doomed_cache_);
   auto map_it = cache_metadata_map_.find(cache_name);
-  CHECK(map_it != cache_metadata_map_.end(), base::NotFatalUntil::M130);
+  CHECK(map_it != cache_metadata_map_.end());
   doomed_cache_metadata_ = std::move(*(map_it->second));
   after_doomed_cache_metadata_ = ordered_cache_metadata_.erase(map_it->second);
   cache_metadata_map_.erase(map_it);
diff --git a/content/browser/cache_storage/cache_storage_manager.cc b/content/browser/cache_storage/cache_storage_manager.cc
index a202560..735f1b9f 100644
--- a/content/browser/cache_storage/cache_storage_manager.cc
+++ b/content/browser/cache_storage/cache_storage_manager.cc
@@ -25,7 +25,6 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/sequence_checker.h"
 #include "base/strings/string_number_conversions.h"
@@ -470,7 +469,7 @@
   DCHECK(cache_storage);
   cache_storage->AssertUnreferenced();
   auto it = cache_storage_map_.find({bucket_locator, owner});
-  CHECK(it != cache_storage_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != cache_storage_map_.end());
   DCHECK(it->second.get() == cache_storage);
 
   // Currently we don't do anything when a CacheStorage instance becomes
@@ -702,7 +701,7 @@
   CacheStorageHandle handle = OpenCacheStorage(bucket_locator, owner);
 
   auto it = cache_storage_map_.find({bucket_locator, owner});
-  CHECK(it != cache_storage_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != cache_storage_map_.end());
 
   CacheStorage* cache_storage = it->second.release();
   cache_storage->ResetManager();
diff --git a/content/browser/cache_storage/cache_storage_scheduler.cc b/content/browser/cache_storage/cache_storage_scheduler.cc
index 289ec03e..d80739b3 100644
--- a/content/browser/cache_storage/cache_storage_scheduler.cc
+++ b/content/browser/cache_storage/cache_storage_scheduler.cc
@@ -13,7 +13,6 @@
 #include "base/location.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "build/build_config.h"
 #include "content/browser/cache_storage/cache_storage_histogram_utils.h"
@@ -98,7 +97,7 @@
     CacheStorageSchedulerId id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = running_operations_.find(id);
-  CHECK(it != running_operations_.end(), base::NotFatalUntil::M130);
+  CHECK(it != running_operations_.end());
   DCHECK_EQ(it->second->id(), id);
 
   if (it->second->mode() == CacheStorageSchedulerMode::kShared) {
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc
index 53a73d6..4316d8b 100644
--- a/content/browser/child_process_security_policy_impl.cc
+++ b/content/browser/child_process_security_policy_impl.cc
@@ -20,7 +20,6 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
@@ -2428,7 +2427,7 @@
 
   base::AutoLock lock(lock_);
   auto state = security_state_.find(child_id);
-  CHECK(state != security_state_.end(), base::NotFatalUntil::M130);
+  CHECK(state != security_state_.end());
   state->second->SetProcessLock(process_lock, context, is_process_used);
 }
 
diff --git a/content/browser/code_cache/generated_code_cache.cc b/content/browser/code_cache/generated_code_cache.cc
index d6ddb79..1673dd4 100644
--- a/content/browser/code_cache/generated_code_cache.cc
+++ b/content/browser/code_cache/generated_code_cache.cc
@@ -14,7 +14,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/byte_conversions.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
@@ -973,7 +972,7 @@
 std::unique_ptr<GeneratedCodeCache::PendingOperation>
 GeneratedCodeCache::DequeueOperation(PendingOperation* op) {
   auto it = active_entries_map_.find(op->key());
-  CHECK(it != active_entries_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != active_entries_map_.end());
   DCHECK(!it->second.empty());
   std::unique_ptr<PendingOperation> result = std::move(it->second.front());
   // |op| should be at the front.
diff --git a/content/browser/code_cache/simple_lru_cache.cc b/content/browser/code_cache/simple_lru_cache.cc
index 454fb51d..3dcf989 100644
--- a/content/browser/code_cache/simple_lru_cache.cc
+++ b/content/browser/code_cache/simple_lru_cache.cc
@@ -7,7 +7,6 @@
 #include <limits>
 
 #include "base/feature_list.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/clamped_math.h"
 #include "content/common/features.h"
 #include "net/base/url_util.h"
@@ -130,7 +129,7 @@
 void SimpleLruCache::Evict() {
   while (capacity_ < size_) {
     auto it = access_list_.begin();
-    CHECK(it != access_list_.end(), base::NotFatalUntil::M130);
+    CHECK(it != access_list_.end());
     DCHECK(entries_.find(it->second) != entries_.end());
 
     Delete(it->second);
diff --git a/content/browser/cookie_store/cookie_store_manager.cc b/content/browser/cookie_store/cookie_store_manager.cc
index 54927a18..3b514fc 100644
--- a/content/browser/cookie_store/cookie_store_manager.cc
+++ b/content/browser/cookie_store/cookie_store_manager.cc
@@ -9,7 +9,6 @@
 
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
-#include "base/not_fatal_until.h"
 #include "base/sequence_checker.h"
 #include "content/browser/cookie_store/cookie_change_subscriptions.pb.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
@@ -526,7 +525,7 @@
     subscription->RemoveFromList();
   }
   auto it = subscriptions_by_url_key_.find(url_key);
-  CHECK(it != subscriptions_by_url_key_.end(), base::NotFatalUntil::M130);
+  CHECK(it != subscriptions_by_url_key_.end());
   if (it->second.empty())
     subscriptions_by_url_key_.erase(it);
 }
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc
index 27af9375..4f83be6 100644
--- a/content/browser/download/save_package.cc
+++ b/content/browser/download/save_package.cc
@@ -17,7 +17,6 @@
 #include "base/i18n/file_util_icu.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/rand_util.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
@@ -640,7 +639,7 @@
 void SavePackage::PutInProgressItemToSavedMap(SaveItem* save_item) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   auto it = in_progress_items_.find(save_item->id());
-  CHECK(it != in_progress_items_.end(), base::NotFatalUntil::M130);
+  CHECK(it != in_progress_items_.end());
   DCHECK_EQ(save_item, it->second.get());
   std::unique_ptr<SaveItem> owned_item = std::move(it->second);
   in_progress_items_.erase(it);
diff --git a/content/browser/fenced_frame/fenced_frame_reporter.cc b/content/browser/fenced_frame/fenced_frame_reporter.cc
index b887b79..59beacd 100644
--- a/content/browser/fenced_frame/fenced_frame_reporter.cc
+++ b/content/browser/fenced_frame/fenced_frame_reporter.cc
@@ -25,7 +25,6 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/strcat.h"
 #include "base/types/pass_key.h"
@@ -353,7 +352,7 @@
     ReportingUrlMap reporting_url_map,
     std::optional<ReportingMacros> reporting_ad_macros) {
   auto it = reporting_metadata_.find(reporting_destination);
-  CHECK(it != reporting_metadata_.end(), base::NotFatalUntil::M130);
+  CHECK(it != reporting_metadata_.end());
   DCHECK(!it->second.reporting_url_map);
   DCHECK(!it->second.reporting_ad_macros);
 
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.cc b/content/browser/fenced_frame/fenced_frame_url_mapping.cc
index 4d9f0507..c104593 100644
--- a/content/browser/fenced_frame/fenced_frame_url_mapping.cc
+++ b/content/browser/fenced_frame/fenced_frame_url_mapping.cc
@@ -15,7 +15,6 @@
 #include "base/functional/callback.h"
 #include "base/memory/ref_counted.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "content/browser/fenced_frame/fenced_frame_reporter.h"
@@ -416,8 +415,7 @@
     const GURL& urn_uuid,
     const SharedStorageURNMappingResult& mapping_result) {
   auto pending_it = pending_urn_uuid_to_url_map_.find(urn_uuid);
-  CHECK(pending_it != pending_urn_uuid_to_url_map_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(pending_it != pending_urn_uuid_to_url_map_.end());
 
   DCHECK(!IsMapped(urn_uuid));
 
@@ -462,7 +460,7 @@
 FencedFrameURLMapping::GetSharedStorageBudgetMetadataForTesting(
     const GURL& urn_uuid) {
   auto it = urn_uuid_to_url_map_.find(urn_uuid);
-  CHECK(it != urn_uuid_to_url_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != urn_uuid_to_url_map_.end());
 
   if (!it->second.shared_storage_budget_metadata_) {
     return nullptr;
diff --git a/content/browser/indexed_db/indexed_db_context_impl.cc b/content/browser/indexed_db/indexed_db_context_impl.cc
index 3bd9936..44524240 100644
--- a/content/browser/indexed_db/indexed_db_context_impl.cc
+++ b/content/browser/indexed_db/indexed_db_context_impl.cc
@@ -29,7 +29,6 @@
 #include "base/functional/callback_helpers.h"
 #include "base/location.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/clamped_math.h"
 #include "base/strings/string_number_conversions.h"
@@ -343,7 +342,7 @@
   if (bucket) {
     EnsureBucketContext(*bucket, GetDataPath(bucket->ToBucketLocator()));
     auto iter = bucket_contexts_.find(bucket->id);
-    CHECK(iter != bucket_contexts_.end(), base::NotFatalUntil::M130);
+    CHECK(iter != bucket_contexts_.end());
     iter->second.AsyncCall(&BucketContext::AddReceiver)
         .WithArgs(client_info, std::move(client_state_checker_remote),
                   std::move(pending_receiver));
diff --git a/content/browser/indexed_db/instance/leveldb/tombstone_sweeper.cc b/content/browser/indexed_db/instance/leveldb/tombstone_sweeper.cc
index e177540b..e7091800 100644
--- a/content/browser/indexed_db/instance/leveldb/tombstone_sweeper.cc
+++ b/content/browser/indexed_db/instance/leveldb/tombstone_sweeper.cc
@@ -8,7 +8,6 @@
 #include <string_view>
 
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "components/services/storage/indexed_db/scopes/varint_coding.h"
@@ -41,7 +40,7 @@
   DCHECK_LT(start_position, container_->size());
   inner_ = container_->begin();
   std::advance(inner_, start_position);
-  CHECK(inner_ != container_->end(), base::NotFatalUntil::M130);
+  CHECK(inner_ != container_->end());
 }
 
 template <typename T>
diff --git a/content/browser/indexed_db/list_set.h b/content/browser/indexed_db/list_set.h
index 6133ee0..049fa578 100644
--- a/content/browser/indexed_db/list_set.h
+++ b/content/browser/indexed_db/list_set.h
@@ -14,7 +14,6 @@
 #include <set>
 
 #include "base/check_op.h"
-#include "base/not_fatal_until.h"
 
 //
 // A container class that provides fast containment test (like a set)
@@ -53,7 +52,7 @@
       return;
     set_.erase(elem);
     typename std::list<T>::iterator it = std::ranges::find(list_, elem);
-    CHECK(it != list_.end(), base::NotFatalUntil::M130);
+    CHECK(it != list_.end());
     list_.erase(it);
   }
 
diff --git a/content/browser/interest_group/ad_auction_service_impl.cc b/content/browser/interest_group/ad_auction_service_impl.cc
index 876037a..7a506af 100644
--- a/content/browser/interest_group/ad_auction_service_impl.cc
+++ b/content/browser/interest_group/ad_auction_service_impl.cc
@@ -22,7 +22,6 @@
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -962,7 +961,7 @@
   // auction, which `reporter` can reuse once started. Fine to delete after
   // starting the reporter.
   auto auction_it = auctions_.find(auction);
-  CHECK(auction_it != auctions_.end(), base::NotFatalUntil::M130);
+  CHECK(auction_it != auctions_.end());
   std::unique_ptr<AuctionRunner> owned_auction = std::move(auction_it->second);
   auctions_.erase(auction_it);
 
diff --git a/content/browser/interest_group/auction_process_manager.cc b/content/browser/interest_group/auction_process_manager.cc
index f817f76..ea936b0 100644
--- a/content/browser/interest_group/auction_process_manager.cc
+++ b/content/browser/interest_group/auction_process_manager.cc
@@ -18,7 +18,6 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/strcat.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
@@ -601,7 +600,7 @@
   PendingRequestMap* pending_request_map =
       GetPendingRequestMap(process_handle->worklet_type_);
   auto it = pending_request_map->find(process_handle->origin_);
-  CHECK(it != pending_request_map->end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_request_map->end());
   DCHECK_EQ(1u, it->second.count(process_handle));
   it->second.erase(process_handle);
   // If there are no more pending requests for the same origin, remove the
@@ -614,7 +613,7 @@
     WorkletProcess* worklet_process) {
   ProcessMap* processes = Processes(worklet_process->worklet_type());
   auto it = processes->find(worklet_process->origin());
-  CHECK(it != processes->end(), base::NotFatalUntil::M130);
+  CHECK(it != processes->end());
   processes->erase(it);
 
   // May need to launch another process at this point.
diff --git a/content/browser/interest_group/auction_worklet_manager.cc b/content/browser/interest_group/auction_worklet_manager.cc
index e8d0275..34a52a2 100644
--- a/content/browser/interest_group/auction_worklet_manager.cc
+++ b/content/browser/interest_group/auction_worklet_manager.cc
@@ -27,7 +27,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/trace_event/trace_event.h"
@@ -375,8 +374,7 @@
 void AuctionWorkletManager::WorkletOwner::UnregisterHandle(HandleKey handle) {
   auto it = registered_devtools_auction_ids_.find(
       handle.second->devtools_auction_id_);
-  CHECK(it != registered_devtools_auction_ids_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(it != registered_devtools_auction_ids_.end());
   --it->second;
   if (it->second == 0) {
     registered_devtools_auction_ids_.erase(it);
diff --git a/content/browser/interest_group/subresource_url_authorizations.cc b/content/browser/interest_group/subresource_url_authorizations.cc
index 7801103..6bfb5e2 100644
--- a/content/browser/interest_group/subresource_url_authorizations.cc
+++ b/content/browser/interest_group/subresource_url_authorizations.cc
@@ -9,7 +9,6 @@
 #include <vector>
 
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 #include "content/browser/interest_group/auction_worklet_manager.h"
 #include "content/browser/interest_group/subresource_url_builder.h"
 #include "third_party/blink/public/common/interest_group/auction_config.h"
@@ -62,13 +61,11 @@
 void SubresourceUrlAuthorizations::OnWorkletHandleDestruction(
     const AuctionWorkletManager::WorkletHandle* worklet_handle) {
   auto per_handle_it = subresource_urls_per_handle_.find(worklet_handle);
-  CHECK(per_handle_it != subresource_urls_per_handle_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(per_handle_it != subresource_urls_per_handle_.end());
   for (const GURL& subresource_url : per_handle_it->second) {
     auto authorized_urls_it =
         authorized_subresource_urls_.find(subresource_url);
-    CHECK(authorized_urls_it != authorized_subresource_urls_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(authorized_urls_it != authorized_subresource_urls_.end());
     if (--authorized_urls_it->second.count <= 0)
       authorized_subresource_urls_.erase(authorized_urls_it);
   }
diff --git a/content/browser/media/media_internals_audio_focus_helper.cc b/content/browser/media/media_internals_audio_focus_helper.cc
index 03cfb3e8..7aa0c17 100644
--- a/content/browser/media/media_internals_audio_focus_helper.cc
+++ b/content/browser/media/media_internals_audio_focus_helper.cc
@@ -10,7 +10,6 @@
 
 #include "base/containers/adapters.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/strcat.h"
 #include "base/values.h"
 #include "content/browser/media/media_internals.h"
@@ -202,7 +201,7 @@
       continue;
 
     auto state = request_state_.find(id);
-    CHECK(state != request_state_.end(), base::NotFatalUntil::M130);
+    CHECK(state != request_state_.end());
 
     session.Set("name", BuildNameString(state->second, info->name));
     session.Set("owner", info->owner);
diff --git a/content/browser/media/session/media_players_callback_aggregator_unittest.cc b/content/browser/media/session/media_players_callback_aggregator_unittest.cc
index e0a34f8..b33945e 100644
--- a/content/browser/media/session/media_players_callback_aggregator_unittest.cc
+++ b/content/browser/media/session/media_players_callback_aggregator_unittest.cc
@@ -4,7 +4,6 @@
 
 #include "content/browser/media/session/media_players_callback_aggregator.h"
 
-#include "base/not_fatal_until.h"
 #include "base/run_loop.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/test/task_environment.h"
@@ -59,7 +58,7 @@
   void OnRequestVisibility(int player_id,
                            base::OnceCallback<void(bool)> get_visibility_cb) {
     auto it = fake_players_.find(player_id);
-    CHECK(it != fake_players_.end(), base::NotFatalUntil::M130);
+    CHECK(it != fake_players_.end());
 
     bool desired_visibility = it->second;
     std::move(get_visibility_cb).Run(desired_visibility);
diff --git a/content/browser/mojo_binder_policy_map_impl.cc b/content/browser/mojo_binder_policy_map_impl.cc
index 54e1bfd..f0a2e4d 100644
--- a/content/browser/mojo_binder_policy_map_impl.cc
+++ b/content/browser/mojo_binder_policy_map_impl.cc
@@ -8,7 +8,6 @@
 
 #include "base/feature_list.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "content/common/dom_automation_controller.mojom.h"
 #include "content/common/frame.mojom.h"
 #include "content/public/browser/content_browser_client.h"
@@ -286,7 +285,7 @@
 MojoBinderPolicyMapImpl::GetNonAssociatedMojoBinderPolicyOrDieForTesting(
     const std::string& interface_name) const {
   const auto& found = non_associated_policy_map_.find(interface_name);
-  CHECK(found != non_associated_policy_map_.end(), base::NotFatalUntil::M130);
+  CHECK(found != non_associated_policy_map_.end());
   return found->second;
 }
 
@@ -294,7 +293,7 @@
 MojoBinderPolicyMapImpl::GetAssociatedMojoBinderPolicyOrDieForTesting(
     const std::string& interface_name) const {
   const auto& found = associated_policy_map_.find(interface_name);
-  CHECK(found != associated_policy_map_.end(), base::NotFatalUntil::M130);
+  CHECK(found != associated_policy_map_.end());
   return found->second;
 }
 
diff --git a/content/browser/posix_file_descriptor_info_impl.cc b/content/browser/posix_file_descriptor_info_impl.cc
index 7da9c26..64d039fa 100644
--- a/content/browser/posix_file_descriptor_info_impl.cc
+++ b/content/browser/posix_file_descriptor_info_impl.cc
@@ -73,7 +73,7 @@
 base::ScopedFD PosixFileDescriptorInfoImpl::ReleaseFD(base::PlatformFile file) {
   auto found =
       std::ranges::find(owned_descriptors_, file, &base::ScopedFD::get);
-  CHECK(found != owned_descriptors_.end(), base::NotFatalUntil::M131);
+  CHECK(found != owned_descriptors_.end());
 
   base::ScopedFD fd;
   std::swap(*found, fd);
diff --git a/content/browser/preloading/prefetch/prefetch_container.cc b/content/browser/preloading/prefetch/prefetch_container.cc
index c2f5c82..590bd74 100644
--- a/content/browser/preloading/prefetch/prefetch_container.cc
+++ b/content/browser/preloading/prefetch/prefetch_container.cc
@@ -2013,6 +2013,7 @@
 void PrefetchContainer::OnUnregisterCandidate(
     const GURL& navigated_url,
     bool is_served,
+    bool is_nav_prerender,
     std::optional<base::TimeDelta> blocked_duration) {
   // Note that this method can be called with `is_in_dtor_` true.
   //
@@ -2026,10 +2027,11 @@
                              redirect_chain_.size());
   }
 
-  RecordPrefetchMatchingBlockedNavigationHistogram(
-      blocked_duration.has_value());
+  RecordPrefetchMatchingBlockedNavigationHistogram(blocked_duration.has_value(),
+                                                   is_nav_prerender);
 
-  RecordBlockUntilHeadDurationHistogram(blocked_duration, is_served);
+  RecordBlockUntilHeadDurationHistogram(blocked_duration, is_served,
+                                        is_nav_prerender);
 
   // Note that `PreloadingAttemptImpl::SetIsAccurateTriggering()` is called for
   // prefetch in
@@ -2268,23 +2270,40 @@
 }
 
 void PrefetchContainer::RecordPrefetchMatchingBlockedNavigationHistogram(
-    bool blocked_until_head) {
+    bool blocked_until_head,
+    bool is_nav_prerender) {
   base::UmaHistogramBoolean(
       base::StrCat(
           {"Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate.",
            GetMetricsSuffixTriggerTypeAndEagerness(
                prefetch_type_, embedder_histogram_suffix_)}),
       blocked_until_head);
+  base::UmaHistogramBoolean(
+      base::StrCat(
+          {"Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate.",
+           is_nav_prerender ? "Prerender." : "NonPrerender.",
+           GetMetricsSuffixTriggerTypeAndEagerness(
+               prefetch_type_, embedder_histogram_suffix_)}),
+      blocked_until_head);
 }
 
 void PrefetchContainer::RecordBlockUntilHeadDurationHistogram(
     const std::optional<base::TimeDelta>& blocked_duration,
-    bool served) {
+    bool served,
+    bool is_nav_prerender) {
   base::UmaHistogramTimes(
       base::StrCat({"Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.",
                     served ? "Served." : "NotServed.",
                     GetMetricsSuffixTriggerTypeAndEagerness(
                         prefetch_type_, embedder_histogram_suffix_)}),
       blocked_duration.value_or(base::Seconds(0)));
+  base::UmaHistogramTimes(
+      base::StrCat({"Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.",
+                    is_nav_prerender ? "Prerender." : "NonPrerender.",
+                    served ? "Served." : "NotServed.",
+                    GetMetricsSuffixTriggerTypeAndEagerness(
+                        prefetch_type_, embedder_histogram_suffix_)}),
+      blocked_duration.value_or(base::Seconds(0)));
 }
+
 }  // namespace content
diff --git a/content/browser/preloading/prefetch/prefetch_container.h b/content/browser/preloading/prefetch/prefetch_container.h
index c25a7c5..8e59fc3 100644
--- a/content/browser/preloading/prefetch/prefetch_container.h
+++ b/content/browser/preloading/prefetch/prefetch_container.h
@@ -742,6 +742,7 @@
   // `PrefetchMatchResolver`s.
   void OnUnregisterCandidate(const GURL& navigated_url,
                              bool is_served,
+                             bool is_nav_prerender,
                              std::optional<base::TimeDelta> blocked_duration);
 
   // TODO(crbug.com/372186548): Revisit the semantics of
@@ -875,12 +876,13 @@
   // Records `Prefetch.PrefetchContainer.DurationAdded*` UMAs.
   void RecordDurationFromAdded();
   // Records `Prefetch.PrefetchMatchingBlockedNavigationWithPrefetch.*` UMAs.
-  void RecordPrefetchMatchingBlockedNavigationHistogram(
-      bool blocked_until_head);
+  void RecordPrefetchMatchingBlockedNavigationHistogram(bool blocked_until_head,
+                                                        bool is_nav_prerender);
   // Records `Prefetch.BlockUntilHeadDuration.*` UMAs.
   void RecordBlockUntilHeadDurationHistogram(
       const std::optional<base::TimeDelta>& blocked_duration,
-      bool served);
+      bool served,
+      bool is_nav_prerender);
 
   // The ID of the RenderFrameHost/Document that triggered the prefetch.
   // This will be empty when browser-initiated prefetch.
diff --git a/content/browser/preloading/prefetch/prefetch_container_unittest.cc b/content/browser/preloading/prefetch/prefetch_container_unittest.cc
index 0d5f46d..f3aa7bf 100644
--- a/content/browser/preloading/prefetch/prefetch_container_unittest.cc
+++ b/content/browser/preloading/prefetch/prefetch_container_unittest.cc
@@ -704,6 +704,7 @@
   // considered for serving.
   prefetch_container->OnUnregisterCandidate(GURL("https://test.com"),
                                             /*is_served=*/true,
+                                            /*is_nav_prerender=*/false,
                                             /*blocked_duration=*/std::nullopt);
 
   // Simulate a successful DNS probe for this prefetch. Not this will also
@@ -931,25 +932,44 @@
   struct TestCase {
     PrefetchType prefetch_type;
     bool is_served;
-    std::optional<base::TimeDelta> prefetch_match_resolver_wait_duration;
+    bool is_nav_prerender;
+    std::optional<base::TimeDelta> blocked_duration;
   };
 
   std::vector<TestCase> test_cases{
-      {PrefetchType(PreloadingTriggerType::kSpeculationRule,
-                    /*use_prefetch_proxy=*/true,
-                    blink::mojom::SpeculationEagerness::kEager),
-       true, std::nullopt},
-      {PrefetchType(PreloadingTriggerType::kSpeculationRule,
-                    /*use_prefetch_proxy=*/true,
-                    blink::mojom::SpeculationEagerness::kModerate),
-       true, base::Milliseconds(10)},
-      {PrefetchType(PreloadingTriggerType::kSpeculationRule,
-                    /*use_prefetch_proxy=*/true,
-                    blink::mojom::SpeculationEagerness::kConservative),
-       false, std::nullopt},
-      {PrefetchType(PreloadingTriggerType::kEmbedder,
-                    /*use_prefetch_proxy=*/true),
-       false, base::Milliseconds(20)}};
+      {
+          .prefetch_type =
+              PrefetchType(PreloadingTriggerType::kSpeculationRule,
+                           /*use_prefetch_proxy=*/true,
+                           blink::mojom::SpeculationEagerness::kEager),
+          .is_served = true,
+          .is_nav_prerender = false,
+          .blocked_duration = std::nullopt,
+      },
+      {
+          .prefetch_type =
+              PrefetchType(PreloadingTriggerType::kSpeculationRule,
+                           /*use_prefetch_proxy=*/true,
+                           blink::mojom::SpeculationEagerness::kModerate),
+          .is_served = true,
+          .is_nav_prerender = false,
+          .blocked_duration = base::Milliseconds(10),
+      },
+      {
+          .prefetch_type =
+              PrefetchType(PreloadingTriggerType::kSpeculationRule,
+                           /*use_prefetch_proxy=*/true,
+                           blink::mojom::SpeculationEagerness::kConservative),
+          .is_served = false,
+          .is_nav_prerender = false,
+          .blocked_duration = std::nullopt,
+      },
+      {.prefetch_type = PrefetchType(PreloadingTriggerType::kEmbedder,
+                                     /*use_prefetch_proxy=*/true),
+       .is_served = false,
+       .is_nav_prerender = false,
+       .blocked_duration = base::Milliseconds(20)},
+  };
 
   const GURL prefetch_url = GURL("https://test.com/?nvsparam=1");
   const GURL navigated_url = GURL("https://test.com/");
@@ -967,83 +987,131 @@
     }();
 
     prefetch_container->OnUnregisterCandidate(
-        navigated_url, test_case.is_served,
-        test_case.prefetch_match_resolver_wait_duration);
+        navigated_url, test_case.is_served, test_case.is_nav_prerender,
+        test_case.blocked_duration);
   }
 
-  histogram_tester.ExpectBucketCount(
+  histogram_tester.ExpectUniqueSample(
       "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
-      "SpeculationRule_"
-      "Eager",
-      true, 0);
-  histogram_tester.ExpectBucketCount(
-      "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
-      "SpeculationRule_"
-      "Eager",
+      "SpeculationRule_Eager",
       false, 1);
+  histogram_tester.ExpectUniqueSample(
+      "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
+      "NonPrerender.SpeculationRule_Eager",
+      false, 1);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
+      "Prerender.SpeculationRule_Eager",
+      0);
   histogram_tester.ExpectUniqueTimeSample(
       "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Served."
-      "SpeculationRule_"
-      "Eager",
+      "SpeculationRule_Eager",
       base::Milliseconds(0), 1);
   histogram_tester.ExpectTotalCount(
       "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NotServed."
-      "SpeculationRule_"
-      "Eager",
+      "SpeculationRule_Eager",
+      0);
+  histogram_tester.ExpectUniqueTimeSample(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NonPrerender."
+      "Served.SpeculationRule_Eager",
+      base::Milliseconds(0), 1);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NonPrerender."
+      "NotServed.SpeculationRule_Eager",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Prerender.Served."
+      "SpeculationRule_Eager",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Prerender."
+      "NotServed.SpeculationRule_Eager",
       0);
 
-  histogram_tester.ExpectBucketCount(
+  histogram_tester.ExpectUniqueSample(
       "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
-      "SpeculationRule_"
-      "Moderate",
+      "SpeculationRule_Moderate",
       true, 1);
-  histogram_tester.ExpectBucketCount(
+  histogram_tester.ExpectUniqueSample(
       "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
-      "SpeculationRule_"
-      "Moderate",
-      false, 0);
+      "NonPrerender.SpeculationRule_Eager",
+      false, 1);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
+      "Prerender.SpeculationRule_Moderate",
+      0);
   histogram_tester.ExpectUniqueTimeSample(
       "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Served."
-      "SpeculationRule_"
-      "Moderate",
+      "SpeculationRule_Moderate",
       base::Milliseconds(10), 1);
   histogram_tester.ExpectTotalCount(
       "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NotServed."
-      "SpeculationRule_"
-      "Moderate",
+      "SpeculationRule_Moderate",
+      0);
+  histogram_tester.ExpectUniqueTimeSample(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NonPrerender."
+      "Served.SpeculationRule_Moderate",
+      base::Milliseconds(10), 1);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NonPrerender."
+      "NotServed.SpeculationRule_Moderate",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Prerender.Served."
+      "SpeculationRule_Moderate",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Prerender."
+      "NotServed.SpeculationRule_Moderate",
       0);
 
-  histogram_tester.ExpectBucketCount(
+  histogram_tester.ExpectUniqueSample(
       "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
-      "SpeculationRule_"
-      "Conservative",
-      true, 0);
-  histogram_tester.ExpectBucketCount(
+      "SpeculationRule_Conservative",
+      false, 1);
+  histogram_tester.ExpectUniqueSample(
       "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
-      "SpeculationRule_"
-      "Conservative",
+      "NonPrerender.SpeculationRule_Conservative",
       false, 1);
   histogram_tester.ExpectTotalCount(
+      "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
+      "Prerender.SpeculationRule_Conservative",
+      0);
+  histogram_tester.ExpectTotalCount(
       "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Served."
-      "SpeculationRule_"
-      "Conservative",
+      "SpeculationRule_Conservative",
       0);
   histogram_tester.ExpectUniqueTimeSample(
       "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NotServed."
-      "SpeculationRule_"
-      "Conservative",
+      "SpeculationRule_Conservative",
       base::Milliseconds(0), 1);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NonPrerender."
+      "Served.SpeculationRule_Conservative",
+      0);
+  histogram_tester.ExpectUniqueTimeSample(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NonPrerender."
+      "NotServed.SpeculationRule_Conservative",
+      base::Milliseconds(0), 1);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Prerender.Served."
+      "SpeculationRule_Conservative",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Prerender."
+      "NotServed.SpeculationRule_Conservative",
+      0);
 
-  histogram_tester.ExpectBucketCount(
+  histogram_tester.ExpectUniqueSample(
       base::StrCat({"Prefetch.PrefetchMatchingBlockedNavigation."
                     "PerMatchingCandidate.Embedder_",
                     test::kPreloadingEmbedderHistgramSuffixForTesting}),
       true, 1);
-  histogram_tester.ExpectBucketCount(
+  histogram_tester.ExpectTotalCount(
       base::StrCat({"Prefetch.PrefetchMatchingBlockedNavigation."
-                    "PerMatchingCandidate.Embedder_",
+                    "PerMatchingCandidate.Prerender.Embedder_",
                     test::kPreloadingEmbedderHistgramSuffixForTesting}),
-      false, 0);
+      0);
   histogram_tester.ExpectTotalCount(
       base::StrCat({"Prefetch.BlockUntilHeadDuration.PerMatchingCandidate."
                     "Served.Embedder_",
@@ -1054,6 +1122,98 @@
                     "NotServed.Embedder_",
                     test::kPreloadingEmbedderHistgramSuffixForTesting}),
       base::Milliseconds(20), 1);
+  histogram_tester.ExpectTotalCount(
+      base::StrCat({"Prefetch.BlockUntilHeadDuration.PerMatchingCandidate."
+                    "NonPrerender.Served.Embedder_",
+                    test::kPreloadingEmbedderHistgramSuffixForTesting}),
+      0);
+  histogram_tester.ExpectUniqueTimeSample(
+      base::StrCat({"Prefetch.BlockUntilHeadDuration.PerMatchingCandidate."
+                    "NonPrerender.NotServed.Embedder_",
+                    test::kPreloadingEmbedderHistgramSuffixForTesting}),
+      base::Milliseconds(20), 1);
+  histogram_tester.ExpectTotalCount(
+      base::StrCat({"Prefetch.BlockUntilHeadDuration.PerMatchingCandidate."
+                    "Prerender.Served.Embedder_",
+                    test::kPreloadingEmbedderHistgramSuffixForTesting}),
+      0);
+  histogram_tester.ExpectTotalCount(
+      base::StrCat({"Prefetch.BlockUntilHeadDuration.PerMatchingCandidate."
+                    "Prerender.NotServed.Embedder_",
+                    test::kPreloadingEmbedderHistgramSuffixForTesting}),
+      0);
+}
+
+TEST_P(PrefetchContainerTest, BlockUntilHeadHistograms_Prerender) {
+  struct TestCase {
+    PrefetchType prefetch_type;
+    bool is_served;
+    bool is_nav_prerender;
+    std::optional<base::TimeDelta> blocked_duration;
+  };
+
+  TestCase test_case = {
+      .prefetch_type = PrefetchType(PreloadingTriggerType::kSpeculationRule,
+                                    /*use_prefetch_proxy=*/true,
+                                    blink::mojom::SpeculationEagerness::kEager),
+      .is_served = true,
+      .is_nav_prerender = true,
+      .blocked_duration = base::Milliseconds(100),
+  };
+
+  base::HistogramTester histogram_tester;
+  const GURL prefetch_url = GURL("https://test.com/?nvsparam=1");
+  const GURL navigated_url = GURL("https://test.com/");
+
+  auto prefetch_container = [&] {
+    if (test_case.prefetch_type.IsRendererInitiated()) {
+      return CreateSpeculationRulesPrefetchContainer(
+          prefetch_url, {.eagerness = test_case.prefetch_type.GetEagerness()});
+    } else {
+      return CreateEmbedderPrefetchContainer(prefetch_url);
+    }
+  }();
+
+  prefetch_container->OnUnregisterCandidate(navigated_url, test_case.is_served,
+                                            test_case.is_nav_prerender,
+                                            test_case.blocked_duration);
+
+  histogram_tester.ExpectUniqueSample(
+      "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
+      "SpeculationRule_Eager",
+      true, 1);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
+      "NonPrerender.SpeculationRule_Eager",
+      0);
+  histogram_tester.ExpectUniqueSample(
+      "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
+      "Prerender.SpeculationRule_Eager",
+      true, 1);
+  histogram_tester.ExpectUniqueTimeSample(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Served."
+      "SpeculationRule_Eager",
+      test_case.blocked_duration.value_or(base::Seconds(0)), 1);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NotServed."
+      "SpeculationRule_Eager",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NonPrerender."
+      "Served.SpeculationRule_Eager",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NonPrerender."
+      "NotServed.SpeculationRule_Eager",
+      0);
+  histogram_tester.ExpectUniqueTimeSample(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Prerender.Served."
+      "SpeculationRule_Eager",
+      test_case.blocked_duration.value_or(base::Seconds(0)), 1);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Prerender."
+      "NotServed.SpeculationRule_Eager",
+      0);
 }
 
 TEST_P(PrefetchContainerTest, RecordRedirectChainSize) {
diff --git a/content/browser/preloading/prefetch/prefetch_match_resolver.cc b/content/browser/preloading/prefetch/prefetch_match_resolver.cc
index 5c014141..9a1e626 100644
--- a/content/browser/preloading/prefetch/prefetch_match_resolver.cc
+++ b/content/browser/preloading/prefetch/prefetch_match_resolver.cc
@@ -243,8 +243,8 @@
   CHECK(candidate_data->prefetch_container);
   PrefetchContainer& prefetch_container = *candidate_data->prefetch_container;
 
-  prefetch_container.OnUnregisterCandidate(navigated_key_.url(), is_served,
-                                           GetBlockedDuration());
+  prefetch_container.OnUnregisterCandidate(
+      navigated_key_.url(), is_served, is_nav_prerender_, GetBlockedDuration());
   prefetch_container.RemoveObserver(this);
   candidates_.erase(prefetch_key);
 }
diff --git a/content/browser/preloading/prefetch/prefetch_service_unittest.cc b/content/browser/preloading/prefetch/prefetch_service_unittest.cc
index 46da2b3..d480a02 100644
--- a/content/browser/preloading/prefetch/prefetch_service_unittest.cc
+++ b/content/browser/preloading/prefetch/prefetch_service_unittest.cc
@@ -8204,5 +8204,78 @@
       0);
 }
 
+TEST_P(
+    PrefetchServiceTest,
+    UMA_Prefetch_PrefetchMatchingBlockedNavigation_And_BlockUntilHeadDuration_PrerenderOrNonPrerender) {
+  base::HistogramTester histogram_tester;
+
+  MakePrefetchService(
+      std::make_unique<testing::NiceMock<MockPrefetchServiceDelegate>>());
+
+  const PrefetchType prefetch_type = PrefetchType(
+      PreloadingTriggerType::kSpeculationRule,
+      /*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager);
+  MakePrefetchOnMainFrame(GURL("https://example.com"), prefetch_type);
+  task_environment()->RunUntilIdle();
+
+  // Request the prefetch from the PrefetchService. The given callback shouldn't
+  // be called until after the head is received.
+  base::test::TestFuture<PrefetchContainer::Reader> future;
+  GetPrefetchToServe(future, GURL("https://example.com"), MainDocumentToken());
+  EXPECT_FALSE(future.IsReady());
+
+  task_environment()->FastForwardBy(base::Milliseconds(kHeaderLatency));
+
+  // Sends the head of the prefetch response. This should trigger the above
+  // callback.
+  SendHeadOfResponseAndWait(net::HTTP_OK, kHTMLMimeType,
+                            /*use_prefetch_proxy=*/true,
+                            {{"X-Testing", "Hello World"}},
+                            std::size(kHTMLBody));
+  PrefetchContainer::Reader serveable_reader = future.Take();
+  ASSERT_TRUE(serveable_reader);
+
+  // Send the body and completion status of the request,
+  SendBodyContentOfResponseAndWait(kHTMLBody);
+  CompleteResponseAndWait(net::OK, std::size(kHTMLBody));
+
+  histogram_tester.ExpectUniqueSample(
+      "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
+      "SpeculationRule_Eager",
+      true, 1);
+  histogram_tester.ExpectUniqueSample(
+      "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
+      "NonPrerender.SpeculationRule_Eager",
+      true, 1);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate."
+      "Prerender.SpeculationRule_Eager",
+      0);
+  histogram_tester.ExpectUniqueTimeSample(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Served."
+      "SpeculationRule_Eager",
+      base::Milliseconds(kHeaderLatency), 1);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NotServed."
+      "SpeculationRule_Eager",
+      0);
+  histogram_tester.ExpectUniqueTimeSample(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NonPrerender."
+      "Served.SpeculationRule_Eager",
+      base::Milliseconds(kHeaderLatency), 1);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.NonPrerender."
+      "NotServed.SpeculationRule_Eager",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Prerender.Served."
+      "SpeculationRule_Eager",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.Prerender."
+      "NotServed.SpeculationRule_Eager",
+      0);
+}
+
 }  // namespace
 }  // namespace content
diff --git a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc
index dfc00646..7b5682d 100644
--- a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc
+++ b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc
@@ -95,6 +95,17 @@
   CHECK(!loader_callback_);
   loader_callback_ = std::move(callback);
 
+  // Prefetches are only ever used to fulfill `GET` requests. spec: if
+  // documentResource is null,
+  // https://wicg.github.io/nav-speculation/prefetch.html#create-navigation-params-from-a-prefetch-record
+  // etc. are not called.
+  if (tentative_resource_request.method !=
+      net::HttpRequestHeaders::kGetMethod) {
+    redirect_reader_ = PrefetchContainer::Reader();
+    std::move(loader_callback_).Run(std::nullopt);
+    return;
+  }
+
   if (redirect_reader_ && redirect_reader_.DoesCurrentURLToServeMatch(
                               tentative_resource_request.url)) {
     if (redirect_reader_.HaveDefaultContextCookiesChanged()) {
diff --git a/content/browser/preloading/prerender/prerender_host_registry.cc b/content/browser/preloading/prerender/prerender_host_registry.cc
index 5ce4f96..1dd11846 100644
--- a/content/browser/preloading/prerender/prerender_host_registry.cc
+++ b/content/browser/preloading/prerender/prerender_host_registry.cc
@@ -341,6 +341,17 @@
   NOTREACHED();
 }
 
+template <class ContainerType>
+void DestructPrerenderHosts(ContainerType& hosts) {
+  // Swap the container and let it scope out instead of directly destructing the
+  // hosts in the container, for example, by `hosts.clear()`. This avoids
+  // potential cases where a host being deleted indirectly modifies the
+  // container while the container is being cleared up.
+  // See https://crbug.com/40263658 for contexts.
+  ContainerType temp;
+  hosts.swap(temp);
+}
+
 // Represents a contract and ensures that the given prerender attempt is started
 // as a PrerenderHost or rejected with a reason. It is allowed to use it only in
 // PrerenderHostRegistry::CreateAndStartHost.
@@ -523,6 +534,9 @@
   // Here we have to delete the prerender hosts synchronously, to ensure the
   // FrameTrees would not access the WebContents.
   CancelAllHosts(final_status);
+  DestructPrerenderHosts(to_be_deleted_hosts_);
+  DestructPrerenderHosts(pending_deletion_hosts_);
+
   Observe(nullptr);
   for (Observer& obs : observers_)
     obs.OnRegistryDestroyed();
@@ -1748,7 +1762,13 @@
 
 void PrerenderHostRegistry::DeletePendingDeletionHosts(
     FrameTreeNodeId prerender_host_id) {
+  // Avoid directly destructing the host in the map. See the comments in
+  // `DestructPrerenderHosts()` for details.
+  std::unique_ptr<PrerenderHost> prerender_host =
+      std::move(pending_deletion_hosts_[prerender_host_id]);
   pending_deletion_hosts_.erase(prerender_host_id);
+  DestructPrerenderHosts(prerender_host);
+
   if (pending_deletion_new_tab_prerender_handle_) {
     // Delete the handle asynchronously to avoid delete `this`, as the handle
     // owns the prerender WebContents, which indirectly owns this
@@ -1799,13 +1819,7 @@
 }
 
 void PrerenderHostRegistry::DeleteAbandonedHosts() {
-  // Swap the vector and let it scope out instead of directly destructing the
-  // hosts in the vector, for example, by `to_be_deleted_hosts_.clear()`. This
-  // avoids potential cases where a host being deleted indirectly modifies
-  // `to_be_deleted_hosts_` while the vector is being cleared up. See
-  // https://crbug.com/1431744 for contexts.
-  std::vector<std::unique_ptr<PrerenderHost>> hosts;
-  to_be_deleted_hosts_.swap(hosts);
+  DestructPrerenderHosts(to_be_deleted_hosts_);
 }
 
 void PrerenderHostRegistry::NotifyTrigger(const GURL& url) {
diff --git a/content/browser/renderer_host/frame_tree.cc b/content/browser/renderer_host/frame_tree.cc
index c795440..d89a4fbe 100644
--- a/content/browser/renderer_host/frame_tree.cc
+++ b/content/browser/renderer_host/frame_tree.cc
@@ -20,7 +20,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/safe_ref.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/trace_event/optional_trace_event.h"
 #include "base/trace_event/typed_macros.h"
 #include "base/types/cxx23_from_range.h"
@@ -319,7 +318,7 @@
   FrameTree::NodeIterator node_iter = node_range.begin();
   std::vector<FrameTreeNode*> nodes;
 
-  CHECK(node_iter != node_range.end(), base::NotFatalUntil::M130);
+  CHECK(node_iter != node_range.end());
   FrameTree* root_loading_tree = root_.frame_tree().LoadingTree();
   while (node_iter != node_range.end()) {
     // Skip over frame trees and children which belong to inner web contents
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index 0c7a0acf..61454ad 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -19,7 +19,6 @@
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -2516,7 +2515,7 @@
 void MediaStreamManager::DeleteRequest(
     DeviceRequests::const_iterator request_it) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  CHECK(request_it != requests_.end(), base::NotFatalUntil::M130);
+  CHECK(request_it != requests_.end());
 
   SendLogMessage(base::StringPrintf("DeleteRequest([label=%s])",
                                     request_it->first.c_str()));
@@ -3172,7 +3171,7 @@
     DeviceRequests::const_iterator request_it,
     MediaStreamRequestResult result) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  CHECK(request_it != requests_.end(), base::NotFatalUntil::M130);
+  CHECK(request_it != requests_.end());
 
   DeviceRequest* const request = request_it->second.get();
 
@@ -3234,7 +3233,7 @@
     DeviceRequests::const_iterator request_it,
     const blink::mojom::StreamDevicesSet& stream_devices_set) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  CHECK(request_it != requests_.end(), base::NotFatalUntil::M130);
+  CHECK(request_it != requests_.end());
   DeviceRequest* const request = request_it->second.get();
 
   request->FinalizeMediaAccessRequest(request_it->first, stream_devices_set);
diff --git a/content/browser/renderer_host/media/video_capture_controller.cc b/content/browser/renderer_host/media/video_capture_controller.cc
index f150da9..09ca8b7 100644
--- a/content/browser/renderer_host/media/video_capture_controller.cc
+++ b/content/browser/renderer_host/media/video_capture_controller.cc
@@ -18,7 +18,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/stringprintf.h"
 #include "base/token.h"
 #include "base/trace_event/trace_event.h"
@@ -501,8 +500,7 @@
     media::mojom::VideoFrameInfoPtr frame_info,
     BufferContext** out_buffer_context) {
   auto buffer_context_iter = FindUnretiredBufferContextFromBufferId(buffer_id);
-  CHECK(buffer_context_iter != buffer_contexts_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(buffer_context_iter != buffer_contexts_.end());
   BufferContext* buffer_context = &(*buffer_context_iter);
   buffer_context->set_frame_feedback_id(frame_feedback_id);
   DCHECK(!buffer_context->HasConsumers());
@@ -540,8 +538,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   auto buffer_context_iter = FindUnretiredBufferContextFromBufferId(buffer_id);
-  CHECK(buffer_context_iter != buffer_contexts_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(buffer_context_iter != buffer_contexts_.end());
 
   // If there are any clients still using the buffer, we need to allow them
   // to finish up. We need to hold on to the BufferContext entry until then,
@@ -839,8 +836,7 @@
     const media::VideoCaptureFeedback& feedback) {
   auto buffer_context_iter =
       FindBufferContextFromBufferContextId(buffer_context_id);
-  CHECK(buffer_context_iter != buffer_contexts_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(buffer_context_iter != buffer_contexts_.end());
 
   buffer_context_iter->RecordConsumerUtilization(feedback);
   buffer_context_iter->DecreaseConsumerCount();
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index e276518..32affd3a 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -11486,8 +11486,7 @@
   // early if that happens, after reporting a DumpWithoutCrashing. Upgrade this
   // to a CHECK failure if no reports are received by M135.
   if (original_start_to_finish.is_negative()) {
-    NOTREACHED(base::NotFatalUntil::M135) << original_start_to_finish;
-    return;
+    NOTREACHED() << original_start_to_finish;
   }
 
   base::UmaHistogramTimes(histogram_name, adjustment);
diff --git a/content/browser/renderer_host/pepper/pepper_network_proxy_host.cc b/content/browser/renderer_host/pepper/pepper_network_proxy_host.cc
index c0ff2239..42824d1 100644
--- a/content/browser/renderer_host/pepper/pepper_network_proxy_host.cc
+++ b/content/browser/renderer_host/pepper/pepper_network_proxy_host.cc
@@ -5,7 +5,6 @@
 #include "content/browser/renderer_host/pepper/pepper_network_proxy_host.h"
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "content/browser/renderer_host/pepper/browser_ppapi_host_impl.h"
 #include "content/browser/renderer_host/pepper/pepper_proxy_lookup_helper.h"
 #include "content/browser/renderer_host/pepper/pepper_socket_utils.h"
@@ -166,7 +165,7 @@
     PepperProxyLookupHelper* pending_request,
     std::optional<net::ProxyInfo> proxy_info) {
   auto it = pending_requests_.find(pending_request);
-  CHECK(it != pending_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_requests_.end());
   pending_requests_.erase(it);
 
   std::string pac_string;
diff --git a/content/browser/renderer_host/render_frame_host_impl_ppapi_support.cc b/content/browser/renderer_host/render_frame_host_impl_ppapi_support.cc
index 2e1a6e3..e484198d 100644
--- a/content/browser/renderer_host/render_frame_host_impl_ppapi_support.cc
+++ b/content/browser/renderer_host/render_frame_host_impl_ppapi_support.cc
@@ -14,7 +14,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/memory/raw_ref.h"
-#include "base/not_fatal_until.h"
 #include "base/process/process_handle.h"
 #include "content/browser/plugin_service_impl.h"
 #include "content/browser/renderer_host/pepper/pepper_renderer_connection.h"
@@ -88,7 +87,7 @@
 void RenderFrameHostImplPpapiSupport::SetVolume(int32_t instance_id,
                                                 double volume) {
   auto it = pepper_plugin_instances_.find(instance_id);
-  CHECK(it != pepper_plugin_instances_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pepper_plugin_instances_.end());
   it->second->SetVolume(volume);
 }
 
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 995cb98..67cdf0f 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -49,7 +49,6 @@
 #include "base/metrics/statistics_recorder.h"
 #include "base/metrics/user_metrics.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/observer_list.h"
@@ -733,7 +732,7 @@
   void DecrementSiteProcessCount(const SiteInfo& site_info,
                                  ChildProcessId render_process_host_id) {
     auto result = map_.find(site_info);
-    CHECK(result != map_.end(), base::NotFatalUntil::M130);
+    CHECK(result != map_.end());
     ChildProcessIdCountMap& counts_per_process = result->second;
 
     --counts_per_process[render_process_host_id];
@@ -4437,7 +4436,7 @@
       // Chrome OS and Android unit tests trigger the thread uninitialized case.
       !BrowserThread::IsThreadInitialized(BrowserThread::UI));
   auto iter = std::ranges::find(GetAllCreationObservers(), observer);
-  CHECK(iter != GetAllCreationObservers().end(), base::NotFatalUntil::M130);
+  CHECK(iter != GetAllCreationObservers().end());
   GetAllCreationObservers().erase(iter);
 }
 
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 1654ffb..a0335fef 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -23,7 +23,6 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -165,7 +164,7 @@
 
   void Erase(const RenderViewHostImpl* rvh) {
     auto it = render_view_host_instances_.find(rvh);
-    CHECK(it != render_view_host_instances_.end(), base::NotFatalUntil::M130);
+    CHECK(it != render_view_host_instances_.end());
     render_view_host_instances_.erase(it);
   }
 
diff --git a/content/browser/service_host/service_process_tracker.cc b/content/browser/service_host/service_process_tracker.cc
index 594629e4..e9008419 100644
--- a/content/browser/service_host/service_process_tracker.cc
+++ b/content/browser/service_host/service_process_tracker.cc
@@ -40,7 +40,7 @@
 void ServiceProcessTracker::NotifyTerminated(ServiceProcessId id) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   auto iter = processes_.find(id);
-  CHECK(iter != processes_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != processes_.end());
 
   for (auto& observer : observers_) {
     observer.OnServiceProcessTerminatedNormally(iter->second.Duplicate());
@@ -51,7 +51,7 @@
 void ServiceProcessTracker::NotifyCrashed(ServiceProcessId id) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   auto iter = processes_.find(id);
-  CHECK(iter != processes_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != processes_.end());
   for (auto& observer : observers_) {
     observer.OnServiceProcessCrashed(iter->second.Duplicate());
   }
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index ad88fbfd..c09abca5 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -503,6 +503,12 @@
     return data_saver_enabled_;
   }
 
+  bool IsServiceWorkerSyntheticResponseAllowed(
+      content::BrowserContext* browser_context,
+      const GURL& url) override {
+    return true;
+  }
+
   void OverrideWebPreferences(WebContents* web_contents,
                               SiteInstance& main_frame_site,
                               blink::web_pref::WebPreferences* prefs) override {
@@ -7661,6 +7667,9 @@
     return EvalJs(GetPrimaryMainFrame(), "document.body.innerText;");
   }
 
+ protected:
+  std::unique_ptr<MockContentBrowserClient> mock_content_browser_client;
+
  private:
   void RegisterRequestHandlerForSlowResponsePage(
       net::EmbeddedTestServer* test_server) {
@@ -7679,6 +7688,12 @@
                             base::Seconds(2))
                       : std::make_unique<net::test_server::BasicHttpResponse>();
 
+          // Set opt-in header.
+          constexpr std::string_view kOptInHeaderName =
+              "Service-Worker-Synthetic-Response";
+          constexpr std::string_view kOptInHeaderValue = "?1";
+          http_response->AddCustomHeader(kOptInHeaderName, kOptInHeaderValue);
+
           if (base::Contains(request.GetURL().query(), "echo=foo")) {
             http_response->set_content("[SyntheticResponse] foo");
           } else if (base::Contains(request.GetURL().query(), "echo=bar")) {
@@ -7739,6 +7754,7 @@
 
 IN_PROC_BROWSER_TEST_F(ServiceWorkerSyntheticResponseBrowserTest,
                        MatchedPageIsServiceWorkerControlled) {
+  mock_content_browser_client = std::make_unique<MockContentBrowserClient>();
   // Navigated URL matched with the URL in the allowlist is controlled by
   // ServiceWorker.
   EXPECT_TRUE(NavigateToURL(
@@ -7751,6 +7767,7 @@
 
 IN_PROC_BROWSER_TEST_F(ServiceWorkerSyntheticResponseBrowserTest,
                        ResponseHeaderIsStored) {
+  mock_content_browser_client = std::make_unique<MockContentBrowserClient>();
   // Navigate and store the response header.
   EXPECT_TRUE(NavigateToURL(
       shell(),
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc
index 126f1450..44f4a2b 100644
--- a/content/browser/service_worker/service_worker_context_core.cc
+++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -19,7 +19,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/single_thread_task_runner.h"
@@ -495,7 +494,7 @@
     const std::string& current_client_uuid,
     const std::string& new_client_uuid) {
   auto it = service_worker_clients_by_uuid_.find(current_client_uuid);
-  CHECK(it != service_worker_clients_by_uuid_.end(), base::NotFatalUntil::M130);
+  CHECK(it != service_worker_clients_by_uuid_.end());
   std::unique_ptr<ServiceWorkerClient> service_worker_client =
       std::move(it->second);
   service_worker_clients_by_uuid_.erase(it);
@@ -973,7 +972,7 @@
 void ServiceWorkerContextCore::RemoveLiveVersion(int64_t id) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   auto it = live_versions_.find(id);
-  CHECK(it != live_versions_.end(), base::NotFatalUntil::M130);
+  CHECK(it != live_versions_.end());
   ServiceWorkerVersion* version = it->second;
 
   if (version->running_status() != blink::EmbeddedWorkerStatus::kStopped) {
diff --git a/content/browser/service_worker/service_worker_job_coordinator.cc b/content/browser/service_worker/service_worker_job_coordinator.cc
index 0c2c6aa..a8110d8 100644
--- a/content/browser/service_worker/service_worker_job_coordinator.cc
+++ b/content/browser/service_worker/service_worker_job_coordinator.cc
@@ -10,7 +10,6 @@
 #include <utility>
 
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "content/browser/service_worker/service_worker_register_job_base.h"
 #include "third_party/blink/public/mojom/loader/fetch_client_settings_object.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
@@ -145,8 +144,7 @@
                                             const blink::StorageKey& key,
                                             ServiceWorkerRegisterJobBase* job) {
   auto pending_jobs = job_queues_.find(UniqueRegistrationKey(scope, key));
-  CHECK(pending_jobs != job_queues_.end(), base::NotFatalUntil::M130)
-      << "Deleting non-existent job.";
+  CHECK(pending_jobs != job_queues_.end()) << "Deleting non-existent job.";
   pending_jobs->second.Pop(job);
   if (pending_jobs->second.empty())
     job_queues_.erase(pending_jobs);
diff --git a/content/browser/service_worker/service_worker_loader_helpers.cc b/content/browser/service_worker/service_worker_loader_helpers.cc
index ef2f0e5..023451d 100644
--- a/content/browser/service_worker/service_worker_loader_helpers.cc
+++ b/content/browser/service_worker/service_worker_loader_helpers.cc
@@ -371,11 +371,19 @@
   return *result;
 }
 
-bool IsEligibleForSyntheticResponse(const GURL& client_url) {
+bool IsEligibleForSyntheticResponse(BrowserContext* browser_context,
+                                    const GURL& client_url) {
   if (!base::FeatureList::IsEnabled(
           blink::features::kServiceWorkerSyntheticResponse)) {
     return false;
   }
+
+  if (GetContentClient()->browser()->IsServiceWorkerSyntheticResponseAllowed(
+          browser_context, client_url)) {
+    return true;
+  }
+
+  // Additionally, it also accepts the allow list.
   const std::string allowed_urls =
       blink::features::kServiceWorkerSyntheticResponseAllowedUrls.Get();
   return IsEligibleForSyntheticResponseInternal(client_url, allowed_urls);
diff --git a/content/browser/service_worker/service_worker_loader_helpers.h b/content/browser/service_worker/service_worker_loader_helpers.h
index 77856437..721929a 100644
--- a/content/browser/service_worker/service_worker_loader_helpers.h
+++ b/content/browser/service_worker/service_worker_loader_helpers.h
@@ -94,7 +94,8 @@
 
 // Check if `client_url` is eligible for Synsthtic Response.
 // Exposes one method which accepts `allowed_urls` for testing.
-bool IsEligibleForSyntheticResponse(const GURL& client_url);
+bool IsEligibleForSyntheticResponse(BrowserContext* browser_context,
+                                    const GURL& client_url);
 CONTENT_EXPORT bool IsEligibleForSyntheticResponseForTesting(
     const GURL& client_url,
     const std::string& allowed_urls);
diff --git a/content/browser/service_worker/service_worker_main_resource_loader.cc b/content/browser/service_worker/service_worker_main_resource_loader.cc
index ffb0941..ed0b9f0f 100644
--- a/content/browser/service_worker/service_worker_main_resource_loader.cc
+++ b/content/browser/service_worker/service_worker_main_resource_loader.cc
@@ -1000,7 +1000,7 @@
     scoped_refptr<ServiceWorkerVersion> version) {
   is_synthetic_response_used_ =
       service_worker_loader_helpers::IsEligibleForSyntheticResponse(
-          resource_request_.url) &&
+          context_wrapper->browser_context(), resource_request_.url) &&
       resource_request_.is_outermost_main_frame;
   if (!is_synthetic_response_used_) {
     return false;
diff --git a/content/browser/service_worker/service_worker_main_resource_loader_interceptor.cc b/content/browser/service_worker/service_worker_main_resource_loader_interceptor.cc
index 6914a976..9711a89 100644
--- a/content/browser/service_worker/service_worker_main_resource_loader_interceptor.cc
+++ b/content/browser/service_worker/service_worker_main_resource_loader_interceptor.cc
@@ -240,6 +240,7 @@
       !(handle_->context_wrapper()->MaybeHasRegistrationForStorageKey(
             handle_->service_worker_client()->key()) ||
         service_worker_loader_helpers::IsEligibleForSyntheticResponse(
+            handle_->context_wrapper()->browser_context(),
             tentative_resource_request.url));
 
   // Create and start the handler for this request. It will invoke the loader
diff --git a/content/browser/service_worker/service_worker_registry.cc b/content/browser/service_worker/service_worker_registry.cc
index b0486de..3459f54 100644
--- a/content/browser/service_worker/service_worker_registry.cc
+++ b/content/browser/service_worker/service_worker_registry.cc
@@ -12,7 +12,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/trace_event/trace_event.h"
@@ -373,7 +372,7 @@
     return;
   }
   if (service_worker_loader_helpers::IsEligibleForSyntheticResponse(
-          client_url)) {
+          context_->wrapper()->browser_context(), client_url)) {
     // If `client_url` is eligible for SyntheticResponse, create a fake
     // ServiceWorker registration so that the navigation is handled by
     // ServiceWorker main resource loader.
@@ -1233,7 +1232,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   auto iter =
       find_registration_callbacks_.find(std::make_pair(client_url, key));
-  CHECK(iter != find_registration_callbacks_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != find_registration_callbacks_.end());
   std::vector<FindRegistrationCallback> callbacks = std::move(iter->second);
   find_registration_callbacks_.erase(iter);
   for (FindRegistrationCallback& callback : callbacks) {
diff --git a/content/browser/service_worker/service_worker_script_cache_map.cc b/content/browser/service_worker/service_worker_script_cache_map.cc
index f630215..37902dd 100644
--- a/content/browser/service_worker/service_worker_script_cache_map.cc
+++ b/content/browser/service_worker/service_worker_script_cache_map.cc
@@ -9,7 +9,6 @@
 #include "base/check_op.h"
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "content/browser/service_worker/service_worker_consts.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
 #include "content/browser/service_worker/service_worker_version.h"
@@ -172,7 +171,7 @@
 void ServiceWorkerScriptCacheMap::RunCallback(uint64_t callback_id,
                                               int result) {
   auto it = callbacks_.find(callback_id);
-  CHECK(it != callbacks_.end(), base::NotFatalUntil::M130);
+  CHECK(it != callbacks_.end());
   std::move(it->second).Run(result);
   callbacks_.erase(it);
 }
diff --git a/content/browser/service_worker/service_worker_synthetic_response_manager.cc b/content/browser/service_worker/service_worker_synthetic_response_manager.cc
index a447d06..0e762de 100644
--- a/content/browser/service_worker/service_worker_synthetic_response_manager.cc
+++ b/content/browser/service_worker/service_worker_synthetic_response_manager.cc
@@ -17,12 +17,17 @@
 
 namespace content {
 namespace {
+constexpr std::string_view kOptInHeaderName =
+    "Service-Worker-Synthetic-Response";
+constexpr std::string_view kOptInHeaderValue = "?1";
+
 // Convert `network::mojom::URLResponseHead` to
 // `blink::mojom::FetchAPIResponse`.
 //
 // TODO(crbug.com/352578800): Ensure converted fields are really sufficient.
 blink::mojom::FetchAPIResponsePtr GetFetchAPIResponse(
     network::mojom::URLResponseHeadPtr head) {
+  CHECK(head->headers->HasHeaderValue(kOptInHeaderName, kOptInHeaderValue));
   auto out_response = blink::mojom::FetchAPIResponse::New();
   out_response->status_code = net::HTTP_OK;
   out_response->response_time = base::Time::Now();
@@ -176,8 +181,17 @@
       version_);
 }
 
-void ServiceWorkerSyntheticResponseManager::SetResponseHead(
+void ServiceWorkerSyntheticResponseManager::MaybeSetResponseHead(
     network::mojom::URLResponseHeadPtr response_head) {
+  if (!network::IsSuccessfulStatus(response_head->headers->response_code())) {
+    // If the response is not successful, do not update the response head.
+    return;
+  }
+  if (!response_head->headers->HasHeaderValue(kOptInHeaderName,
+                                              kOptInHeaderValue)) {
+    // If there is no opt-in header, do not update the response head.
+    return;
+  }
   version_->SetMainScriptResponse(
       std::make_unique<ServiceWorkerVersion::MainScriptResponse>(
           *response_head.Clone()));
@@ -189,10 +203,7 @@
     mojo::ScopedDataPipeConsumerHandle body) {
   TRACE_EVENT("ServiceWorker",
               "ServiceWorkerSyntheticResponseManager::OnReceiveResponse");
-  // If the response is successful, update the response head to the latest one.
-  if (network::IsSuccessfulStatus(response_head->headers->response_code())) {
-    SetResponseHead(response_head.Clone());
-  }
+  MaybeSetResponseHead(response_head.Clone());
   switch (status_) {
     case SyntheticResponseStatus::kReady:
       CHECK(write_buffer_manager_.has_value());
diff --git a/content/browser/service_worker/service_worker_synthetic_response_manager.h b/content/browser/service_worker/service_worker_synthetic_response_manager.h
index 8dc3c38..dffb1f8 100644
--- a/content/browser/service_worker/service_worker_synthetic_response_manager.h
+++ b/content/browser/service_worker/service_worker_synthetic_response_manager.h
@@ -63,7 +63,6 @@
                     OnCompleteCallback complete_callback);
   void StartSyntheticResponse(FetchCallback callback);
   SyntheticResponseStatus Status() const { return status_; }
-  void SetResponseHead(network::mojom::URLResponseHeadPtr response_head);
 
  private:
   class SyntheticResponseURLLoaderClient;
@@ -72,6 +71,8 @@
                          mojo::ScopedDataPipeConsumerHandle body);
   void OnComplete(const network::URLLoaderCompletionStatus& status);
 
+  void MaybeSetResponseHead(network::mojom::URLResponseHeadPtr response_head);
+
   // Read response data from the data pipe which has the actual response from
   // the network, and keep it in buffer.
   void Read(MojoResult result, const mojo::HandleSignalsState& state);
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index c6a73fa4..e805cfe 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -22,7 +22,6 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
@@ -1010,7 +1009,7 @@
 #if DCHECK_IS_ON()
   // Ensures this function is only called for a known window client.
   auto it = controllee_map_.find(client_uuid);
-  CHECK(it != controllee_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != controllee_map_.end());
 
   DCHECK_EQ(it->second->GetClientType(),
             blink::mojom::ServiceWorkerClientType::kWindow);
@@ -3033,7 +3032,7 @@
 ServiceWorkerUpdateChecker::ComparedScriptInfo
 ServiceWorkerVersion::TakeComparedScriptInfo(const GURL& script_url) {
   auto it = compared_script_info_map_.find(script_url);
-  CHECK(it != compared_script_info_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != compared_script_info_map_.end());
   ServiceWorkerUpdateChecker::ComparedScriptInfo info = std::move(it->second);
   compared_script_info_map_.erase(it);
   return info;
diff --git a/content/browser/shared_storage/shared_storage_worklet_host.cc b/content/browser/shared_storage/shared_storage_worklet_host.cc
index d24509d..1ac4689 100644
--- a/content/browser/shared_storage/shared_storage_worklet_host.cc
+++ b/content/browser/shared_storage/shared_storage_worklet_host.cc
@@ -1444,7 +1444,7 @@
         const std::string& error_message,
         uint32_t index) {
   auto it = unresolved_urns_.find(urn_uuid);
-  CHECK(it != unresolved_urns_.end(), base::NotFatalUntil::M130);
+  CHECK(it != unresolved_urns_.end());
 
   if ((success && index >= it->second.size()) || (!success && index != 0)) {
     // This could indicate a compromised worklet environment, so let's terminate
@@ -1483,7 +1483,7 @@
     bool use_page_budgets,
     BudgetResult budget_result) {
   auto it = unresolved_urns_.find(urn_uuid);
-  CHECK(it != unresolved_urns_.end(), base::NotFatalUntil::M130);
+  CHECK(it != unresolved_urns_.end());
 
   std::vector<blink::mojom::SharedStorageUrlWithMetadataPtr>
       urls_with_metadata = std::move(it->second);
@@ -1574,7 +1574,7 @@
     const std::string& operation_name,
     uint32_t index) {
   auto it = unresolved_urns_.find(urn_uuid);
-  CHECK(it != unresolved_urns_.end(), base::NotFatalUntil::M130);
+  CHECK(it != unresolved_urns_.end());
 
   if (index >= it->second.size()) {
     // Return the default index if the saved index is out-of-range for the
diff --git a/content/browser/speech/speech_recognition_manager_impl.cc b/content/browser/speech/speech_recognition_manager_impl.cc
index b1136a2..9802912 100644
--- a/content/browser/speech/speech_recognition_manager_impl.cc
+++ b/content/browser/speech/speech_recognition_manager_impl.cc
@@ -15,7 +15,6 @@
 #include "base/location.h"
 #include "base/memory/ref_counted_delete_on_sequence.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "build/build_config.h"
@@ -904,7 +903,7 @@
 SpeechRecognitionManagerImpl::GetSession(int session_id) const {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   auto iter = sessions_.find(session_id);
-  CHECK(iter != sessions_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != sessions_.end());
   return iter->second.get();
 }
 
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc
index 2836fccd..a001b6f 100644
--- a/content/browser/web_contents/web_contents_view_aura.cc
+++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -1182,7 +1182,7 @@
   }
 
   // |this| should still be alive at this point.
-  CHECK(weak_this, base::NotFatalUntil::M130);
+  CHECK(weak_this);
 
   // If drag is still in progress that means we haven't received drop targeting
   // callback yet. So we have to make sure to delay calling EndDrag until drop
diff --git a/content/browser/webrtc/resources/stats_rates_calculator.js b/content/browser/webrtc/resources/stats_rates_calculator.js
index 169bd9af..cb4450d 100644
--- a/content/browser/webrtc/resources/stats_rates_calculator.js
+++ b/content/browser/webrtc/resources/stats_rates_calculator.js
@@ -545,9 +545,20 @@
         },
       },
       {
+        type: 'remote-inbound-rtp',
+        metricCalculators: {
+          totalRoundTripTime:
+              new RateCalculator('totalRoundTripTime',
+                                 'roundTripTimeMeasurements'),
+        },
+      },
+      {
         type: 'remote-outbound-rtp',
         metricCalculators: {
           remoteTimestamp: new DateCalculator('remoteTimestamp'),
+          totalRoundTripTime:
+              new RateCalculator('totalRoundTripTime',
+                                 'roundTripTimeMeasurements'),
         },
       },
       {
diff --git a/content/browser/worker_host/dedicated_worker_service_impl.cc b/content/browser/worker_host/dedicated_worker_service_impl.cc
index 4501b47..7d59b42 100644
--- a/content/browser/worker_host/dedicated_worker_service_impl.cc
+++ b/content/browser/worker_host/dedicated_worker_service_impl.cc
@@ -4,7 +4,6 @@
 
 #include "content/browser/worker_host/dedicated_worker_service_impl.h"
 
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "content/browser/worker_host/dedicated_worker_host.h"
 #include "content/public/browser/browser_thread.h"
@@ -69,7 +68,7 @@
     const blink::DedicatedWorkerToken& dedicated_worker_token,
     const GURL& url) {
   auto it = dedicated_worker_hosts_.find(dedicated_worker_token);
-  CHECK(it != dedicated_worker_hosts_.end(), base::NotFatalUntil::M130);
+  CHECK(it != dedicated_worker_hosts_.end());
 
   for (Observer& observer : observers_) {
     observer.OnFinalResponseURLDetermined(dedicated_worker_token, url);
diff --git a/content/browser/worker_host/shared_worker_service_impl.cc b/content/browser/worker_host/shared_worker_service_impl.cc
index cf55bb4..c3c8562 100644
--- a/content/browser/worker_host/shared_worker_service_impl.cc
+++ b/content/browser/worker_host/shared_worker_service_impl.cc
@@ -15,7 +15,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/functional/callback_helpers.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "content/browser/devtools/shared_worker_devtools_agent_host.h"
 #include "content/browser/loader/file_url_loader_factory.h"
@@ -300,7 +299,7 @@
     GlobalRenderFrameHostId client_render_frame_host_id) {
   auto it = shared_worker_client_counts_.find(
       std::make_pair(token, client_render_frame_host_id));
-  CHECK(it != shared_worker_client_counts_.end(), base::NotFatalUntil::M130);
+  CHECK(it != shared_worker_client_counts_.end());
 
   int& count = it->second;
   DCHECK_GT(count, 0);
diff --git a/content/browser/xr/service/xr_runtime_manager_impl.cc b/content/browser/xr/service/xr_runtime_manager_impl.cc
index e8679f1..051f6d9 100644
--- a/content/browser/xr/service/xr_runtime_manager_impl.cc
+++ b/content/browser/xr/service/xr_runtime_manager_impl.cc
@@ -14,7 +14,6 @@
 #include "base/lazy_instance.h"
 #include "base/memory/singleton.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/trace_event/trace_event.h"
@@ -631,7 +630,7 @@
 
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   auto it = runtimes_.find(id);
-  CHECK(it != runtimes_.end(), base::NotFatalUntil::M130);
+  CHECK(it != runtimes_.end());
 
   GetLoggerManager().RecordRuntimeRemoved(id);
 
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 4a37794..18020e34e 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -724,6 +724,12 @@
   return true;
 }
 
+bool ContentBrowserClient::IsServiceWorkerSyntheticResponseAllowed(
+    content::BrowserContext* browser_context,
+    const GURL& url) {
+  return false;
+}
+
 void ContentBrowserClient::GrantCookieAccessDueToHeuristic(
     content::BrowserContext* browser_context,
     const net::SchemefulSite& top_frame_site,
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 0d0d957b..522a4a27 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -1234,6 +1234,14 @@
   virtual bool IsPrefetchWithServiceWorkerAllowed(
       content::BrowserContext* browser_context);
 
+  // Returns whether the synthetic response with service worker is allowed for
+  // the profile in a given context and URL. Not all URLs are actually invoke
+  // synthetic response. The opt-in from the server is required to invoke the
+  // feature.
+  virtual bool IsServiceWorkerSyntheticResponseAllowed(
+      content::BrowserContext* browser_context,
+      const GURL& url);
+
   // Temporarily allow `accessing_site` to access cookies when embedded on
   // `top_frame_site` when third-party cookies are otherwise blocked. After
   // `ttl` has passed, the access will be revoked. If `ignore_schemes` is true,
diff --git a/content/public/browser/file_system_access_permission_context.h b/content/public/browser/file_system_access_permission_context.h
index f9ea7ce..41d142f 100644
--- a/content/public/browser/file_system_access_permission_context.h
+++ b/content/public/browser/file_system_access_permission_context.h
@@ -58,32 +58,32 @@
   explicit PathInfo(base::FilePath path)
       : path(std::move(path)),
         display_name(this->path.BaseName().AsUTF8Unsafe()) {
-    CHECK(!this->path.empty(), base::NotFatalUntil::M134);
-    CHECK(!this->display_name.empty(), base::NotFatalUntil::M134);
+    CHECK(!this->path.empty());
+    CHECK(!this->display_name.empty());
   }
   explicit PathInfo(base::FilePath::StringViewType path)
       : PathInfo(base::FilePath(path)) {
-    CHECK(!this->path.empty(), base::NotFatalUntil::M134);
-    CHECK(!this->display_name.empty(), base::NotFatalUntil::M134);
+    CHECK(!this->path.empty());
+    CHECK(!this->display_name.empty());
   }
   PathInfo(PathType type, base::FilePath path)
       : type(type),
         path(std::move(path)),
         display_name(this->path.BaseName().AsUTF8Unsafe()) {
-    CHECK(!this->path.empty(), base::NotFatalUntil::M134);
-    CHECK(!this->display_name.empty(), base::NotFatalUntil::M134);
+    CHECK(!this->path.empty());
+    CHECK(!this->display_name.empty());
   }
   PathInfo(base::FilePath path, std::string display_name)
       : path(std::move(path)), display_name(std::move(display_name)) {
-    CHECK(!this->path.empty(), base::NotFatalUntil::M134);
-    CHECK(!this->display_name.empty(), base::NotFatalUntil::M134);
+    CHECK(!this->path.empty());
+    CHECK(!this->display_name.empty());
   }
   PathInfo(PathType type, base::FilePath path, std::string display_name)
       : type(type),
         path(std::move(path)),
         display_name(std::move(display_name)) {
-    CHECK(!this->path.empty(), base::NotFatalUntil::M134);
-    CHECK(!this->display_name.empty(), base::NotFatalUntil::M134);
+    CHECK(!this->path.empty());
+    CHECK(!this->display_name.empty());
   }
 
   bool operator==(const PathInfo& other) const = default;
diff --git a/content/public/test/keep_alive_url_loader_utils.cc b/content/public/test/keep_alive_url_loader_utils.cc
index ae273cf..00316f1 100644
--- a/content/public/test/keep_alive_url_loader_utils.cc
+++ b/content/public/test/keep_alive_url_loader_utils.cc
@@ -63,7 +63,7 @@
   void Increment() {
     base::AutoLock auto_lock(lock_);
     count_++;
-    if (waiting_run_loop_) {
+    if (waiting_run_loop_ && last_waited_value_ <= count_) {
       waiting_run_loop_->Quit();
     }
   }
@@ -76,6 +76,7 @@
       if (count_ >= value) {
         return;
       }
+      last_waited_value_ = value;
     }
 
     {
@@ -94,6 +95,7 @@
  private:
   base::Lock lock_;
   size_t count_ GUARDED_BY(lock_) = 0;
+  size_t last_waited_value_ = 0;
   std::unique_ptr<base::RunLoop> waiting_run_loop_ = nullptr;
 };
 
@@ -144,6 +146,7 @@
   // `error_codes`.
   void WaitForTotalOnComplete(const std::vector<int>& error_codes) {
     on_complete_count_.WaitUntil(error_codes.size());
+    CHECK_EQ(error_codes.size(), on_complete_status_.size());
     EXPECT_THAT(on_complete_status_,
                 testing::Pointwise(ErrorCodeEq(), error_codes));
   }
@@ -186,20 +189,20 @@
   void OnComplete(
       KeepAliveURLLoader* loader,
       const network::URLLoaderCompletionStatus& completion_status) override {
-    on_complete_count_.Increment();
     on_complete_status_.push_back(completion_status);
+    on_complete_count_.Increment();
   }
   void OnCompleteForwarded(
       KeepAliveURLLoader* loader,
       const network::URLLoaderCompletionStatus& completion_status) override {
-    on_complete_forwarded_count_.Increment();
     on_complete_forwarded_status_.push_back(completion_status);
+    on_complete_forwarded_count_.Increment();
   }
   void OnCompleteProcessed(
       KeepAliveURLLoader* loader,
       const network::URLLoaderCompletionStatus& completion_status) override {
-    on_complete_processed_count_.Increment();
     on_complete_processed_status_.push_back(completion_status);
+    on_complete_processed_count_.Increment();
   }
 
   // OnReceiveRedirect*:
diff --git a/content/renderer/media/media_permission_dispatcher.cc b/content/renderer/media/media_permission_dispatcher.cc
index 01b851a..2676ec3 100644
--- a/content/renderer/media/media_permission_dispatcher.cc
+++ b/content/renderer/media/media_permission_dispatcher.cc
@@ -6,7 +6,6 @@
 
 #include "base/functional/bind.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/task/bind_post_task.h"
 #include "base/task/single_thread_task_runner.h"
@@ -150,7 +149,7 @@
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   auto iter = requests_.find(request_id);
-  CHECK(iter != requests_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != requests_.end());
 
   PermissionStatusCB permission_status_cb = std::move(iter->second);
   requests_.erase(iter);
diff --git a/content/renderer/pepper/host_var_tracker.cc b/content/renderer/pepper/host_var_tracker.cc
index 784b81a2..bcaa91d70 100644
--- a/content/renderer/pepper/host_var_tracker.cc
+++ b/content/renderer/pepper/host_var_tracker.cc
@@ -8,7 +8,6 @@
 
 #include "base/check.h"
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "content/renderer/pepper/host_array_buffer_var.h"
 #include "content/renderer/pepper/host_globals.h"
@@ -68,7 +67,7 @@
   v8::HandleScope handle_scope(object_var->instance()->GetIsolate());
   auto it = GetForV8Object(object_var->instance()->pp_instance(),
                            object_var->GetHandle());
-  CHECK(it != object_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != object_map_.end());
   object_map_.erase(it);
 }
 
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
index 2c3493b..76b2e508 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -19,7 +19,6 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_offset_string_conversions.h"
@@ -2703,7 +2702,7 @@
     const viz::TransferableResource& resource) {
   auto it = std::ranges::find(texture_ref_counts_, resource.mailbox(),
                               &MailboxRefCount::first);
-  CHECK(it != texture_ref_counts_.end(), base::NotFatalUntil::M130);
+  CHECK(it != texture_ref_counts_.end());
 
   if (it->second == 1) {
     texture_ref_counts_.erase(it);
diff --git a/content/renderer/pepper/pepper_video_decoder_host.cc b/content/renderer/pepper/pepper_video_decoder_host.cc
index 3bff174..2f797f7 100644
--- a/content/renderer/pepper/pepper_video_decoder_host.cc
+++ b/content/renderer/pepper/pepper_video_decoder_host.cc
@@ -14,7 +14,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "content/common/pepper_file_util.h"
 #include "content/public/common/content_client.h"
@@ -547,7 +546,7 @@
 
 const uint8_t* PepperVideoDecoderHost::DecodeIdToAddress(uint32_t decode_id) {
   PendingDecodeList::const_iterator it = GetPendingDecodeById(decode_id);
-  CHECK(it != pending_decodes_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_decodes_.end());
   uint32_t shm_id = it->shm_id;
   return static_cast<uint8_t*>(shm_buffers_[shm_id].mapping.memory());
 }
diff --git a/content/renderer/pepper/ppb_graphics_3d_impl.cc b/content/renderer/pepper/ppb_graphics_3d_impl.cc
index 7fb0751..dfde8459 100644
--- a/content/renderer/pepper/ppb_graphics_3d_impl.cc
+++ b/content/renderer/pepper/ppb_graphics_3d_impl.cc
@@ -15,7 +15,6 @@
 #include "base/location.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/single_thread_task_runner.h"
 #include "build/build_config.h"
@@ -266,7 +265,7 @@
     // `current_color_buffer_` because it could have changed do to resize.
   } else {
     auto it = inflight_color_buffers_.find(mailbox);
-    CHECK(it != inflight_color_buffers_.end(), base::NotFatalUntil::M130);
+    CHECK(it != inflight_color_buffers_.end());
     RecycleColorBuffer(std::move(it->second), sync_token, is_lost);
     inflight_color_buffers_.erase(it);
   }
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index b6da726a..d83b79b 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -2309,7 +2309,7 @@
 #else
       // Previously this CHECK() was disabled on Android because it was much
       // easier to hit the race there.
-      CHECK(!in_frame_tree_, base::NotFatalUntil::M135);
+      CHECK(!in_frame_tree_);
 #endif  // !BUILDFLAG(IS_ANDROID)
       break;
   }
diff --git a/content/services/auction_worklet/auction_v8_devtools_agent.cc b/content/services/auction_worklet/auction_v8_devtools_agent.cc
index 640f61c..092c419 100644
--- a/content/services/auction_worklet/auction_v8_devtools_agent.cc
+++ b/content/services/auction_worklet/auction_v8_devtools_agent.cc
@@ -9,7 +9,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/task/sequenced_task_runner.h"
 #include "content/services/auction_worklet/auction_v8_devtools_session.h"
@@ -112,7 +111,7 @@
   DCHECK(!paused_);
 
   auto it = context_groups_.find(context_group_id);
-  CHECK(it != context_groups_.end(), base::NotFatalUntil::M130);
+  CHECK(it != context_groups_.end());
   DCHECK(!it->second.sessions.empty());
   AuctionV8DevToolsSession* session = *it->second.sessions.begin();
 
@@ -141,7 +140,7 @@
     AuctionV8DevToolsSession* session) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(v8_sequence_checker_);
   auto it = context_groups_.find(session->context_group_id());
-  CHECK(it != context_groups_.end(), base::NotFatalUntil::M130);
+  CHECK(it != context_groups_.end());
   it->second.sessions.erase(session);
   if (it->second.sessions.empty())
     context_groups_.erase(it);
diff --git a/content/services/auction_worklet/auction_v8_helper.cc b/content/services/auction_worklet/auction_v8_helper.cc
index cce8628..47db4997 100644
--- a/content/services/auction_worklet/auction_v8_helper.cc
+++ b/content/services/auction_worklet/auction_v8_helper.cc
@@ -22,7 +22,6 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
@@ -777,7 +776,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   base::AutoLock hold_lock(context_groups_lock_);
   auto it = resume_callbacks_.find(context_group_id);
-  CHECK(it != resume_callbacks_.end(), base::NotFatalUntil::M130);
+  CHECK(it != resume_callbacks_.end());
   DCHECK(it->second.is_null());
   it->second = std::move(resume_callback);
 }
diff --git a/content/services/auction_worklet/direct_from_seller_signals_requester.cc b/content/services/auction_worklet/direct_from_seller_signals_requester.cc
index bb66cb42..14c6ef0 100644
--- a/content/services/auction_worklet/direct_from_seller_signals_requester.cc
+++ b/content/services/auction_worklet/direct_from_seller_signals_requester.cc
@@ -18,7 +18,6 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
@@ -307,7 +306,7 @@
   // will also destroy the downloader. The Request won't try to cancel anything
   // after this since running the callback clears the Request's iterator.
   auto it = coalesced_downloads_.find(signals_url);
-  CHECK(it != coalesced_downloads_.end(), base::NotFatalUntil::M130);
+  CHECK(it != coalesced_downloads_.end());
   DCHECK_EQ(signals_url, it->second.downloader->source_url());
   std::list<raw_ptr<Request>> requests;
   std::swap(requests, it->second.requests);
@@ -333,7 +332,7 @@
   // Otherwise, remove the request pointer to `this` from
   // `coalesced_downloads_`.
   auto map_it = coalesced_downloads_.find(request.signals_url_);
-  CHECK(map_it != coalesced_downloads_.end(), base::NotFatalUntil::M130);
+  CHECK(map_it != coalesced_downloads_.end());
   CoalescedDownload& coalesced_download = map_it->second;
   DCHECK_EQ(coalesced_download.downloader->source_url(), request.signals_url_);
   DCHECK_GT(coalesced_download.requests.size(), 0u);
diff --git a/crypto/nss_util_chromeos.cc b/crypto/nss_util_chromeos.cc
index a8b76bdb..878b766 100644
--- a/crypto/nss_util_chromeos.cc
+++ b/crypto/nss_util_chromeos.cc
@@ -28,7 +28,6 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/path_service.h"
 #include "base/strings/stringprintf.h"
@@ -421,7 +420,7 @@
   void CloseChromeOSUserForTesting(const std::string& username_hash) {
     DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
     auto i = chromeos_user_map_.find(username_hash);
-    CHECK(i != chromeos_user_map_.end(), base::NotFatalUntil::M130);
+    CHECK(i != chromeos_user_map_.end());
     chromeos_user_map_.erase(i);
   }
 
diff --git a/device/bluetooth/adapter.cc b/device/bluetooth/adapter.cc
index 4e71f56..c4df5b77 100644
--- a/device/bluetooth/adapter.cc
+++ b/device/bluetooth/adapter.cc
@@ -13,7 +13,6 @@
 #include "base/functional/callback_helpers.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "device/bluetooth/advertisement.h"
 #include "device/bluetooth/bluetooth_local_gatt_service.h"
@@ -461,8 +460,7 @@
   auto it = connect_to_service_requests_pending_discovery_.begin();
   while (it != connect_to_service_requests_pending_discovery_.end()) {
     auto request_it = connect_to_service_request_map_.find(*it);
-    CHECK(request_it != connect_to_service_request_map_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(request_it != connect_to_service_request_map_.end());
     if (address == request_it->second->address) {
       ProcessDeviceForInsecureServiceConnection(*it, device, disconnected);
       it = connect_to_service_requests_pending_discovery_.erase(it);
diff --git a/device/bluetooth/bluetooth_adapter_win.cc b/device/bluetooth/bluetooth_adapter_win.cc
index b37b0ae..4d930ddc 100644
--- a/device/bluetooth/bluetooth_adapter_win.cc
+++ b/device/bluetooth/bluetooth_adapter_win.cc
@@ -14,7 +14,6 @@
 #include "base/functional/bind.h"
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/stl_util.h"
 #include "base/task/sequenced_task_runner.h"
@@ -244,7 +243,7 @@
         observer.DeviceAdded(this, device_win_raw);
     } else if (base::Contains(changed_devices, device_state->address)) {
       auto iter = devices_.find(device_state->address);
-      CHECK(iter != devices_.end(), base::NotFatalUntil::M130);
+      CHECK(iter != devices_.end());
       BluetoothDeviceWin* device_win =
           static_cast<BluetoothDeviceWin*>(iter->second.get());
       if (!device_win->IsEqual(*device_state)) {
diff --git a/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc b/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc
index 0609fab..ec935c0 100644
--- a/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc
+++ b/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc
@@ -10,7 +10,6 @@
 #include <utility>
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/run_loop.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/test/bind.h"
@@ -382,7 +381,7 @@
   auto iter = std::ranges::find(
       fake_services_, device_service,
       &Microsoft::WRL::ComPtr<FakeGattDeviceServiceWinrt>::Get);
-  CHECK(iter != fake_services_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != fake_services_.end());
   fake_services_.erase(iter);
   SimulateGattServicesChanged();
   DCHECK(gatt_services_callback_);
diff --git a/device/fido/virtual_ctap2_device.cc b/device/fido/virtual_ctap2_device.cc
index bb91ac42..54289cb 100644
--- a/device/fido/virtual_ctap2_device.cc
+++ b/device/fido/virtual_ctap2_device.cc
@@ -20,7 +20,6 @@
 #include "base/containers/span.h"
 #include "base/functional/bind.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/byte_conversions.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/strcat.h"
@@ -2666,7 +2665,7 @@
     *response =
         cbor::Writer::Write(cbor::Value(std::move(response_map))).value();
   } else {
-    CHECK(set_it != request_map.end(), base::NotFatalUntil::M130);
+    CHECK(set_it != request_map.end());
     const std::vector<uint8_t>& set = set_it->second.GetBytestring();
     if (set.size() > max_fragment_length) {
       return CtapDeviceResponseCode::kCtap1ErrInvalidLength;
diff --git a/device/vr/android/arcore/ar_compositor_frame_sink.cc b/device/vr/android/arcore/ar_compositor_frame_sink.cc
index 01d7be8..7630e224 100644
--- a/device/vr/android/arcore/ar_compositor_frame_sink.cc
+++ b/device/vr/android/arcore/ar_compositor_frame_sink.cc
@@ -7,7 +7,6 @@
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/task/bind_post_task.h"
 #include "base/task/single_thread_task_runner.h"
 #include "components/viz/common/quads/compositor_frame.h"
@@ -275,7 +274,7 @@
       continue;
 
     auto it = id_to_frame_map_.find(resource.id);
-    CHECK(it != id_to_frame_map_.end(), base::NotFatalUntil::M130);
+    CHECK(it != id_to_frame_map_.end());
     auto* rendering_frame = it->second.get();
 
     // While we now know that this resource is associated with this frame, we
diff --git a/docs/ios/build_instructions.md b/docs/ios/build_instructions.md
index 95990a6a..445b713 100644
--- a/docs/ios/build_instructions.md
+++ b/docs/ios/build_instructions.md
@@ -315,6 +315,9 @@
 
 ## Blink for tvOS builds and running
 
+Note: To build Blink for tvOS, make sure that the tvOS SDK and the tvOS
+simulator are installed on your system.
+
 Blink for tvOS is an experimental project that aims to port Blink to Apple tvOS.
 Due to platform limitations, specifically because tvOS does not support
 multi-process applications, Blink for tvOS runs in a single-process mode only.
@@ -323,6 +326,10 @@
 Please note that this project is still under development and considered
 unstable.
 
+tvOS is an iOS-based platform, and within the Chromium project, it is treated as
+a variant of the iOS build. As such, the same setup instructions used for iOS
+also apply to tvOS.
+
 If you use the `setup-gn.py` script as described above, it will automatically
 create `out/${configuration}-appletvsimulator` and
 `out/${configuration}-appletvos` directories with the appropriate GN arguments.
diff --git a/extensions/browser/api/declarative_net_request/regex_rules_matcher.cc b/extensions/browser/api/declarative_net_request/regex_rules_matcher.cc
index bb50d77..0d2e615 100644
--- a/extensions/browser/api/declarative_net_request/regex_rules_matcher.cc
+++ b/extensions/browser/api/declarative_net_request/regex_rules_matcher.cc
@@ -9,7 +9,6 @@
 
 #include "base/containers/contains.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -240,7 +239,7 @@
   std::vector<RegexRuleInfo> potential_matches;
   for (int re2_id : potential_re2_ids) {
     auto it = re2_id_to_rules_map_.find(re2_id);
-    CHECK(it != re2_id_to_rules_map_.end(), base::NotFatalUntil::M130);
+    CHECK(it != re2_id_to_rules_map_.end());
 
     const flat::RegexRule* rule = it->second;
     if (!DoesRuleMetadataMatchRequest(*rule->url_rule(), params)) {
diff --git a/extensions/browser/api/declarative_net_request/ruleset_manager.cc b/extensions/browser/api/declarative_net_request/ruleset_manager.cc
index c851ec8..9389768 100644
--- a/extensions/browser/api/declarative_net_request/ruleset_manager.cc
+++ b/extensions/browser/api/declarative_net_request/ruleset_manager.cc
@@ -14,7 +14,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/time/time.h"
 #include "base/timer/elapsed_timer.h"
@@ -259,13 +258,11 @@
       [this](const RequestAction& lhs, const RequestAction& rhs) {
         auto lhs_install_time_it =
             extension_install_times_.find(lhs.extension_id);
-        CHECK(lhs_install_time_it != extension_install_times_.end(),
-              base::NotFatalUntil::M130);
+        CHECK(lhs_install_time_it != extension_install_times_.end());
 
         auto rhs_install_time_it =
             extension_install_times_.find(rhs.extension_id);
-        CHECK(rhs_install_time_it != extension_install_times_.end(),
-              base::NotFatalUntil::M130);
+        CHECK(rhs_install_time_it != extension_install_times_.end());
 
         // Same comparator as ExtensionRulesetData's for actions from different
         // extensions. Otherwise, default to RequestAction's comparator.
diff --git a/extensions/browser/api/declarative_net_request/test_utils.cc b/extensions/browser/api/declarative_net_request/test_utils.cc
index c873096..13f26a0 100644
--- a/extensions/browser/api/declarative_net_request/test_utils.cc
+++ b/extensions/browser/api/declarative_net_request/test_utils.cc
@@ -13,7 +13,6 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/json/json_file_value_serializer.h"
-#include "base/not_fatal_until.h"
 #include "base/values.h"
 #include "extensions/browser/api/declarative_net_request/composite_matcher.h"
 #include "extensions/browser/api/declarative_net_request/file_backed_ruleset_source.h"
@@ -578,7 +577,7 @@
   const DNRManifestData::ManifestIDToRulesetMap& public_id_map =
       DNRManifestData::GetManifestIDToRulesetMap(extension);
   auto it = public_id_map.find(ruleset_id_string);
-  CHECK(public_id_map.end() != it, base::NotFatalUntil::M130);
+  CHECK(public_id_map.end() != it);
   RulesetID ruleset_id = it->second->id;
 
   const CompositeMatcher* composite_matcher =
diff --git a/extensions/browser/api/execute_code_function.cc b/extensions/browser/api/execute_code_function.cc
index 5aae8e9..7cb7014 100644
--- a/extensions/browser/api/execute_code_function.cc
+++ b/extensions/browser/api/execute_code_function.cc
@@ -12,7 +12,6 @@
 #include <utility>
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "extensions/browser/extension_api_frame_id_map.h"
 #include "extensions/browser/extensions_browser_client.h"
 #include "extensions/browser/load_and_localize_file.h"
@@ -232,7 +231,7 @@
   auto root_frame_result = std::ranges::find(
       results, root_frame_id_, &ScriptExecutor::FrameResult::frame_id);
 
-  CHECK(root_frame_result != results.end(), base::NotFatalUntil::M130);
+  CHECK(root_frame_result != results.end());
 
   // We just error out if we never injected in the root frame.
   // TODO(devlin): That's a bit odd, because other injections may have
diff --git a/extensions/browser/api/hid/hid_device_manager.cc b/extensions/browser/api/hid/hid_device_manager.cc
index d0a76a9f..1e035a6 100644
--- a/extensions/browser/api/hid/hid_device_manager.cc
+++ b/extensions/browser/api/hid/hid_device_manager.cc
@@ -21,7 +21,6 @@
 #include "base/location.h"
 #include "base/memory/raw_ptr.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/device_service.h"
@@ -301,10 +300,10 @@
 void HidDeviceManager::DeviceRemoved(device::mojom::HidDeviceInfoPtr device) {
   DCHECK(thread_checker_.CalledOnValidThread());
   const auto& resource_entry = resource_ids_.find(device->guid);
-  CHECK(resource_entry != resource_ids_.end(), base::NotFatalUntil::M130);
+  CHECK(resource_entry != resource_ids_.end());
   int resource_id = resource_entry->second;
   const auto& device_entry = devices_.find(resource_id);
-  CHECK(device_entry != devices_.end(), base::NotFatalUntil::M130);
+  CHECK(device_entry != devices_.end());
   resource_ids_.erase(resource_entry);
   devices_.erase(device_entry);
 
@@ -327,7 +326,7 @@
   // Find |device| in |devices_|.
   DCHECK(thread_checker_.CalledOnValidThread());
   const auto& resource_entry = resource_ids_.find(device->guid);
-  CHECK(resource_entry != resource_ids_.end(), base::NotFatalUntil::M130);
+  CHECK(resource_entry != resource_ids_.end());
   int resource_id = resource_entry->second;
   DCHECK(base::Contains(devices_, resource_id));
 
diff --git a/extensions/browser/api/offscreen/lifetime_enforcer_factories.cc b/extensions/browser/api/offscreen/lifetime_enforcer_factories.cc
index cb94ba6..2ff68502 100644
--- a/extensions/browser/api/offscreen/lifetime_enforcer_factories.cc
+++ b/extensions/browser/api/offscreen/lifetime_enforcer_factories.cc
@@ -7,7 +7,6 @@
 #include "base/check.h"
 #include "base/functional/bind.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/types/cxx23_to_underlying.h"
 #include "extensions/browser/api/offscreen/audio_lifetime_enforcer.h"
 #include "extensions/browser/api/offscreen/offscreen_document_lifetime_enforcer.h"
@@ -129,7 +128,7 @@
 
   auto& factories = GetFactoriesInstance();
   auto iter = factories.map_.find(reason);
-  CHECK(iter != factories.map_.end(), base::NotFatalUntil::M130)
+  CHECK(iter != factories.map_.end())
       << "No factory registered for: " << api::offscreen::ToString(reason);
   return iter->second.Run(offscreen_document, std::move(termination_callback),
                           std::move(notify_inactive_callback));
diff --git a/extensions/browser/api/offscreen/offscreen_document_manager.cc b/extensions/browser/api/offscreen/offscreen_document_manager.cc
index 37589d5..483392e 100644
--- a/extensions/browser/api/offscreen/offscreen_document_manager.cc
+++ b/extensions/browser/api/offscreen/offscreen_document_manager.cc
@@ -7,7 +7,6 @@
 #include "base/check.h"
 #include "base/containers/contains.h"
 #include "base/dcheck_is_on.h"
-#include "base/not_fatal_until.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 #include "content/public/browser/browser_context.h"
@@ -221,7 +220,7 @@
 void OffscreenDocumentManager::CloseOffscreenDocument(
     ExtensionHost* offscreen_document) {
   auto iter = offscreen_documents_.find(offscreen_document->extension_id());
-  CHECK(iter != offscreen_documents_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != offscreen_documents_.end());
   DCHECK_EQ(iter->second.host.get(), offscreen_document);
   offscreen_documents_.erase(iter);
 }
diff --git a/extensions/browser/api/serial/serial_apitest.cc b/extensions/browser/api/serial/serial_apitest.cc
index db2a0028b..7fffd44 100644
--- a/extensions/browser/api/serial/serial_apitest.cc
+++ b/extensions/browser/api/serial/serial_apitest.cc
@@ -12,7 +12,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/memory/ref_counted.h"
-#include "base/not_fatal_until.h"
 #include "base/unguessable_token.h"
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/profiles/profile.h"
@@ -330,7 +329,7 @@
       OpenPortCallback callback) override {
     DCHECK(!watcher);
     auto it = ports_.find(token);
-    CHECK(it != ports_.end(), base::NotFatalUntil::M130);
+    CHECK(it != ports_.end());
     std::move(callback).Run(
         it->second->Open(std::move(options), std::move(client)));
   }
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc
index 20b1d627..e179815e 100644
--- a/extensions/browser/api/web_request/web_request_api.cc
+++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -17,7 +17,6 @@
 #include "base/lazy_instance.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/sequenced_task_runner.h"
@@ -235,7 +234,7 @@
   }
 
   auto proxy_it = proxies_.find(proxy);
-  CHECK(proxy_it != proxies_.end(), base::NotFatalUntil::M130);
+  CHECK(proxy_it != proxies_.end());
   proxies_.erase(proxy_it);
 }
 
diff --git a/extensions/browser/api/web_request/web_request_api_helpers.cc b/extensions/browser/api/web_request/web_request_api_helpers.cc
index c35a033..d1bafed 100644
--- a/extensions/browser/api/web_request/web_request_api_helpers.cc
+++ b/extensions/browser/api/web_request/web_request_api_helpers.cc
@@ -22,7 +22,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/stl_util.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
@@ -350,8 +349,7 @@
   std::optional<std::string> existing_value = headers->GetHeader(header_name);
   if (existing_value && operation == dnr_api::HeaderOperation::kAppend) {
     const auto it = dnr::kDNRRequestHeaderAppendAllowList.find(header_name);
-    CHECK(it != dnr::kDNRRequestHeaderAppendAllowList.end(),
-          base::NotFatalUntil::M130);
+    CHECK(it != dnr::kDNRRequestHeaderAppendAllowList.end());
     return base::StrCat({*existing_value, it->second, header_value});
   }
 
diff --git a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
index ebf91361..8f02078 100644
--- a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
+++ b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
@@ -20,7 +20,6 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/sequenced_task_runner.h"
@@ -1600,7 +1599,7 @@
   }
 
   auto request_it = requests_.find(it->second);
-  CHECK(request_it != requests_.end(), base::NotFatalUntil::M130);
+  CHECK(request_it != requests_.end());
   request_it->second->OnLoaderCreated(std::move(receiver));
 }
 
@@ -1640,7 +1639,7 @@
   }
 
   auto request_it = requests_.find(it->second);
-  CHECK(request_it != requests_.end(), base::NotFatalUntil::M130);
+  CHECK(request_it != requests_.end());
   request_it->second->HandleAuthRequest(auth_info, std::move(response_headers),
                                         std::move(callback));
 }
diff --git a/extensions/browser/api/web_request/web_request_time_tracker.cc b/extensions/browser/api/web_request/web_request_time_tracker.cc
index ca13108..5ee386df 100644
--- a/extensions/browser/api/web_request/web_request_time_tracker.cc
+++ b/extensions/browser/api/web_request/web_request_time_tracker.cc
@@ -5,7 +5,6 @@
 #include "extensions/browser/api/web_request/web_request_time_tracker.h"
 
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 
 ExtensionWebRequestTimeTracker::RequestTimeLog::RequestTimeLog() = default;
@@ -34,7 +33,7 @@
     int64_t request_id,
     base::TimeTicks dispatch_time) {
   auto iter = request_time_logs_.find(request_id);
-  CHECK(iter != request_time_logs_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != request_time_logs_.end());
   iter->second.before_request_listener_dispatch_time = dispatch_time;
 }
 
@@ -55,7 +54,7 @@
     int64_t request_id,
     base::TimeTicks start_time) {
   auto iter = request_time_logs_.find(request_id);
-  CHECK(iter != request_time_logs_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != request_time_logs_.end());
   iter->second.before_request_dnr_start_time = start_time;
 }
 
@@ -63,7 +62,7 @@
     int64_t request_id,
     base::TimeTicks completion_time) {
   auto iter = request_time_logs_.find(request_id);
-  CHECK(iter != request_time_logs_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != request_time_logs_.end());
   iter->second.before_request_dnr_completion_time = completion_time;
 }
 
diff --git a/extensions/browser/app_window/app_window_geometry_cache.cc b/extensions/browser/app_window/app_window_geometry_cache.cc
index 65c6a7a..29a3697 100644
--- a/extensions/browser/app_window/app_window_geometry_cache.cc
+++ b/extensions/browser/app_window/app_window_geometry_cache.cc
@@ -11,7 +11,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/json/values_util.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/strings/string_number_conversions.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
@@ -151,7 +150,7 @@
   if (extension_data_it == cache_.end()) {
     LoadGeometryFromStorage(extension_id);
     extension_data_it = cache_.find(extension_id);
-    CHECK(extension_data_it != cache_.end(), base::NotFatalUntil::M130);
+    CHECK(extension_data_it != cache_.end());
   }
 
   auto window_data_it = extension_data_it->second.find(window_id);
diff --git a/extensions/browser/content_verifier/content_verifier.cc b/extensions/browser/content_verifier/content_verifier.cc
index 7beca29..be464b1 100644
--- a/extensions/browser/content_verifier/content_verifier.cc
+++ b/extensions/browser/content_verifier/content_verifier.cc
@@ -17,7 +17,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/threading/thread_restrictions.h"
@@ -365,7 +364,7 @@
     }
 
     auto iter = callback_infos_.find(key);
-    CHECK(iter != callback_infos_.end(), base::NotFatalUntil::M130);
+    CHECK(iter != callback_infos_.end());
     auto& callback_info = iter->second;
 
     // Force creation of computed_hashes.json if all of the following are true:
@@ -404,7 +403,7 @@
     }
 
     auto iter = callback_infos_.find(key);
-    CHECK(iter != callback_infos_.end(), base::NotFatalUntil::M130);
+    CHECK(iter != callback_infos_.end());
     auto& callback_info = iter->second;
 
     for (auto& callback : callback_info.callbacks)
diff --git a/extensions/browser/embedder_user_script_loader.cc b/extensions/browser/embedder_user_script_loader.cc
index d9ae3d1..8cc7252 100644
--- a/extensions/browser/embedder_user_script_loader.cc
+++ b/extensions/browser/embedder_user_script_loader.cc
@@ -15,7 +15,6 @@
 
 #include "base/functional/bind.h"
 #include "base/memory/ref_counted.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/thread_pool.h"
@@ -99,7 +98,7 @@
     }
 
     auto iter = script_render_info_map_.find(script->id());
-    CHECK(iter != script_render_info_map_.end(), base::NotFatalUntil::M130);
+    CHECK(iter != script_render_info_map_.end());
     int render_process_id = iter->second.render_process_id;
     int render_frame_id = iter->second.render_frame_id;
 
diff --git a/extensions/browser/extension_function.cc b/extensions/browser/extension_function.cc
index 6becb27..98771c8 100644
--- a/extensions/browser/extension_function.cc
+++ b/extensions/browser/extension_function.cc
@@ -19,7 +19,6 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/synchronization/lock.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_checker.h"
@@ -88,7 +87,7 @@
     DCHECK(thread_checker_.CalledOnValidThread());
     DCHECK(function_name);
     auto it = function_map_.find(function_name);
-    CHECK(it != function_map_.end(), base::NotFatalUntil::M130);
+    CHECK(it != function_map_.end());
     DCHECK_GE(it->second, static_cast<uint64_t>(1));
     if (it->second == 1) {
       function_map_.erase(it);
diff --git a/extensions/browser/guest_view/web_view/web_view_find_helper.cc b/extensions/browser/guest_view/web_view/web_view_find_helper.cc
index c939e61..d69b0a0 100644
--- a/extensions/browser/guest_view/web_view/web_view_find_helper.cc
+++ b/extensions/browser/guest_view/web_view/web_view_find_helper.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/memory/scoped_refptr.h"
-#include "base/not_fatal_until.h"
 #include "components/guest_view/browser/guest_view_event.h"
 #include "extensions/browser/guest_view/web_view/web_view_constants.h"
 #include "extensions/browser/guest_view/web_view/web_view_guest.h"
@@ -63,7 +62,7 @@
 
 void WebViewFindHelper::EndFindSession(int session_request_id, bool canceled) {
   auto session_iterator = find_info_map_.find(session_request_id);
-  CHECK(session_iterator != find_info_map_.end(), base::NotFatalUntil::M130);
+  CHECK(session_iterator != find_info_map_.end());
   FindInfo* find_info = session_iterator->second.get();
 
   // Call the callback function of the first request of the find session.
diff --git a/extensions/common/event_filter.cc b/extensions/common/event_filter.cc
index 0fc1a57..981f636f 100644
--- a/extensions/common/event_filter.cc
+++ b/extensions/common/event_filter.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "components/url_matcher/url_matcher_factory.h"
 #include "extensions/common/mojom/event_dispatcher.mojom.h"
@@ -82,7 +81,7 @@
 
 const std::string& EventFilter::GetEventName(MatcherID id) const {
   auto it = id_to_event_name_.find(id);
-  CHECK(it != id_to_event_name_.end(), base::NotFatalUntil::M130);
+  CHECK(it != id_to_event_name_.end());
   return it->second;
 }
 
diff --git a/extensions/renderer/bindings/api_bindings_system.cc b/extensions/renderer/bindings/api_bindings_system.cc
index 68161a4..91816387 100644
--- a/extensions/renderer/bindings/api_bindings_system.cc
+++ b/extensions/renderer/bindings/api_bindings_system.cc
@@ -8,7 +8,6 @@
 
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/values.h"
 #include "extensions/common/mojom/event_dispatcher.mojom.h"
 #include "extensions/renderer/bindings/api_binding_hooks.h"
@@ -168,8 +167,7 @@
     const std::string& property_name,
     const base::Value::List* property_values) {
   auto iter = custom_types_.find(type_name);
-  CHECK(iter != custom_types_.end(), base::NotFatalUntil::M130)
-      << "Custom type not found: " << type_name;
+  CHECK(iter != custom_types_.end()) << "Custom type not found: " << type_name;
   return iter->second.Run(isolate, property_name, property_values,
                           &request_handler_, &event_handler_,
                           &type_reference_map_, &access_checker_);
diff --git a/extensions/renderer/bindings/listener_tracker.cc b/extensions/renderer/bindings/listener_tracker.cc
index 2ea7dd3..58ae48e 100644
--- a/extensions/renderer/bindings/listener_tracker.cc
+++ b/extensions/renderer/bindings/listener_tracker.cc
@@ -5,7 +5,6 @@
 #include "extensions/renderer/bindings/listener_tracker.h"
 
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 #include "extensions/common/mojom/event_dispatcher.mojom.h"
 #include "extensions/common/value_counter.h"
 
@@ -25,7 +24,7 @@
     const std::string& event_name) {
   ListenerCountMap& listeners = unfiltered_listeners_[context_owner_id];
   auto iter = listeners.find(event_name);
-  CHECK(iter != listeners.end(), base::NotFatalUntil::M130);
+  CHECK(iter != listeners.end());
   if (--(iter->second) == 0) {
     listeners.erase(iter);
     return true;
@@ -65,7 +64,7 @@
   FilteredListeners::const_iterator counts = filtered_listeners_.find(key);
 
   bool was_last_of_kind = false;
-  CHECK(counts != filtered_listeners_.end(), base::NotFatalUntil::M130);
+  CHECK(counts != filtered_listeners_.end());
   base::Value filter_copy = base::Value(matcher->value()->Clone());
   if (counts->second->Remove(filter_copy)) {
     if (counts->second->is_empty()) {
diff --git a/extensions/renderer/native_extension_bindings_system.cc b/extensions/renderer/native_extension_bindings_system.cc
index c08b6793..9226a4c 100644
--- a/extensions/renderer/native_extension_bindings_system.cc
+++ b/extensions/renderer/native_extension_bindings_system.cc
@@ -17,7 +17,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/stringprintf.h"
 #include "base/trace_event/typed_macros.h"
 #include "base/tracing/protos/chrome_track_event.pbzero.h"
@@ -288,7 +287,7 @@
     const std::string& root_name) {
   const FeatureMap& features = api_feature_provider->GetAllFeatures();
   auto lower = features.lower_bound(root_name);
-  CHECK(lower != features.end(), base::NotFatalUntil::M130);
+  CHECK(lower != features.end());
 
   // Some bindings have a prefixed name, like app.runtime, where 'app' and
   // 'app.runtime' are, in fact, separate APIs. It's also possible for a
diff --git a/extensions/shell/browser/root_window_controller_unittest.cc b/extensions/shell/browser/root_window_controller_unittest.cc
index 4cd5d82..c3f9ee4 100644
--- a/extensions/shell/browser/root_window_controller_unittest.cc
+++ b/extensions/shell/browser/root_window_controller_unittest.cc
@@ -9,7 +9,6 @@
 #include <memory>
 
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "content/public/browser/browser_context.h"
 #include "extensions/browser/app_window/app_window.h"
 #include "extensions/browser/app_window/native_app_window.h"
@@ -53,7 +52,7 @@
     auto it =
         std::ranges::find(root_window_controllers_, root_window_controller,
                           &std::unique_ptr<RootWindowController>::get);
-    CHECK(it != root_window_controllers_.end(), base::NotFatalUntil::M130);
+    CHECK(it != root_window_controllers_.end());
     root_window_controllers_.erase(it);
   }
 
diff --git a/extensions/shell/browser/shell_desktop_controller_aura.cc b/extensions/shell/browser/shell_desktop_controller_aura.cc
index 233c3a35..f0188eb 100644
--- a/extensions/shell/browser/shell_desktop_controller_aura.cc
+++ b/extensions/shell/browser/shell_desktop_controller_aura.cc
@@ -11,7 +11,6 @@
 #include "base/check_op.h"
 #include "base/compiler_specific.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/run_loop.h"
 #include "build/chromeos_buildflags.h"
 #include "components/keep_alive_registry/keep_alive_registry.h"
@@ -234,7 +233,7 @@
   const auto it = std::ranges::find(
       root_window_controllers_, root_window_controller,
       [](const auto& candidate_pair) { return candidate_pair.second.get(); });
-  CHECK(it != root_window_controllers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != root_window_controllers_.end());
   TearDownRootWindowController(it->second.get());
   root_window_controllers_.erase(it);
 
diff --git a/fuchsia_web/runners/cast/cast_runner.cc b/fuchsia_web/runners/cast/cast_runner.cc
index cd701f6..1c72dc3 100644
--- a/fuchsia_web/runners/cast/cast_runner.cc
+++ b/fuchsia_web/runners/cast/cast_runner.cc
@@ -20,7 +20,6 @@
 #include "base/fuchsia/process_context.h"
 #include "base/functional/bind.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/process/process.h"
 #include "base/strings/strcat.h"
 #include "base/time/time.h"
@@ -462,7 +461,7 @@
 
 void CastRunner::OnIsolatedContextEmpty(WebContentRunner* context) {
   auto it = isolated_contexts_.find(context);
-  CHECK(it != isolated_contexts_.end(), base::NotFatalUntil::M130);
+  CHECK(it != isolated_contexts_.end());
   isolated_contexts_.erase(it);
 }
 
diff --git a/fuchsia_web/webengine/browser/context_impl.cc b/fuchsia_web/webengine/browser/context_impl.cc
index f781f4b..024d1c71 100644
--- a/fuchsia_web/webengine/browser/context_impl.cc
+++ b/fuchsia_web/webengine/browser/context_impl.cc
@@ -15,7 +15,6 @@
 #include "base/fuchsia/koid.h"
 #include "base/fuchsia/mem_buffer_util.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/stringprintf.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/typed_macros.h"
@@ -58,7 +57,7 @@
 
 void ContextImpl::DestroyFrame(FrameImpl* frame) {
   auto iter = frames_.find(frame);
-  CHECK(iter != frames_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != frames_.end());
   frames_.erase(iter);
 }
 
diff --git a/google_apis/drive/drive_api_requests.cc b/google_apis/drive/drive_api_requests.cc
index d120628..58b52f31 100644
--- a/google_apis/drive/drive_api_requests.cc
+++ b/google_apis/drive/drive_api_requests.cc
@@ -18,7 +18,6 @@
 #include "base/location.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
@@ -1161,7 +1160,7 @@
                                                 ApiErrorCode result) {
   DCHECK(CalledOnValidThread());
   auto const child = GetChildEntry(request_id);
-  CHECK(child != child_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(child != child_requests_.end());
   if (IsSuccessfulDriveApiErrorCode(result)) {
     (*child)->prepared = true;
   } else {
diff --git a/gpu/command_buffer/client/client_discardable_texture_manager.cc b/gpu/command_buffer/client/client_discardable_texture_manager.cc
index 65993d6..06e7c16 100644
--- a/gpu/command_buffer/client/client_discardable_texture_manager.cc
+++ b/gpu/command_buffer/client/client_discardable_texture_manager.cc
@@ -5,7 +5,6 @@
 #include "gpu/command_buffer/client/client_discardable_texture_manager.h"
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 
 namespace gpu {
 
@@ -58,7 +57,7 @@
     bool* should_unbind_texture) {
   base::AutoLock hold(lock_);
   auto found = texture_entries_.find(texture_id);
-  CHECK(found != texture_entries_.end(), base::NotFatalUntil::M130);
+  CHECK(found != texture_entries_.end());
   TextureEntry& entry = found->second;
   DCHECK_GT(entry.client_lock_count, 0u);
   --entry.client_lock_count;
diff --git a/gpu/command_buffer/client/client_font_manager.cc b/gpu/command_buffer/client/client_font_manager.cc
index f679cc3..11cab49 100644
--- a/gpu/command_buffer/client/client_font_manager.cc
+++ b/gpu/command_buffer/client/client_font_manager.cc
@@ -15,7 +15,6 @@
 #include "base/bits.h"
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 
 namespace gpu {
 namespace raster {
@@ -167,7 +166,7 @@
   for (SkDiscardableHandleId handle_id = last_serialized_handle_id_ + 1;
        handle_id <= last_allocated_handle_id_; handle_id++) {
     auto it = discardable_handle_map_.find(handle_id);
-    CHECK(it != discardable_handle_map_.end(), base::NotFatalUntil::M130);
+    CHECK(it != discardable_handle_map_.end());
 
     // We must have a valid |client_handle| here since all new handles are
     // currently in locked state.
diff --git a/gpu/command_buffer/client/fenced_allocator.cc b/gpu/command_buffer/client/fenced_allocator.cc
index 715b0cfe..9dc999e 100644
--- a/gpu/command_buffer/client/fenced_allocator.cc
+++ b/gpu/command_buffer/client/fenced_allocator.cc
@@ -10,7 +10,6 @@
 
 #include <algorithm>
 
-#include "base/not_fatal_until.h"
 #include "base/numerics/clamped_math.h"
 #include "gpu/command_buffer/client/cmd_buffer_helper.h"
 
@@ -261,7 +260,7 @@
   Block templ = { IN_USE, offset, 0, kUnusedToken };
   Container::iterator it = std::lower_bound(blocks_.begin(), blocks_.end(),
                                             templ, OffsetCmp());
-  CHECK(it != blocks_.end(), base::NotFatalUntil::M130);
+  CHECK(it != blocks_.end());
   return it-blocks_.begin();
 }
 
diff --git a/gpu/command_buffer/service/framebuffer_manager.cc b/gpu/command_buffer/service/framebuffer_manager.cc
index d2c9a98..0f33d75 100644
--- a/gpu/command_buffer/service/framebuffer_manager.cc
+++ b/gpu/command_buffer/service/framebuffer_manager.cc
@@ -15,7 +15,6 @@
 #include "base/check_op.h"
 #include "base/containers/contains.h"
 #include "base/containers/heap_array.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
 #include "gpu/command_buffer/service/framebuffer_completeness_cache.h"
@@ -1113,7 +1112,7 @@
   // all of the attachments have the same dimensions. So it's okay to just pick
   // any arbitrary attachment and return it as the min size.
   auto it = attachments_.begin();
-  CHECK(it != attachments_.end(), base::NotFatalUntil::M130);
+  CHECK(it != attachments_.end());
   const auto& attachment = it->second;
   return gfx::Size(attachment->width(), attachment->height());
 }
diff --git a/gpu/command_buffer/service/gles2_external_framebuffer.cc b/gpu/command_buffer/service/gles2_external_framebuffer.cc
index ddfe4742..85a7b84 100644
--- a/gpu/command_buffer/service/gles2_external_framebuffer.cc
+++ b/gpu/command_buffer/service/gles2_external_framebuffer.cc
@@ -5,7 +5,6 @@
 
 #include "gpu/command_buffer/service/gles2_external_framebuffer.h"
 
-#include "base/not_fatal_until.h"
 #include "gpu/command_buffer/service/feature_info.h"
 #include "gpu/command_buffer/service/shared_image/shared_image_factory.h"
 #include "gpu/command_buffer/service/shared_image/shared_image_representation.h"
@@ -574,7 +573,7 @@
 GLenum GLES2ExternalFramebuffer::GetColorFormat() const {
   DCHECK(IsSharedImageAttached());
   auto it = attachments_.find(GL_COLOR_ATTACHMENT0);
-  CHECK(it != attachments_.end(), base::NotFatalUntil::M130);
+  CHECK(it != attachments_.end());
   return it->second->format();
 }
 
@@ -612,14 +611,14 @@
 int GLES2ExternalFramebuffer::GetSamplesCount() const {
   DCHECK(IsSharedImageAttached());
   auto it = attachments_.find(GL_COLOR_ATTACHMENT0);
-  CHECK(it != attachments_.end(), base::NotFatalUntil::M130);
+  CHECK(it != attachments_.end());
   return it->second->samples_count();
 }
 
 bool GLES2ExternalFramebuffer::HasAlpha() const {
   DCHECK(IsSharedImageAttached());
   auto it = attachments_.find(GL_COLOR_ATTACHMENT0);
-  CHECK(it != attachments_.end(), base::NotFatalUntil::M130);
+  CHECK(it != attachments_.end());
   return it->second->format() == GL_RGBA8;
 }
 
diff --git a/gpu/command_buffer/service/image_reader_gl_owner.cc b/gpu/command_buffer/service/image_reader_gl_owner.cc
index baa7aea..cf9ff01 100644
--- a/gpu/command_buffer/service/image_reader_gl_owner.cc
+++ b/gpu/command_buffer/service/image_reader_gl_owner.cc
@@ -18,7 +18,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/waitable_event.h"
@@ -437,7 +436,7 @@
   AssertAcquiredDrDcLock();
 
   auto it = image_refs_.find(image);
-  CHECK(it != image_refs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != image_refs_.end());
 
   auto& image_ref = it->second;
   DCHECK_GT(image_ref.count, 0u);
diff --git a/gpu/command_buffer/service/passthrough_discardable_manager.cc b/gpu/command_buffer/service/passthrough_discardable_manager.cc
index 581e51a9..a3af5cf2 100644
--- a/gpu/command_buffer/service/passthrough_discardable_manager.cc
+++ b/gpu/command_buffer/service/passthrough_discardable_manager.cc
@@ -6,7 +6,6 @@
 
 #include <inttypes.h>
 
-#include "base/not_fatal_until.h"
 #include "base/strings/stringprintf.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "gpu/command_buffer/service/context_group.h"
@@ -226,7 +225,7 @@
     uint32_t client_id,
     const gles2::ContextGroup* context_group) const {
   auto iter = cache_.Peek({client_id, context_group});
-  CHECK(iter != cache_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != cache_.end());
   return iter->second.unlocked_texture == nullptr;
 }
 
@@ -241,7 +240,7 @@
     uint32_t client_id,
     const gles2::ContextGroup* context_group) const {
   auto iter = cache_.Peek({client_id, context_group});
-  CHECK(iter != cache_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != cache_.end());
   return iter->second.unlocked_texture;
 }
 
diff --git a/gpu/command_buffer/service/query_manager.cc b/gpu/command_buffer/service/query_manager.cc
index 6a7a120..4ac581b 100644
--- a/gpu/command_buffer/service/query_manager.cc
+++ b/gpu/command_buffer/service/query_manager.cc
@@ -15,7 +15,6 @@
 #include "base/atomicops.h"
 #include "base/check_op.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/time/time.h"
 #include "ui/gl/gl_bindings.h"
@@ -515,7 +514,7 @@
 
   // Remove from active query map if it is active.
   ActiveQueryMap::iterator active_it = active_queries_.find(query->target());
-  CHECK(active_it != active_queries_.end(), base::NotFatalUntil::M130);
+  CHECK(active_it != active_queries_.end());
   DCHECK(query == active_it->second.get());
   active_queries_.erase(active_it);
 
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc b/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc
index 81a7a991..621bed47 100644
--- a/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc
@@ -14,7 +14,6 @@
 
 #include "base/bits.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "components/viz/common/resources/resource_sizes.h"
 #include "components/viz/common/resources/shared_image_format_utils.h"
@@ -208,7 +207,7 @@
     VkFormat vk_format = ToVkFormat(format, plane);
 
     auto it = image_usage_cache.find(vk_format);
-    CHECK(it != image_usage_cache.end(), base::NotFatalUntil::M130);
+    CHECK(it != image_usage_cache.end());
     auto vk_tiling_usage = it->second;
 
     // Requested usage flags must be supported.
diff --git a/gpu/command_buffer/service/shared_image/ozone_image_backing.cc b/gpu/command_buffer/service/shared_image/ozone_image_backing.cc
index 30b6d342..c3a85be 100644
--- a/gpu/command_buffer/service/shared_image/ozone_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/ozone_image_backing.cc
@@ -13,7 +13,6 @@
 #include "base/debug/crash_logging.h"
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/checked_math.h"
 #include "build/build_config.h"
 #include "components/viz/common/gpu/vulkan_context_provider.h"
@@ -760,8 +759,7 @@
 void OzoneImageBacking::OnGLContextLostOrDestroy(gl::GLContext* context,
                                                  bool mark_context_lost) {
   auto it = per_context_cached_textures_holders_.find(context);
-  CHECK(it != per_context_cached_textures_holders_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(it != per_context_cached_textures_holders_.end());
 
   // Given the TextureHolder can be used by N contexts (the contexts are
   // compatible with the original one that was used to create the holder), the
diff --git a/gpu/command_buffer/service/shared_image/shared_image_backing.cc b/gpu/command_buffer/service/shared_image/shared_image_backing.cc
index fecd98a..5abd9ca8 100644
--- a/gpu/command_buffer/service/shared_image/shared_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/shared_image_backing.cc
@@ -6,7 +6,6 @@
 
 #include <algorithm>
 
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/trace_event/process_memory_dump.h"
 #include "build/build_config.h"
@@ -345,7 +344,7 @@
   DCHECK(is_ref_counted_);
 
   auto found = std::ranges::find(refs_, representation);
-  CHECK(found != refs_.end(), base::NotFatalUntil::M130);
+  CHECK(found != refs_.end());
 
   // If the found representation is the first (owning) ref, free the attributed
   // memory.
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc
index 0e9a197ff..9176e75 100644
--- a/gpu/command_buffer/service/webgpu_decoder_impl.cc
+++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -22,7 +22,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/raw_ref.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/checked_math.h"
 #include "base/power_monitor/power_monitor.h"
@@ -2254,7 +2253,7 @@
 
   std::unique_ptr<SharedImageRepresentationAndAccess> representation_and_access;
   auto it = known_device_metadata_.find(device);
-  CHECK(it != known_device_metadata_.end(), base::NotFatalUntil::M130);
+  CHECK(it != known_device_metadata_.end());
   if (it->second.adapterType == wgpu::AdapterType::CPU) {
     representation_and_access = AssociateMailboxUsingSkiaFallback(
         mailbox, flags, device, usage, internal_usage, std::move(view_formats));
diff --git a/gpu/config/gpu_control_list.cc b/gpu/config/gpu_control_list.cc
index e78b8183..f1ecb293 100644
--- a/gpu/config/gpu_control_list.cc
+++ b/gpu/config/gpu_control_list.cc
@@ -8,7 +8,6 @@
 
 #include "base/json/values_util.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_number_conversions.h"
@@ -665,7 +664,7 @@
   base::Value::List feature_names;
   for (auto feature : features) {
     auto iter = feature_map.find(feature);
-    CHECK(iter != feature_map.end(), base::NotFatalUntil::M130);
+    CHECK(iter != feature_map.end());
     feature_names.Append(iter->second);
   }
   for (auto* const extension : disabled_extensions) {
diff --git a/gpu/ipc/host/gpu_disk_cache.cc b/gpu/ipc/host/gpu_disk_cache.cc
index a92646b..cc2d1a3c 100644
--- a/gpu/ipc/host/gpu_disk_cache.cc
+++ b/gpu/ipc/host/gpu_disk_cache.cc
@@ -8,7 +8,6 @@
 #include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/ref_counted.h"
-#include "base/not_fatal_until.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -499,7 +498,7 @@
 void GpuDiskCacheFactory::ReleaseCacheHandle(GpuDiskCache* cache) {
   // Get the handle related to the cache via the path.
   auto it = path_to_handle_map_.find(cache->cache_path_);
-  CHECK(it != path_to_handle_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != path_to_handle_map_.end());
   const base::FilePath& path = it->first;
   const GpuDiskCacheHandle& handle = it->second;
 
diff --git a/gpu/vulkan/tests/native_window.cc b/gpu/vulkan/tests/native_window.cc
index 6d23fe0..f2c7101 100644
--- a/gpu/vulkan/tests/native_window.cc
+++ b/gpu/vulkan/tests/native_window.cc
@@ -5,7 +5,6 @@
 #include "gpu/vulkan/tests/native_window.h"
 
 #include "base/containers/flat_map.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "ui/platform_window/platform_window_delegate.h"
 #include "ui/platform_window/platform_window_init_properties.h"
@@ -75,7 +74,7 @@
 
 void DestroyNativeWindow(gfx::AcceleratedWidget window) {
   auto it = g_windows_.find(window);
-  CHECK(it != g_windows_.end(), base::NotFatalUntil::M130);
+  CHECK(it != g_windows_.end());
   g_windows_.erase(it);
 }
 
diff --git a/gpu/vulkan/tests/native_window_win.cc b/gpu/vulkan/tests/native_window_win.cc
index 83c5890..f95b6de 100644
--- a/gpu/vulkan/tests/native_window_win.cc
+++ b/gpu/vulkan/tests/native_window_win.cc
@@ -9,7 +9,6 @@
 #include <memory>
 
 #include "base/containers/flat_map.h"
-#include "base/not_fatal_until.h"
 #include "ui/gfx/win/window_impl.h"
 
 namespace gpu {
@@ -45,7 +44,7 @@
 
 void DestroyNativeWindow(gfx::AcceleratedWidget window) {
   auto it = g_windows_.find(window);
-  CHECK(it != g_windows_.end(), base::NotFatalUntil::M130);
+  CHECK(it != g_windows_.end());
 
   it->second.reset();
   g_windows_.erase(it);
diff --git a/headless/lib/browser/headless_devtools_manager_delegate.cc b/headless/lib/browser/headless_devtools_manager_delegate.cc
index 7cef3f6..6e1a773 100644
--- a/headless/lib/browser/headless_devtools_manager_delegate.cc
+++ b/headless/lib/browser/headless_devtools_manager_delegate.cc
@@ -5,7 +5,6 @@
 #include "headless/lib/browser/headless_devtools_manager_delegate.h"
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/devtools_agent_host_client_channel.h"
@@ -29,7 +28,7 @@
     base::span<const uint8_t> message,
     NotHandledCallback callback) {
   auto it = sessions_.find(channel);
-  CHECK(it != sessions_.end(), base::NotFatalUntil::M130);
+  CHECK(it != sessions_.end());
   it->second->HandleCommand(message, std::move(callback));
 }
 
diff --git a/infra/config/OWNERS b/infra/config/OWNERS
index e65b80b3..91deb6f 100644
--- a/infra/config/OWNERS
+++ b/infra/config/OWNERS
@@ -43,3 +43,6 @@
 per-file generated/...=chrome-branch-day@chops-service-accounts.iam.gserviceaccount.com
 per-file milestones.json=chrome-branch-day@chops-service-accounts.iam.gserviceaccount.com
 per-file settings.json=chrome-branch-day@chops-service-accounts.iam.gserviceaccount.com
+
+# Chromium Bedrock
+per-file subprojects/chromium/ci/chromium.bedrock.star=tluk@chromium.org
diff --git a/infra/config/generated/builder-owners/webui-everywhere@google.com.txt b/infra/config/generated/builder-owners/webui-everywhere@google.com.txt
new file mode 100644
index 0000000..7f10f07
--- /dev/null
+++ b/infra/config/generated/builder-owners/webui-everywhere@google.com.txt
@@ -0,0 +1 @@
+ci/linux-bedrock-browser-metrics
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/linux-bedrock-browser-metrics/gn-args.json b/infra/config/generated/builders/ci/linux-bedrock-browser-metrics/gn-args.json
new file mode 100644
index 0000000..6ef260e5
--- /dev/null
+++ b/infra/config/generated/builders/ci/linux-bedrock-browser-metrics/gn-args.json
@@ -0,0 +1,6 @@
+{
+  "gn_args": {
+    "target_cpu": "x64",
+    "target_os": "linux"
+  }
+}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/linux-bedrock-browser-metrics/properties.json b/infra/config/generated/builders/ci/linux-bedrock-browser-metrics/properties.json
new file mode 100644
index 0000000..b1d3def
--- /dev/null
+++ b/infra/config/generated/builders/ci/linux-bedrock-browser-metrics/properties.json
@@ -0,0 +1,47 @@
+{
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "additional_exclusions": [
+        "infra/config/generated/builders/ci/linux-bedrock-browser-metrics/gn-args.json"
+      ],
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "linux-bedrock-browser-metrics",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "builder_group": "chromium.bedrock",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "config": "chromium",
+                "target_platform": "linux"
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "linux-bedrock-browser-metrics",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
+  "$recipe_engine/resultdb/test_presentation": {
+    "column_keys": [],
+    "grouping_keys": [
+      "status",
+      "v.test_suite"
+    ]
+  },
+  "builder_group": "chromium.bedrock",
+  "recipe": "chromium_bedrock/browser_metrics"
+}
\ 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 0ba4da6..7ead75f1 100644
--- a/infra/config/generated/builders/gn_args_locations.json
+++ b/infra/config/generated/builders/gn_args_locations.json
@@ -101,6 +101,9 @@
     "win-angle-chromium-x64-builder": "ci/win-angle-chromium-x64-builder/gn-args.json",
     "win-angle-chromium-x86-builder": "ci/win-angle-chromium-x86-builder/gn-args.json"
   },
+  "chromium.bedrock": {
+    "linux-bedrock-browser-metrics": "ci/linux-bedrock-browser-metrics/gn-args.json"
+  },
   "chromium.build": {
     "android-build-perf-developer": "build/android-build-perf-developer/gn-args.json",
     "android-build-perf-ninja": "build/android-build-perf-ninja/gn-args.json",
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index a68a4b5..74c4827 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -53857,6 +53857,113 @@
       }
     }
     builders {
+      name: "linux-bedrock-browser-metrics"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builderless:1"
+      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/linux-bedrock-browser-metrics/properties.json",'
+        '    "top_level_project": {'
+        '      "ref": "refs/heads/main",'
+        '      "repo": {'
+        '        "host": "chromium.googlesource.com",'
+        '        "project": "chromium/src"'
+        '      }'
+        '    }'
+        '  },'
+        '  "builder_group": "chromium.bedrock",'
+        '  "led_builder_is_bootstrapped": true,'
+        '  "recipe": "chromium_bedrock/browser_metrics"'
+        '}'
+      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: "This builder collects browser metrics for project bedrock.<br/>Builder owner: <a href=mailto:webui-everywhere@google.com>webui-everywhere@google.com</a>"
+      shadow_builder_adjustments {
+        pool: "luci.chromium.try"
+        dimensions: "free_space:"
+        dimensions: "pool:luci.chromium.try"
+      }
+      contact_team_email: "webui-everywhere@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: "linux-bfcache-rel"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index b2c2f2d..69425608 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -10797,6 +10797,364 @@
   }
 }
 consoles {
+  id: "chromium.bedrock"
+  name: "chromium.bedrock"
+  repo_url: "https://chromium.googlesource.com/chromium/src"
+  refs: "regexp:refs/heads/main"
+  manifest_name: "REVISION"
+  builders {
+    name: "buildbucket/luci.chromium.ci/linux-bedrock-browser-metrics"
+    category: "bedrock"
+  }
+  header {
+    oncalls {
+      name: "Chromium"
+      url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-build-sheriff"
+    }
+    oncalls {
+      name: "Android"
+      url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-android-sheriff"
+    }
+    oncalls {
+      name: "iOS"
+      url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-ios"
+    }
+    oncalls {
+      name: "ChromeOS"
+      url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chromeos-gardeners"
+    }
+    oncalls {
+      name: "Fuchsia"
+      url: "https://chrome-ops-rotation-proxy.appspot.com/current/grotation:chrome-fuchsia-engprod"
+    }
+    oncalls {
+      name: "GPU"
+      url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-gpu-pixel-wrangler-weekly"
+    }
+    oncalls {
+      name: "ANGLE"
+      url: "https://chrome-ops-rotation-proxy.appspot.com/current/grotation:angle-wrangler"
+    }
+    oncalls {
+      name: "Trooper"
+      url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-ops-client-infra"
+      show_primary_secondary_labels: true
+    }
+    links {
+      name: "Builds"
+      links {
+        text: "continuous"
+        url: "https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html"
+        alt: "Continuous browser snapshots"
+      }
+      links {
+        text: "symbols"
+        url: "https://www.chromium.org/developers/how-tos/debugging-on-windows"
+        alt: "Windows Symbols"
+      }
+      links {
+        text: "status"
+        url: "https://chromium-status.appspot.com/"
+        alt: "Current tree status"
+      }
+    }
+    links {
+      name: "Dashboards"
+      links {
+        text: "perf"
+        url: "https://chromeperf.appspot.com/"
+        alt: "Chrome perf dashboard"
+      }
+      links {
+        text: "LUCI Analysis"
+        url: "https://luci-analysis.appspot.com"
+        alt: "New flake portal"
+      }
+    }
+    links {
+      name: "Chromium"
+      links {
+        text: "source"
+        url: "https://chromium.googlesource.com/chromium/src"
+        alt: "Chromium source code repository"
+      }
+      links {
+        text: "reviews"
+        url: "https://chromium-review.googlesource.com"
+        alt: "Chromium code review tool"
+      }
+      links {
+        text: "bugs"
+        url: "https://crbug.com"
+        alt: "Chromium bug tracker"
+      }
+      links {
+        text: "coverage"
+        url: "https://analysis.chromium.org/coverage/p/chromium"
+        alt: "Chromium code coverage dashboard"
+      }
+      links {
+        text: "dev"
+        url: "https://dev.chromium.org/Home"
+        alt: "Chromium developer home page"
+      }
+      links {
+        text: "support"
+        url: "https://support.google.com/chrome/#topic=7438008"
+        alt: "Google Chrome help center"
+      }
+    }
+    links {
+      name: "Consoles"
+      links {
+        text: "android"
+        url: "/p/chromium/g/chromium.android"
+        alt: "Chromium Android console"
+      }
+      links {
+        text: "android.desktop"
+        url: "/p/chromium/g/chromium.android.desktop"
+        alt: "Chromium Android Desktop console"
+      }
+      links {
+        text: "angle"
+        url: "/p/chromium/g/chromium.angle"
+        alt: "Chromium ANGLE console"
+      }
+      links {
+        text: "blink.infra"
+        url: "/p/chromium/g/blink.infra"
+        alt: "Chromium Blink Infra console"
+      }
+      links {
+        text: "checks"
+        url: "/p/chromium/g/checks"
+        alt: "Checks console"
+      }
+      links {
+        text: "chromium"
+        url: "/p/chromium/g/chromium"
+        alt: "Main Chromium archive console"
+      }
+      links {
+        text: "chromiumos"
+        url: "/p/chromium/g/chromium.chromiumos"
+        alt: "ChromiumOS console"
+      }
+      links {
+        text: "clang"
+        url: "/p/chromium/g/chromium.clang"
+        alt: "Chromium Clang console"
+      }
+      links {
+        text: "dawn"
+        url: "/p/chromium/g/chromium.dawn"
+        alt: "Chromium Dawn console"
+      }
+      links {
+        text: "enterprise companion"
+        url: "/p/chromium/g/chromium.enterprise_companion"
+        alt: "Chromium Enterprise Companion App console"
+      }
+      links {
+        text: "flakiness"
+        url: "/p/chromium/g/chromium.flakiness"
+        alt: "Chromium Flakiness console"
+      }
+      links {
+        text: "fuchsia"
+        url: "/p/chromium/g/chromium.fuchsia"
+        alt: "Chromium Fuchsia console"
+      }
+      links {
+        text: "fuzz"
+        url: "/p/chromium/g/chromium.fuzz"
+        alt: "Chromium Fuzz console"
+      }
+      links {
+        text: "fyi"
+        url: "/p/chromium/g/chromium.fyi"
+        alt: "Chromium FYI console"
+      }
+      links {
+        text: "gpu"
+        url: "/p/chromium/g/chromium.gpu"
+        alt: "Chromium GPU console"
+      }
+      links {
+        text: "infra"
+        url: "/p/chromium/g/chromium.infra"
+        alt: "Chromium Infra console"
+      }
+      links {
+        text: "linux"
+        url: "/p/chromium/g/chromium.linux"
+        alt: "Chromium Linux console"
+      }
+      links {
+        text: "mac"
+        url: "/p/chromium/g/chromium.mac"
+        alt: "Chromium Mac console"
+      }
+      links {
+        text: "memory.fyi"
+        url: "/p/chromium/g/chromium.memory.fyi"
+        alt: "Chromium Memory FYI console"
+      }
+      links {
+        text: "perf"
+        url: "/p/chrome/g/chrome.perf/console"
+        alt: "Chromium Perf console"
+      }
+      links {
+        text: "perf.fyi"
+        url: "/p/chrome/g/chrome.perf.fyi/console"
+        alt: "Chromium Perf FYI console"
+      }
+      links {
+        text: "swangle"
+        url: "/p/chromium/g/chromium.swangle"
+        alt: "Chromium SWANGLE console"
+      }
+      links {
+        text: "updater"
+        url: "/p/chromium/g/chromium.updater"
+        alt: "Chromium Updater console"
+      }
+      links {
+        text: "webrtc"
+        url: "/p/chromium/g/chromium.webrtc"
+        alt: "Chromium WebRTC console"
+      }
+      links {
+        text: "win"
+        url: "/p/chromium/g/chromium.win"
+        alt: "Chromium Windows console"
+      }
+    }
+    links {
+      name: "Branch Consoles"
+      links {
+        text: "m132"
+        url: "/p/chromium-m132/g/main/console"
+      }
+      links {
+        text: "m136"
+        url: "/p/chromium-m136/g/main/console"
+      }
+      links {
+        text: "m137"
+        url: "/p/chromium-m137/g/main/console"
+      }
+      links {
+        text: "trunk"
+        url: "/p/chromium/g/main/console"
+        alt: "Trunk (ToT) console"
+      }
+    }
+    links {
+      name: "Tryservers"
+      links {
+        text: "android"
+        url: "/p/chromium/g/tryserver.chromium.android/builders"
+        alt: "Android"
+      }
+      links {
+        text: "angle"
+        url: "/p/chromium/g/tryserver.chromium.angle/builders"
+        alt: "Angle"
+      }
+      links {
+        text: "blink"
+        url: "/p/chromium/g/tryserver.blink/builders"
+        alt: "Blink"
+      }
+      links {
+        text: "chrome"
+        url: "/p/chrome/g/tryserver.chrome/builders"
+        alt: "Chrome"
+      }
+      links {
+        text: "chromiumos"
+        url: "/p/chromium/g/tryserver.chromium.chromiumos/builders"
+        alt: "ChromiumOS"
+      }
+      links {
+        text: "fuchsia"
+        url: "/p/chromium/g/tryserver.chromium.fuchsia/builders"
+        alt: "Fuchsia"
+      }
+      links {
+        text: "fuzz"
+        url: "/p/chromium/g/tryserver.chromium.fuzz/builders"
+        alt: "Fuzz"
+      }
+      links {
+        text: "linux"
+        url: "/p/chromium/g/tryserver.chromium.linux/builders"
+        alt: "Linux"
+      }
+      links {
+        text: "mac"
+        url: "/p/chromium/g/tryserver.chromium.mac/builders"
+        alt: "Mac"
+      }
+      links {
+        text: "swangle"
+        url: "/p/chromium/g/tryserver.chromium.swangle/builders"
+        alt: "SWANGLE"
+      }
+      links {
+        text: "tricium"
+        url: "/p/chromium/g/tryserver.chromium.tricium/builders"
+        alt: "Tricium"
+      }
+      links {
+        text: "win"
+        url: "/p/chromium/g/tryserver.chromium.win/builders"
+        alt: "Win"
+      }
+    }
+    links {
+      name: "Navigate"
+      links {
+        text: "about"
+        url: "http://dev.chromium.org/developers/testing/chromium-build-infrastructure/tour-of-the-chromium-buildbot"
+        alt: "Tour of the console"
+      }
+      links {
+        text: "customize"
+        url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci/luci-milo.cfg"
+        alt: "Customize this console"
+      }
+    }
+    console_groups {
+      title {
+        text: "Tree Closers"
+        url: "https://chromium-status.appspot.com/"
+      }
+      console_ids: "chromium/chromium tree closers"
+      console_ids: "chromium/android tree closers"
+      console_ids: "chromium/chromiumos tree closers"
+      console_ids: "chromium/chromium.gpu tree closers"
+      console_ids: "chromium/ios tree closers"
+    }
+    console_groups {
+      console_ids: "chromium/chromium rotation"
+      console_ids: "chromium/android rotation"
+      console_ids: "chromium/cft rotation"
+      console_ids: "chrome/chrome.perf"
+      console_ids: "chromium/chromium.gpu rotation"
+      console_ids: "chromium/angle rotation"
+      console_ids: "chromium/dawn rotation"
+      console_ids: "chromium/fuchsia rotation"
+      console_ids: "chromium/ios rotation"
+    }
+    tree_status_host: "chromium-status.appspot.com"
+    tree_name: "chromium"
+  }
+}
+consoles {
   id: "chromium.build"
   name: "chromium.build"
   repo_url: "https://chromium.googlesource.com/chromium/src"
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg
index 7f9732f..46a0049 100644
--- a/infra/config/generated/luci/luci-scheduler.cfg
+++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -4733,6 +4733,16 @@
   }
 }
 job {
+  id: "linux-bedrock-browser-metrics"
+  realm: "ci"
+  schedule: "0 0 1 1 *"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "linux-bedrock-browser-metrics"
+  }
+}
+job {
   id: "linux-bfcache-rel"
   realm: "ci"
   buildbucket {
@@ -6877,6 +6887,7 @@
   triggers: "linux-angle-chromium-builder"
   triggers: "linux-annotator-rel"
   triggers: "linux-archive-rel"
+  triggers: "linux-bedrock-browser-metrics"
   triggers: "linux-bfcache-rel"
   triggers: "linux-blink-asan-rel"
   triggers: "linux-blink-heap-verification"
diff --git a/infra/config/generated/testing/mixins.pyl b/infra/config/generated/testing/mixins.pyl
index 2b7f394..ce3381cd 100644
--- a/infra/config/generated/testing/mixins.pyl
+++ b/infra/config/generated/testing/mixins.pyl
@@ -771,9 +771,9 @@
       'shards': 30,
     },
   },
-  'skylab-shards-50': {
+  'skylab-shards-45': {
     'skylab': {
-      'shards': 50,
+      'shards': 45,
     },
   },
   'swarming_containment_auto': {
diff --git a/infra/config/generated/testing/test_suites.pyl b/infra/config/generated/testing/test_suites.pyl
index 2885db7..7e46bcbf 100644
--- a/infra/config/generated/testing/test_suites.pyl
+++ b/infra/config/generated/testing/test_suites.pyl
@@ -2388,7 +2388,7 @@
     'chromeos_ctp_preuprev_tests_slow_boards': {
       'chromeos_chrome_all_tast_tests': {
         'mixins': [
-          'skylab-shards-50',
+          'skylab-shards-45',
         ],
         'variants': [
           'CROS_RELEASE_LKGM',
diff --git a/infra/config/recipes.star b/infra/config/recipes.star
index 1550ec1..8b257f8 100644
--- a/infra/config/recipes.star
+++ b/infra/config/recipes.star
@@ -144,6 +144,11 @@
 )
 
 build_recipe(
+    name = "recipe:chromium_bedrock/browser_metrics",
+    bootstrappable = True,
+)
+
+build_recipe(
     name = "recipe:celab",
 )
 
diff --git a/infra/config/subprojects/build/subproject.star b/infra/config/subprojects/build/subproject.star
index 4fa7c420..d7a548f 100644
--- a/infra/config/subprojects/build/subproject.star
+++ b/infra/config/subprojects/build/subproject.star
@@ -12,5 +12,5 @@
     ],
 )
 
-exec("./build.star")
 exec("./build.fyi.star")
+exec("./build.star")
diff --git a/infra/config/subprojects/chromium/ci.star b/infra/config/subprojects/chromium/ci.star
index b6d1c0f..b643d7c 100644
--- a/infra/config/subprojects/chromium/ci.star
+++ b/infra/config/subprojects/chromium/ci.star
@@ -225,6 +225,7 @@
 exec("./ci/chromium.android.desktop.star")
 exec("./ci/chromium.android.desktop.fyi.star")
 exec("./ci/chromium.angle.star")
+exec("./ci/chromium.bedrock.star")
 exec("./ci/chromium.cft.star")
 exec("./ci/chromium.chromiumos.star")
 exec("./ci/chromium.clang.star")
diff --git a/infra/config/subprojects/chromium/ci/chromium.bedrock.star b/infra/config/subprojects/chromium/ci/chromium.bedrock.star
new file mode 100644
index 0000000..38de787
--- /dev/null
+++ b/infra/config/subprojects/chromium/ci/chromium.bedrock.star
@@ -0,0 +1,49 @@
+# 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.
+"""Definitions of builders in chromium.bedrock builder group."""
+
+load("//lib/builder_config.star", "builder_config")
+load("//lib/builders.star", "os")
+load("//lib/ci.star", "ci")
+load("//lib/consoles.star", "consoles")
+load("//lib/gn_args.star", "gn_args")
+
+ci.defaults.set(
+    builder_group = "chromium.bedrock",
+    pool = ci.DEFAULT_POOL,
+    builderless = True,
+    service_account = ci.DEFAULT_SERVICE_ACCOUNT,
+)
+
+consoles.console_view(
+    name = "chromium.bedrock",
+)
+
+ci.builder(
+    name = "linux-bedrock-browser-metrics",
+    description_html = "This builder collects browser metrics for project bedrock.",
+    executable = "recipe:chromium_bedrock/browser_metrics",
+    # TODO: jwata - trigger builds routinely once works fine.
+    schedule = "0 0 1 1 *",
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            target_platform = builder_config.target_platform.LINUX,
+        ),
+    ),
+    gn_args = gn_args.config(
+        configs = [
+            "linux",
+            "x64",
+        ],
+    ),
+    os = os.LINUX_DEFAULT,
+    console_view_entry = consoles.console_view_entry(
+        category = "bedrock",
+    ),
+    contact_team_email = "webui-everywhere@google.com",
+)
diff --git a/infra/config/targets/matrix_compound_suites.star b/infra/config/targets/matrix_compound_suites.star
index 08ad7b84..1b70bfc6 100644
--- a/infra/config/targets/matrix_compound_suites.star
+++ b/infra/config/targets/matrix_compound_suites.star
@@ -294,7 +294,7 @@
         "chromeos_chrome_all_tast_tests": targets.legacy_matrix_config(
             mixins = [
                 # jacuzzi is slow. So that we use more number of shards.
-                "skylab-shards-50",
+                "skylab-shards-45",
             ],
             variants = [
                 "CROS_RELEASE_LKGM",
diff --git a/infra/config/targets/mixins.star b/infra/config/targets/mixins.star
index fd4ddfe..edcf039 100644
--- a/infra/config/targets/mixins.star
+++ b/infra/config/targets/mixins.star
@@ -505,9 +505,9 @@
 )
 
 targets.mixin(
-    name = "skylab-shards-50",
+    name = "skylab-shards-45",
     skylab = targets.skylab(
-        shards = 50,
+        shards = 45,
     ),
 )
 
diff --git a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_view_controller.mm b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_view_controller.mm
index a075dc3..4e67337 100644
--- a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_view_controller.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_view_controller.mm
@@ -676,7 +676,7 @@
 }
 
 - (void)switchingStarted {
-  CHECK(_selectedIndexPath, base::NotFatalUntil::M135);
+  CHECK(_selectedIndexPath);
   TableViewAccountCell* cell =
       base::apple::ObjCCastStrict<TableViewAccountCell>(
           [self.tableView cellForRowAtIndexPath:_selectedIndexPath]);
@@ -714,7 +714,7 @@
 }
 
 - (void)updateErrorSection:(AccountErrorUIInfo*)error {
-  CHECK(!_selectedIndexPath, base::NotFatalUntil::M135);
+  CHECK(!_selectedIndexPath);
   NSDiffableDataSourceSnapshot* snapshot = _accountMenuDataSource.snapshot;
   if (error == nil) {
     // The error disappeared.
@@ -742,7 +742,7 @@
 - (void)updateAccountListWithGaiaIDsToAdd:(NSArray<NSString*>*)gaiaIDsToAdd
                           gaiaIDsToRemove:(NSArray<NSString*>*)gaiaIDsToRemove
                             gaiaIDsToKeep:(NSArray<NSString*>*)gaiaIDsToKeep {
-  CHECK(!_selectedIndexPath, base::NotFatalUntil::M135);
+  CHECK(!_selectedIndexPath);
   NSDiffableDataSourceSnapshot* snapshot = _accountMenuDataSource.snapshot;
 
   NSMutableArray* accountsIdentifiersToAdd = [[NSMutableArray alloc] init];
diff --git a/ios/chrome/browser/authentication/ui_bundled/cells/signin_promo_view.mm b/ios/chrome/browser/authentication/ui_bundled/cells/signin_promo_view.mm
index 4f3f6fa..dae4cce0 100644
--- a/ios/chrome/browser/authentication/ui_bundled/cells/signin_promo_view.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/cells/signin_promo_view.mm
@@ -373,7 +373,7 @@
 
 // Configures primary button with a standard font.
 - (void)configurePrimaryButtonWithTitle:(NSString*)title {
-  CHECK_GT(title.length, 0ul, base::NotFatalUntil::M135);
+  CHECK_GT(title.length, 0ul);
   // Declaring variables that are used throughout different switch cases.
   UIFont* font;
   NSAttributedString* attributedTitle;
@@ -582,7 +582,7 @@
 - (NSString*)primaryButtonTitle {
   NSString* buttonTitle = self.primaryButton.configuration.title;
   // The primary button should always be set.
-  CHECK_GT(buttonTitle.length, 0ul, base::NotFatalUntil::M135);
+  CHECK_GT(buttonTitle.length, 0ul);
   return buttonTitle;
 }
 
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/add_account_signin/add_account_signin_manager.mm b/ios/chrome/browser/authentication/ui_bundled/signin/add_account_signin/add_account_signin_manager.mm
index 0b10a6ab..6a41f94 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/add_account_signin/add_account_signin_manager.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/add_account_signin/add_account_signin_manager.mm
@@ -145,7 +145,7 @@
     // See: `interruptAddAccountAnimated:completion:`.
     return;
   }
-  CHECK(!_lastStartAddAccountToDeviceTs.is_null(), base::NotFatalUntil::M135);
+  CHECK(!_lastStartAddAccountToDeviceTs.is_null());
   base::TimeDelta addAccountDuration =
       base::TimeTicks::Now() - _lastStartAddAccountToDeviceTs;
   _lastStartAddAccountToDeviceTs = base::TimeTicks();
diff --git a/ios/chrome/browser/autofill/model/form_suggestion_controller.mm b/ios/chrome/browser/autofill/model/form_suggestion_controller.mm
index 7762bc3..585d5eb 100644
--- a/ios/chrome/browser/autofill/model/form_suggestion_controller.mm
+++ b/ios/chrome/browser/autofill/model/form_suggestion_controller.mm
@@ -433,7 +433,7 @@
   if (IsStateless()) {
     // Check that there are always params attached to the suggestion when no
     // params are provided by the -didSelectSuggestion caller itself.
-    CHECK(suggestion.params, base::NotFatalUntil::M134);
+    CHECK(suggestion.params);
     if (!suggestion.params) {
       // Just skip if the check isn't triggered. This is to handle the absence
       // of params when the CHECK isn't fatal.
diff --git a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/payments_suggestion_bottom_sheet_coordinator.mm b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/payments_suggestion_bottom_sheet_coordinator.mm
index 4de891fa..8cac7a8 100644
--- a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/payments_suggestion_bottom_sheet_coordinator.mm
+++ b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/payments_suggestion_bottom_sheet_coordinator.mm
@@ -226,7 +226,7 @@
 - (void)dismissSoftKeyboard {
   web::WebState* activeWebState =
       self.browser->GetWebStateList()->GetActiveWebState();
-  CHECK(activeWebState, base::NotFatalUntil::M135);
+  CHECK(activeWebState);
   if (activeWebState) {
     [activeWebState->GetView() endEditing:NO];
   }
diff --git a/ios/chrome/browser/autofill/ui_bundled/manual_fill/manual_fill_injection_handler.mm b/ios/chrome/browser/autofill/ui_bundled/manual_fill/manual_fill_injection_handler.mm
index 2d37fbd..7b9d7ea4 100644
--- a/ios/chrome/browser/autofill/ui_bundled/manual_fill/manual_fill_injection_handler.mm
+++ b/ios/chrome/browser/autofill/ui_bundled/manual_fill/manual_fill_injection_handler.mm
@@ -467,7 +467,7 @@
   // types, even password types.
   SCOPED_CRASH_KEY_NUMBER("ManualFillInjection", "suggestion_type",
                           static_cast<int>(suggestion.type));
-  NOTREACHED(base::NotFatalUntil::M134);
+  NOTREACHED();
 
   return nil;
 }
diff --git a/ios/chrome/browser/metrics/model/ios_chrome_default_browser_metrics_provider.mm b/ios/chrome/browser/metrics/model/ios_chrome_default_browser_metrics_provider.mm
index 73a4dea8..802d448 100644
--- a/ios/chrome/browser/metrics/model/ios_chrome_default_browser_metrics_provider.mm
+++ b/ios/chrome/browser/metrics/model/ios_chrome_default_browser_metrics_provider.mm
@@ -80,8 +80,7 @@
       NOTREACHED();
     case metrics::MetricsLogUploader::MetricServiceType::DWA:
       // `this` should never be instantiated with this service type.
-      NOTREACHED(base::NotFatalUntil::M134);
-      return;
+      NOTREACHED();
   }
   NOTREACHED();
 }
diff --git a/ios/chrome/browser/omaha/model/omaha_service.mm b/ios/chrome/browser/omaha/model/omaha_service.mm
index 914ab30..11e4ea3 100644
--- a/ios/chrome/browser/omaha/model/omaha_service.mm
+++ b/ios/chrome/browser/omaha/model/omaha_service.mm
@@ -851,8 +851,7 @@
 // the expected deadline.
 void OmahaService::ResyncTimerIfNeeded() {
   DCHECK_CURRENTLY_ON(web::WebThread::IO);
-  CHECK(base::FeatureList::IsEnabled(kOmahaResyncTimerOnForeground),
-        base::NotFatalUntil::M134);
+  CHECK(base::FeatureList::IsEnabled(kOmahaResyncTimerOnForeground));
 
   // If the timer isn't already running, nothing needs to be done.
   if (!timer_.IsRunning()) {
@@ -871,7 +870,7 @@
 
   // The deadline is still in the future, but may not match what the
   // timer is currently set to. Reset the timer with a new deadline.
-  CHECK(schedule_, base::NotFatalUntil::M134);
+  CHECK(schedule_);
   timer_.Start(FROM_HERE, next_tries_time_ - now,
                base::BindOnce(&OmahaService::SendPing, base::Unretained(this)));
 }
diff --git a/ios/chrome/browser/passwords/ui_bundled/bottom_sheet/password_suggestion_bottom_sheet_coordinator.mm b/ios/chrome/browser/passwords/ui_bundled/bottom_sheet/password_suggestion_bottom_sheet_coordinator.mm
index 890641c..1a1c229 100644
--- a/ios/chrome/browser/passwords/ui_bundled/bottom_sheet/password_suggestion_bottom_sheet_coordinator.mm
+++ b/ios/chrome/browser/passwords/ui_bundled/bottom_sheet/password_suggestion_bottom_sheet_coordinator.mm
@@ -319,7 +319,7 @@
 - (void)dismissSoftKeyboard {
   web::WebState* activeWebState =
       self.browser->GetWebStateList()->GetActiveWebState();
-  CHECK(activeWebState, base::NotFatalUntil::M135);
+  CHECK(activeWebState);
   if (activeWebState) {
     [activeWebState->GetView() endEditing:NO];
   }
diff --git a/ios/chrome/browser/settings/ui_bundled/clear_browsing_data/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/settings/ui_bundled/clear_browsing_data/clear_browsing_data_table_view_controller.mm
index 83070c9..ee122fe 100644
--- a/ios/chrome/browser/settings/ui_bundled/clear_browsing_data/clear_browsing_data_table_view_controller.mm
+++ b/ios/chrome/browser/settings/ui_bundled/clear_browsing_data/clear_browsing_data_table_view_controller.mm
@@ -415,8 +415,7 @@
 - (void)removeBrowsingDataForTimePeriod:(browsing_data::TimePeriod)timePeriod
                              removeMask:(BrowsingDataRemoveMask)removeMask
                         completionBlock:(ProceduralBlock)completionBlock {
-  CHECK(timePeriod != browsing_data::TimePeriod::LAST_15_MINUTES,
-        base::NotFatalUntil::M130);
+  CHECK(timePeriod != browsing_data::TimePeriod::LAST_15_MINUTES);
   Browser* browser = self.browser;
   ProfileIOS* profile = self.profile;
   PrefService* prefService = self.prefService;
@@ -629,7 +628,7 @@
   }
   NSArray* timeRangeItems = [self.tableViewModel
       itemsInSectionWithIdentifier:SectionIdentifierTimeRange];
-  CHECK_EQ(timeRangeItems.count, 1u, base::NotFatalUntil::M130);
+  CHECK_EQ(timeRangeItems.count, 1u);
   TableViewDetailIconItem* timeRangeItem = timeRangeItems[0];
   CHECK([timeRangeItem isKindOfClass:[TableViewDetailIconItem class]]);
   if (!timeRangeItem.detailText) {
diff --git a/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_table_view_controller.mm b/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_table_view_controller.mm
index 173acdd..5e7b599 100644
--- a/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_table_view_controller.mm
+++ b/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_table_view_controller.mm
@@ -209,8 +209,8 @@
                                        name:(NSString*)name
                                       email:(NSString*)email
                       managementDescription:(NSString*)managementDescription {
-  CHECK(email, base::NotFatalUntil::M135);
-  CHECK(avatarImage, base::NotFatalUntil::M135);
+  CHECK(email);
+  CHECK(avatarImage);
   // Put a small non-empty frame to avoid layout constraint error during
   // initialization. The actual frame size is changed by the CentralAccountView.
   CentralAccountView* identityAccountItem =
diff --git a/ios/chrome/browser/settings/ui_bundled/search_engine_table_view_controller.mm b/ios/chrome/browser/settings/ui_bundled/search_engine_table_view_controller.mm
index bfa1789..7c04038 100644
--- a/ios/chrome/browser/settings/ui_bundled/search_engine_table_view_controller.mm
+++ b/ios/chrome/browser/settings/ui_bundled/search_engine_table_view_controller.mm
@@ -566,7 +566,7 @@
     // section. The settings should either contains a selected custom search
     // engine (which cannot be removed as long as it is selected),
     // or prepopulated search engine.
-    CHECK_EQ(path.section, secondSectionIdentifier, base::NotFatalUntil::M135);
+    CHECK_EQ(path.section, secondSectionIdentifier);
     std::erase(_secondList, engineItem.templateURL);
     _templateURLService->Remove(engineItem.templateURL);
   }
diff --git a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
index 6cbfc41..3c37f7d 100644
--- a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
+++ b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
@@ -2265,7 +2265,7 @@
 }
 
 - (void)showPriceTrackingNotificationsSettings {
-  CHECK(!self.signinCoordinator, base::NotFatalUntil::M134);
+  CHECK(!self.signinCoordinator);
   if (self.settingsNavigationController) {
     __weak SceneController* weakSelf = self;
     [self closePresentedViews:NO
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/base_grid_mediator.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/base_grid_mediator.mm
index 2a4d1c3..e945a24b 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/base_grid_mediator.mm
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/base_grid_mediator.mm
@@ -446,7 +446,7 @@
     // should be a search result from a different window. Since this item is not
     // from the current browser, no UI updates will be sent to the current grid.
     // Notify the current grid consumer about the change.
-    CHECK(_modeHolder.mode == TabGridMode::kSearch, base::NotFatalUntil::M130);
+    CHECK(_modeHolder.mode == TabGridMode::kSearch);
     GridItemIdentifier* identifierToRemove =
         [GridItemIdentifier groupIdentifier:group];
     [self.consumer removeItemWithIdentifier:identifierToRemove
@@ -486,7 +486,7 @@
     // should be a search result from a different window. Since this item is not
     // from the current browser, no UI updates will be sent to the current grid.
     // Notify the current grid consumer about the change.
-    CHECK(_modeHolder.mode == TabGridMode::kSearch, base::NotFatalUntil::M130);
+    CHECK(_modeHolder.mode == TabGridMode::kSearch);
     GridItemIdentifier* identifierToRemove =
         [GridItemIdentifier groupIdentifier:group];
     [self.consumer removeItemWithIdentifier:identifierToRemove
diff --git a/ios_internal b/ios_internal
index a5c6f36..c4fbb87 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit a5c6f36c55a93150abaf43134d5c40dc42112f9d
+Subproject commit c4fbb878b6b071ab5b6750b093e3180fc9b7a425
diff --git a/ipc/ipc_mojo_bootstrap.cc b/ipc/ipc_mojo_bootstrap.cc
index 15b01b6..e60b3b94 100644
--- a/ipc/ipc_mojo_bootstrap.cc
+++ b/ipc/ipc_mojo_bootstrap.cc
@@ -24,7 +24,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/sequence_checker.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/lock.h"
@@ -921,7 +920,7 @@
       return true;
     }
 
-    CHECK(connector_->encountered_error(), base::NotFatalUntil::M135);
+    CHECK(connector_->encountered_error());
     return false;
   }
 
diff --git a/mojo/core/ipcz_driver/mojo_trap.cc b/mojo/core/ipcz_driver/mojo_trap.cc
index 60d0ecb0..c1e4012e 100644
--- a/mojo/core/ipcz_driver/mojo_trap.cc
+++ b/mojo/core/ipcz_driver/mojo_trap.cc
@@ -17,7 +17,6 @@
 #include "base/check_op.h"
 #include "base/feature_list.h"
 #include "base/memory/ref_counted.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/thread_restrictions.h"
@@ -332,7 +331,7 @@
   };
 
   TriggerMap::iterator next_trigger = next_trigger_;
-  CHECK(next_trigger != triggers_.end(), base::NotFatalUntil::M130);
+  CHECK(next_trigger != triggers_.end());
 
   // We iterate over all triggers, starting just beyond wherever we started last
   // time we were armed. This guards against any single trigger being starved.
diff --git a/mojo/core/ports/node.cc b/mojo/core/ports/node.cc
index 271478e..ccce82d 100644
--- a/mojo/core/ports/node.cc
+++ b/mojo/core/ports/node.cc
@@ -21,7 +21,6 @@
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/rand_util.h"
 #include "base/synchronization/lock.h"
@@ -1547,7 +1546,7 @@
     for (size_t i = 0; i < message->num_ports(); ++i) {
       const PortName& attached_port_name = message->ports()[i];
       auto iter = ports_.find(attached_port_name);
-      CHECK(iter != ports_.end(), base::NotFatalUntil::M130);
+      CHECK(iter != ports_.end());
       attached_port_refs[i] = PortRef(attached_port_name, iter->second);
       ports_to_lock[i + 1] = &attached_port_refs[i];
     }
diff --git a/mojo/public/cpp/bindings/lib/sync_handle_registry.cc b/mojo/public/cpp/bindings/lib/sync_handle_registry.cc
index e5e5c00..f62525a 100644
--- a/mojo/public/cpp/bindings/lib/sync_handle_registry.cc
+++ b/mojo/public/cpp/bindings/lib/sync_handle_registry.cc
@@ -15,7 +15,6 @@
 #include "base/check_op.h"
 #include "base/containers/contains.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/not_fatal_until.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/threading/sequence_local_storage_slot.h"
@@ -152,7 +151,7 @@
 
     if (ready_event) {
       const auto iter = events_.find(ready_event);
-      CHECK(iter != events_.end(), base::NotFatalUntil::M130);
+      CHECK(iter != events_.end());
 
       {
         base::AutoReset<bool> in_nested_wait(&in_nested_wait_, true);
diff --git a/mojo/public/cpp/bindings/receiver_set.cc b/mojo/public/cpp/bindings/receiver_set.cc
index ede8e59..642984d7 100644
--- a/mojo/public/cpp/bindings/receiver_set.cc
+++ b/mojo/public/cpp/bindings/receiver_set.cc
@@ -13,7 +13,6 @@
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr_exclusion.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "mojo/public/cpp/bindings/message.h"
 
 namespace mojo {
@@ -161,7 +160,7 @@
                                     uint32_t custom_reason_code,
                                     const std::string& description) {
   auto it = entries_.find(id);
-  CHECK(it != entries_.end(), base::NotFatalUntil::M130);
+  CHECK(it != entries_.end());
 
   // We keep the Entry alive throughout error dispatch.
   std::unique_ptr<Entry> entry = std::move(it->second);
diff --git a/mojo/public/cpp/system/wait_set.cc b/mojo/public/cpp/system/wait_set.cc
index cf35795..85bb3a5 100644
--- a/mojo/public/cpp/system/wait_set.cc
+++ b/mojo/public/cpp/system/wait_set.cc
@@ -19,7 +19,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/ref_counted.h"
-#include "base/not_fatal_until.h"
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
 #include "mojo/public/cpp/system/trap.h"
@@ -176,7 +175,7 @@
           for (size_t i = 0; i < num_blocking_events; ++i) {
             const auto& event = blocking_events[i];
             auto it = contexts_.find(event.trigger_context);
-            CHECK(it != contexts_.end(), base::NotFatalUntil::M130);
+            CHECK(it != contexts_.end());
             ready_handles_[it->second->handle()] = {event.result,
                                                     event.signals_state};
           }
diff --git a/net/base/priority_queue.h b/net/base/priority_queue.h
index cd25449..96f54e6 100644
--- a/net/base/priority_queue.h
+++ b/net/base/priority_queue.h
@@ -15,7 +15,6 @@
 #include "base/check_op.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
-#include "base/not_fatal_until.h"
 #include "base/threading/thread_checker.h"
 
 #if !defined(NDEBUG)
@@ -265,7 +264,7 @@
 
     typename Pointer::ListIterator it = pointer.iterator_;
     Priority priority = pointer.priority_;
-    CHECK(it != lists_[priority].end(), base::NotFatalUntil::M130);
+    CHECK(it != lists_[priority].end());
     ++it;
     while (it == lists_[priority].end()) {
       if (priority == 0u) {
@@ -290,7 +289,7 @@
 
     typename Pointer::ListIterator it = pointer.iterator_;
     Priority priority = pointer.priority_;
-    CHECK(it != lists_[priority].end(), base::NotFatalUntil::M130);
+    CHECK(it != lists_[priority].end());
     while (it == lists_[priority].begin()) {
       if (priority == num_priorities() - 1) {
         DCHECK(pointer.Equals(FirstMax()));
diff --git a/net/cert/coalescing_cert_verifier.cc b/net/cert/coalescing_cert_verifier.cc
index dc48c50..e83203f 100644
--- a/net/cert/coalescing_cert_verifier.cc
+++ b/net/cert/coalescing_cert_verifier.cc
@@ -12,7 +12,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/time/time.h"
 #include "net/base/net_errors.h"
@@ -473,7 +472,7 @@
   // Otherwise, it MUST have been a job from a previous generation.
   auto inflight_it =
       std::ranges::find_if(inflight_jobs_, base::MatchesUniquePtr(job));
-  CHECK(inflight_it != inflight_jobs_.end(), base::NotFatalUntil::M130);
+  CHECK(inflight_it != inflight_jobs_.end());
   inflight_jobs_.erase(inflight_it);
   return;
 }
diff --git a/net/cert/multi_threaded_cert_verifier.cc b/net/cert/multi_threaded_cert_verifier.cc
index 93379e7..09f825f 100644
--- a/net/cert/multi_threaded_cert_verifier.cc
+++ b/net/cert/multi_threaded_cert_verifier.cc
@@ -119,6 +119,8 @@
   // method, so that PostTask will still run it even if the weakptr is no
   // longer valid.
   static void OnJobComplete(base::WeakPtr<InternalRequest> self,
+                            const std::string hostname,
+                            base::TimeTicks start_time,
                             std::unique_ptr<ResultHelper> verify_result);
 
   CompletionOnceCallback callback_;
@@ -159,6 +161,7 @@
   if (params.flags() & CertVerifier::VERIFY_SXG_CT_REQUIREMENTS) {
     flags |= CertVerifyProc::VERIFY_SXG_CT_REQUIREMENTS;
   }
+  base::TimeTicks start_time = base::TimeTicks::Now();
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE,
       {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
@@ -166,16 +169,34 @@
                      params.hostname(), params.ocsp_response(),
                      params.sct_list(), flags, net_log),
       base::BindOnce(&MultiThreadedCertVerifier::InternalRequest::OnJobComplete,
-                     weak_factory_.GetWeakPtr()));
+                     weak_factory_.GetWeakPtr(), params.hostname(),
+                     start_time));
 }
 
 // static
 void MultiThreadedCertVerifier::InternalRequest::OnJobComplete(
     base::WeakPtr<InternalRequest> self,
+    const std::string hostname,
+    base::TimeTicks start_time,
     std::unique_ptr<ResultHelper> verify_result) {
   // Always log the EndEvent, even if the Request has been destroyed.
   verify_result->net_log.EndEvent(NetLogEventType::CERT_VERIFIER_TASK);
 
+  base::TimeDelta verify_time = base::TimeTicks::Now() - start_time;
+  UMA_HISTOGRAM_CUSTOM_TIMES("Net.MultiThreadedCertVerifier.RequestDuration",
+                             verify_time, base::Milliseconds(1),
+                             base::Minutes(10), 100);
+  if (IsGoogleHost(hostname)) {
+    if (IsGoogleHostWithAlpnH3(hostname)) {
+      UMA_HISTOGRAM_CUSTOM_TIMES(
+          "Net.MultiThreadedCertVerifier.RequestDuration.GoogleWithAlpnH3",
+          verify_time, base::Milliseconds(1), base::Minutes(10), 100);
+    }
+    UMA_HISTOGRAM_CUSTOM_TIMES(
+        "Net.MultiThreadedCertVerifier.RequestDuration.Google", verify_time,
+        base::Milliseconds(1), base::Minutes(10), 100);
+  }
+
   // Check |self| weakptr and don't continue if the Request was destroyed.
   if (!self)
     return;
diff --git a/net/cert_net/cert_net_fetcher_url_request.cc b/net/cert_net/cert_net_fetcher_url_request.cc
index 84ec0dc..97d04cf 100644
--- a/net/cert_net/cert_net_fetcher_url_request.cc
+++ b/net/cert_net/cert_net_fetcher_url_request.cc
@@ -69,7 +69,6 @@
 #include "base/functional/callback_helpers.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_math.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/task/single_thread_task_runner.h"
@@ -464,7 +463,7 @@
   std::unique_ptr<Job> delete_this;
 
   auto it = std::ranges::find(requests_, request);
-  CHECK(it != requests_.end(), base::NotFatalUntil::M130);
+  CHECK(it != requests_.end());
   requests_.erase(it);
 
   // If there are no longer any requests attached to the job then
diff --git a/net/cookies/cookie_monster_change_dispatcher.cc b/net/cookies/cookie_monster_change_dispatcher.cc
index 38c0c1b..37a63ff 100644
--- a/net/cookies/cookie_monster_change_dispatcher.cc
+++ b/net/cookies/cookie_monster_change_dispatcher.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/task/task_runner.h"
 #include "net/base/features.h"
@@ -252,14 +251,12 @@
 
   auto cookie_domain_map_iterator =
       cookie_domain_map_.find(subscription->domain_key());
-  CHECK(cookie_domain_map_iterator != cookie_domain_map_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(cookie_domain_map_iterator != cookie_domain_map_.end());
 
   CookieNameMap& cookie_name_map = cookie_domain_map_iterator->second;
   auto cookie_name_map_iterator =
       cookie_name_map.find(subscription->name_key());
-  CHECK(cookie_name_map_iterator != cookie_name_map.end(),
-        base::NotFatalUntil::M130);
+  CHECK(cookie_name_map_iterator != cookie_name_map.end());
 
   SubscriptionList& subscription_list = cookie_name_map_iterator->second;
   subscription->RemoveFromList();
diff --git a/net/disk_cache/simple/simple_file_tracker.cc b/net/disk_cache/simple/simple_file_tracker.cc
index 347b4af..143242f9 100644
--- a/net/disk_cache/simple/simple_file_tracker.cc
+++ b/net/disk_cache/simple/simple_file_tracker.cc
@@ -13,7 +13,6 @@
 #include "base/files/file.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/synchronization/lock.h"
 #include "net/disk_cache/disk_cache.h"
 #include "net/disk_cache/simple/simple_histogram_enums.h"
@@ -197,7 +196,7 @@
                              EntryFileKey* key) {
   base::AutoLock hold_lock(lock_);
   auto iter = tracked_files_.find(key->entry_hash);
-  CHECK(iter != tracked_files_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != tracked_files_.end());
 
   uint64_t max_doom_gen = 0;
   for (const std::unique_ptr<TrackedFiles>& file_with_same_hash :
@@ -231,7 +230,7 @@
 SimpleFileTracker::TrackedFiles* SimpleFileTracker::Find(
     const SimpleSynchronousEntry* owner) {
   auto candidates = tracked_files_.find(owner->entry_file_key().entry_hash);
-  CHECK(candidates != tracked_files_.end(), base::NotFatalUntil::M130);
+  CHECK(candidates != tracked_files_.end());
   for (const auto& candidate : candidates->second) {
     if (candidate->owner == owner) {
       return candidate.get();
diff --git a/net/disk_cache/simple/simple_index.cc b/net/disk_cache/simple/simple_index.cc
index b467ca4..e14b528 100644
--- a/net/disk_cache/simple/simple_index.cc
+++ b/net/disk_cache/simple/simple_index.cc
@@ -12,7 +12,6 @@
 #include "base/check_op.h"
 #include "base/files/file_util.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/pickle.h"
 #include "base/strings/string_number_conversions.h"
@@ -397,7 +396,7 @@
 void SimpleIndex::SetLastUsedTimeForTest(uint64_t entry_hash,
                                          const base::Time last_used) {
   auto it = entries_set_.find(entry_hash);
-  CHECK(it != entries_set_.end(), base::NotFatalUntil::M130);
+  CHECK(it != entries_set_.end());
   it->second.SetLastUsedTime(last_used);
 }
 
diff --git a/net/dns/host_resolver_dns_task.cc b/net/dns/host_resolver_dns_task.cc
index 11191c8..bec87c29 100644
--- a/net/dns/host_resolver_dns_task.cc
+++ b/net/dns/host_resolver_dns_task.cc
@@ -10,7 +10,6 @@
 
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/time/tick_clock.h"
 #include "base/types/optional_util.h"
 #include "net/base/features.h"
@@ -504,8 +503,7 @@
     uint16_t request_port,
     int net_error,
     const DnsResponse* response) {
-  CHECK(transaction_info_it != transactions_in_progress_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(transaction_info_it != transactions_in_progress_.end());
   DCHECK(base::Contains(transactions_in_progress_, *transaction_info_it));
 
   // Pull the TransactionInfo out of `transactions_in_progress_` now, so it
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
index 89a5d5b8..644ae1d 100644
--- a/net/dns/host_resolver_manager.cc
+++ b/net/dns/host_resolver_manager.cc
@@ -43,7 +43,6 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/notimplemented.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/observer_list.h"
@@ -1223,7 +1222,7 @@
 
 std::unique_ptr<HostResolverManager::Job> HostResolverManager::RemoveJob(
     JobMap::iterator job_it) {
-  CHECK(job_it != jobs_.end(), base::NotFatalUntil::M130);
+  CHECK(job_it != jobs_.end());
   CHECK(job_it->second);
   CHECK(jobs_.find(job_it->first) != jobs_.end());
 
diff --git a/net/dns/host_resolver_manager_job.cc b/net/dns/host_resolver_manager_job.cc
index c0141a3..474becb8 100644
--- a/net/dns/host_resolver_manager_job.cc
+++ b/net/dns/host_resolver_manager_job.cc
@@ -17,7 +17,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "net/base/address_family.h"
@@ -390,7 +389,7 @@
 
 void HostResolverManager::Job::OnAddedToJobMap(JobMap::iterator iterator) {
   CHECK(!self_iterator_);
-  CHECK(iterator != resolver_->jobs_.end(), base::NotFatalUntil::M130);
+  CHECK(iterator != resolver_->jobs_.end());
   self_iterator_ = iterator;
 }
 
diff --git a/net/dns/httpssvc_metrics.cc b/net/dns/httpssvc_metrics.cc
index cad5afc..75d85be 100644
--- a/net/dns/httpssvc_metrics.cc
+++ b/net/dns/httpssvc_metrics.cc
@@ -11,7 +11,6 @@
 #include "base/metrics/histogram.h"
 #include "base/metrics/histogram_base.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/clamped_math.h"
 #include "base/strings/string_split.h"
@@ -118,8 +117,7 @@
   std::vector<base::TimeDelta>::iterator slowest_address_resolve =
       std::max_element(address_resolve_times_.begin(),
                        address_resolve_times_.end());
-  CHECK(slowest_address_resolve != address_resolve_times_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(slowest_address_resolve != address_resolve_times_.end());
 
   // It's possible to get here with a zero resolve time in tests.  Avoid
   // divide-by-zero below by returning early; this data point is invalid anyway.
diff --git a/net/dns/mdns_client_impl.cc b/net/dns/mdns_client_impl.cc
index 8bff7d7..2bfbedfedd 100644
--- a/net/dns/mdns_client_impl.cc
+++ b/net/dns/mdns_client_impl.cc
@@ -15,7 +15,6 @@
 #include "base/functional/bind.h"
 #include "base/location.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/strings/string_util.h"
 #include "base/task/single_thread_task_runner.h"
@@ -412,7 +411,7 @@
   ListenerKey key(listener->GetName(), listener->GetType());
   auto observer_list_iterator = listeners_.find(key);
 
-  CHECK(observer_list_iterator != listeners_.end(), base::NotFatalUntil::M130);
+  CHECK(observer_list_iterator != listeners_.end());
   DCHECK(observer_list_iterator->second->HasObserver(listener));
 
   observer_list_iterator->second->RemoveObserver(listener);
diff --git a/net/dns/system_dns_config_change_notifier.cc b/net/dns/system_dns_config_change_notifier.cc
index 93c5e1ae..fe7fd3c9 100644
--- a/net/dns/system_dns_config_change_notifier.cc
+++ b/net/dns/system_dns_config_change_notifier.cc
@@ -13,7 +13,6 @@
 #include "base/location.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/sequence_checker.h"
 #include "base/synchronization/lock.h"
 #include "base/task/sequenced_task_runner.h"
@@ -116,7 +115,7 @@
     {
       base::AutoLock lock(lock_);
       auto it = wrapped_observers_.find(observer);
-      CHECK(it != wrapped_observers_.end(), base::NotFatalUntil::M130);
+      CHECK(it != wrapped_observers_.end());
       removed_wrapped_observer = std::move(it->second);
       wrapped_observers_.erase(it);
     }
diff --git a/net/first_party_sets/global_first_party_sets.cc b/net/first_party_sets/global_first_party_sets.cc
index 658dffa..0bfd5642 100644
--- a/net/first_party_sets/global_first_party_sets.cc
+++ b/net/first_party_sets/global_first_party_sets.cc
@@ -17,7 +17,6 @@
 #include "base/containers/flat_set.h"
 #include "base/containers/map_util.h"
 #include "base/functional/function_ref.h"
-#include "base/not_fatal_until.h"
 #include "base/types/optional_ref.h"
 #include "net/base/schemeful_site.h"
 #include "net/first_party_sets/addition_overlaps_union_find.h"
@@ -89,7 +88,7 @@
   CHECK(std::ranges::all_of(aliases_, [&](const auto& pair) {
     return entries_.contains(pair.second);
   }));
-  CHECK(IsValid(), base::NotFatalUntil::M130) << "Sets must be valid";
+  CHECK(IsValid()) << "Sets must be valid";
 }
 
 GlobalFirstPartySets::GlobalFirstPartySets(GlobalFirstPartySets&&) = default;
@@ -181,7 +180,7 @@
 
   manual_config_ = ComputeConfig(local_set_declaration.ComputeMutation());
 
-  CHECK(IsValid(), base::NotFatalUntil::M130) << "Sets must be valid";
+  CHECK(IsValid()) << "Sets must be valid";
 }
 
 void GlobalFirstPartySets::UnsafeSetManualConfig(
@@ -389,8 +388,7 @@
                                           mutation.aliases());
   CHECK(config.has_value());  // This class ensures the invariants that the
                               // config relies on.
-  CHECK(IsValid(config), base::NotFatalUntil::M130)
-      << "Sets must not contain singleton or orphan";
+  CHECK(IsValid(config)) << "Sets must not contain singleton or orphan";
   return std::move(config).value();
 }
 
diff --git a/net/http/bidirectional_stream.cc b/net/http/bidirectional_stream.cc
index d16c0bd7..0a99fd3 100644
--- a/net/http/bidirectional_stream.cc
+++ b/net/http/bidirectional_stream.cc
@@ -414,11 +414,6 @@
 
 void BidirectionalStream::OnQuicBroken() {}
 
-void BidirectionalStream::OnSwitchesToHttpStreamPool(
-    HttpStreamPoolRequestInfo request_info) {
-  NOTREACHED();
-}
-
 void BidirectionalStream::NotifyFailed(int error) {
   delegate_->OnFailed(error);
 }
diff --git a/net/http/bidirectional_stream.h b/net/http/bidirectional_stream.h
index d122754..6846637 100644
--- a/net/http/bidirectional_stream.h
+++ b/net/http/bidirectional_stream.h
@@ -213,8 +213,6 @@
                         HttpAuthController* auth_controller) override;
   void OnNeedsClientAuth(SSLCertRequestInfo* cert_info) override;
   void OnQuicBroken() override;
-  void OnSwitchesToHttpStreamPool(
-      HttpStreamPoolRequestInfo request_info) override;
 
   // Helper method to notify delegate if there is an error.
   void NotifyFailed(int error);
diff --git a/net/http/http_auth_cache.cc b/net/http/http_auth_cache.cc
index 10a11db6..90e239f6 100644
--- a/net/http/http_auth_cache.cc
+++ b/net/http/http_auth_cache.cc
@@ -10,7 +10,6 @@
 #include "base/logging.h"
 #include "base/memory/raw_ref.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "url/gurl.h"
 #include "url/scheme_host_port.h"
@@ -440,7 +439,7 @@
       oldest_last_use_time_ticks = entry.last_use_time_ticks_;
     }
   }
-  CHECK(oldest_entry_it != entries_.end(), base::NotFatalUntil::M130);
+  CHECK(oldest_entry_it != entries_.end());
   entries_.erase(oldest_entry_it);
 }
 
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc
index ea36759..85d077b 100644
--- a/net/http/http_cache.cc
+++ b/net/http/http_cache.cc
@@ -25,7 +25,6 @@
 #include "base/metrics/field_trial.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/histogram_macros_local.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/pickle.h"
 #include "base/strings/strcat.h"
@@ -974,7 +973,7 @@
 
   if (!key.empty()) {
     auto it = pending_ops_.find(key);
-    CHECK(it != pending_ops_.end(), base::NotFatalUntil::M130);
+    CHECK(it != pending_ops_.end());
     pending_ops_.erase(it);
   } else {
     for (auto it = pending_ops_.begin(); it != pending_ops_.end(); ++it) {
@@ -1166,7 +1165,7 @@
   // Transaction is reading from the entry.
   DCHECK(!entry->HasWriters());
   auto readers_it = entry->readers().find(transaction);
-  CHECK(readers_it != entry->readers().end(), base::NotFatalUntil::M130);
+  CHECK(readers_it != entry->readers().end());
   entry->readers().erase(readers_it);
   ProcessQueuedTransactions(entry);
 }
diff --git a/net/http/http_cache_writers.cc b/net/http/http_cache_writers.cc
index fb642cf..ac02766 100644
--- a/net/http/http_cache_writers.cc
+++ b/net/http/http_cache_writers.cc
@@ -11,7 +11,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/pickle.h"
 #include "base/task/single_thread_task_runner.h"
 #include "net/base/net_errors.h"
@@ -194,7 +193,7 @@
                                           int result) {
   // The transaction should be part of all_writers.
   auto it = all_writers_.find(transaction);
-  CHECK(it != all_writers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != all_writers_.end());
   EraseTransaction(it, result);
 }
 
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index 89adfd30..17e216a 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -949,20 +949,6 @@
   net_error_details_.quic_broken = true;
 }
 
-void HttpNetworkTransaction::OnSwitchesToHttpStreamPool(
-    HttpStreamPoolRequestInfo request_info) {
-  CHECK_EQ(STATE_CREATE_STREAM_COMPLETE, next_state_);
-  CHECK(stream_request_);
-  stream_request_.reset();
-
-  stream_request_ = session_->http_stream_pool()->RequestStream(
-      this, std::move(request_info), priority_,
-      /*allowed_bad_certs=*/observed_bad_certs_, enable_ip_based_pooling_,
-      enable_alternative_services_, net_log_);
-  CHECK(!stream_request_->completed());
-  // No IO completion yet.
-}
-
 ConnectionAttempts HttpNetworkTransaction::GetConnectionAttempts() const {
   return connection_attempts_;
 }
diff --git a/net/http/http_network_transaction.h b/net/http/http_network_transaction.h
index e22bd357..ef8982535 100644
--- a/net/http/http_network_transaction.h
+++ b/net/http/http_network_transaction.h
@@ -124,9 +124,6 @@
 
   void OnQuicBroken() override;
 
-  void OnSwitchesToHttpStreamPool(
-      HttpStreamPoolRequestInfo request_info) override;
-
   ConnectionAttempts GetConnectionAttempts() const override;
 
  private:
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index b33dd03..2812f43 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -28526,40 +28526,6 @@
   EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine());
 }
 
-// Tests specific to the HappyEyeballsV3 feature.
-// TODO(crbug.com/346835898): Find ways to run more tests with the
-// HappyEyeballsV3 feature enabled.
-class HttpNetworkTransactionPoolTest : public HttpNetworkTransactionTest {
- public:
-  HttpNetworkTransactionPoolTest() {
-    feature_list_.InitAndEnableFeature(features::kHappyEyeballsV3);
-  }
-
- private:
-  base::test::ScopedFeatureList feature_list_;
-};
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         HttpNetworkTransactionPoolTest,
-                         ::testing::ValuesIn(GetTestParams()));
-
-TEST_P(HttpNetworkTransactionPoolTest, SwitchToHttpStreamPool) {
-  MockRead data_reads[] = {
-      MockRead("HTTP/1.1 200 OK\r\n\r\n"),
-      MockRead("hello world"),
-      MockRead(SYNCHRONOUS, OK),
-  };
-  SimpleGetHelperResult out = SimpleGetHelper(data_reads);
-  EXPECT_THAT(out.rv, IsOk());
-  EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
-  EXPECT_EQ("hello world", out.response_data);
-  int64_t reads_size = CountReadBytes(data_reads);
-  EXPECT_EQ(reads_size, out.total_received_bytes);
-  EXPECT_EQ(0u, out.connection_attempts.size());
-
-  EXPECT_FALSE(out.remote_endpoint_after_start.address().empty());
-}
-
 TEST_P(HttpNetworkTransactionTest, EarlyHintsWithAltSvcHeader) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
diff --git a/net/http/http_stream_factory_job_controller.cc b/net/http/http_stream_factory_job_controller.cc
index 1ae395b..6b3914ee 100644
--- a/net/http/http_stream_factory_job_controller.cc
+++ b/net/http/http_stream_factory_job_controller.cc
@@ -269,6 +269,8 @@
 
 void HttpStreamFactory::JobController::OnRequestComplete() {
   DCHECK(request_);
+  CHECK(!switched_to_http_stream_pool_);
+
   request_ = nullptr;
   // This is called when the delegate is destroying its HttpStreamRequest, so
   // it's no longer safe to call into it after this point.
@@ -1496,6 +1498,7 @@
 void HttpStreamFactory::JobController::SwitchToHttpStreamPool() {
   CHECK(request_info_.socket_tag == SocketTag());
   CHECK_EQ(stream_type_, HttpStreamRequest::HTTP_STREAM);
+  CHECK(session_->host_resolver()->IsHappyEyeballsV3Enabled());
 
   switched_to_http_stream_pool_ = true;
 
@@ -1522,11 +1525,16 @@
     return;
   }
 
+  // Exchange `request_` and `delegate_` to prevent them from being dangling.
+  session_->http_stream_pool()->HandleStreamRequest(
+      std::exchange(request_, nullptr), std::exchange(delegate_, nullptr),
+      std::move(pool_request_info), priority_, allowed_bad_certs_,
+      enable_ip_based_pooling_, enable_alternative_services_);
+
+  // Delete `this` later as this method is called while running DoLoop().
   base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&JobController::CallOnSwitchesToHttpStreamPool,
-                     ptr_factory_.GetWeakPtr(), std::move(pool_request_info),
-                     base::TimeTicks::Now()));
+      FROM_HERE, base::BindOnce(&JobController::MaybeNotifyFactoryOfCompletion,
+                                ptr_factory_.GetWeakPtr()));
 }
 
 void HttpStreamFactory::JobController::OnPoolPreconnectsComplete(int rv) {
@@ -1535,18 +1543,4 @@
   MaybeNotifyFactoryOfCompletion();
 }
 
-void HttpStreamFactory::JobController::CallOnSwitchesToHttpStreamPool(
-    HttpStreamPoolRequestInfo request_info,
-    base::TimeTicks post_task_time) {
-  CHECK(request_);
-  CHECK(delegate_);
-
-  base::UmaHistogramTimes("Net.HttpStreamPool.SwitchesToPoolPostTaskTime",
-                          base::TimeTicks::Now() - post_task_time);
-
-  // `request_` and `delegate_` will be reset later.
-
-  delegate_->OnSwitchesToHttpStreamPool(std::move(request_info));
-}
-
 }  // namespace net
diff --git a/net/http/http_stream_factory_job_controller.h b/net/http/http_stream_factory_job_controller.h
index 05511207..d4e32b53f 100644
--- a/net/http/http_stream_factory_job_controller.h
+++ b/net/http/http_stream_factory_job_controller.h
@@ -301,10 +301,6 @@
   // the preconnect completed. Used to notify the factory of completion.
   void OnPoolPreconnectsComplete(int rv);
 
-  // Used to call HttpStreamRequest::OnSwitchesToHttpStreamPool() later.
-  void CallOnSwitchesToHttpStreamPool(HttpStreamPoolRequestInfo request_info,
-                                      base::TimeTicks post_task_time);
-
   const raw_ptr<HttpStreamFactory> factory_;
   const raw_ptr<HttpNetworkSession> session_;
   const raw_ptr<JobFactory> job_factory_;
diff --git a/net/http/http_stream_factory_test_util.h b/net/http/http_stream_factory_test_util.h
index 476bfed3..bb4de0f 100644
--- a/net/http/http_stream_factory_test_util.h
+++ b/net/http/http_stream_factory_test_util.h
@@ -90,15 +90,6 @@
   MOCK_METHOD1(OnNeedsClientAuth, void(SSLCertRequestInfo* cert_info));
 
   MOCK_METHOD0(OnQuicBroken, void());
-
-  // `switching_info` is not copyable and therefore cannot be mocked.
-  MOCK_METHOD1(OnSwitchesToHttpStreamPoolImpl,
-               void(HttpStreamPoolRequestInfo& request_info));
-
-  void OnSwitchesToHttpStreamPool(
-      HttpStreamPoolRequestInfo request_info) override {
-    OnSwitchesToHttpStreamPoolImpl(request_info);
-  }
 };
 
 class MockHttpStreamFactoryJob : public HttpStreamFactory::Job {
diff --git a/net/http/http_stream_factory_unittest.cc b/net/http/http_stream_factory_unittest.cc
index 461f14f..01b0aa6 100644
--- a/net/http/http_stream_factory_unittest.cc
+++ b/net/http/http_stream_factory_unittest.cc
@@ -354,21 +354,6 @@
 
   void OnQuicBroken() override {}
 
-  void OnSwitchesToHttpStreamPool(
-      HttpStreamPoolRequestInfo request_info) override {
-    CHECK(base::FeatureList::IsEnabled(features::kHappyEyeballsV3));
-    CHECK(request_);
-
-    request_ = session_->http_stream_pool()->RequestStream(
-        this, std::move(request_info), priority_, allowed_bad_certs_,
-        enable_ip_based_pooling_, enable_alternative_services_,
-        NetLogWithSource());
-
-    if (http_stream_pool_switch_wait_closure_) {
-      std::move(http_stream_pool_switch_wait_closure_).Run();
-    }
-  }
-
   void WaitForStream() {
     stream_done_ = false;
     loop_ = std::make_unique<base::RunLoop>();
@@ -378,18 +363,6 @@
     loop_.reset();
   }
 
-  void MaybeWaitForSwitchesToHttpStreamPool() {
-    if (!base::FeatureList::IsEnabled(features::kHappyEyeballsV3) ||
-        switched_to_http_stream_pool_) {
-      return;
-    }
-
-    CHECK(http_stream_pool_switch_wait_closure_.is_null());
-    base::RunLoop run_loop;
-    http_stream_pool_switch_wait_closure_ = run_loop.QuitClosure();
-    run_loop.Run();
-  }
-
   const ProxyInfo& used_proxy_info() const { return used_proxy_info_; }
 
   HttpStreamRequest* request() const { return request_.get(); }
@@ -410,8 +383,6 @@
  protected:
   const raw_ptr<HttpNetworkSession> session_;
 
-  bool switched_to_http_stream_pool_ = false;
-  base::OnceClosure http_stream_pool_switch_wait_closure_;
   RequestPriority priority_ = DEFAULT_PRIORITY;
   std::vector<SSLConfig::CertAndStatus> allowed_bad_certs_;
   bool enable_ip_based_pooling_ = true;
@@ -1571,7 +1542,6 @@
                           DEFAULT_PRIORITY, /*allowed_bad_certs=*/{},
                           /*enable_ip_based_pooling=*/true,
                           /*enable_alternative_services=*/true);
-  requester.MaybeWaitForSwitchesToHttpStreamPool();
 
   EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, requester.request()->GetLoadState());
 
@@ -1649,7 +1619,6 @@
                           /*allowed_bad_certs=*/{},
                           /*enable_ip_based_pooling=*/true,
                           /*enable_alternative_services=*/true);
-  requester.MaybeWaitForSwitchesToHttpStreamPool();
   EXPECT_FALSE(requester.stream_done());
 
   if (base::FeatureList::IsEnabled(features::kHappyEyeballsV3)) {
diff --git a/net/http/http_stream_pool.cc b/net/http/http_stream_pool.cc
index d1d38eaa..411b5e17 100644
--- a/net/http/http_stream_pool.cc
+++ b/net/http/http_stream_pool.cc
@@ -177,19 +177,19 @@
   is_shutting_down_ = true;
 }
 
-std::unique_ptr<HttpStreamRequest> HttpStreamPool::RequestStream(
+void HttpStreamPool::HandleStreamRequest(
+    HttpStreamRequest* request,
     HttpStreamRequest::Delegate* delegate,
     HttpStreamPoolRequestInfo request_info,
     RequestPriority priority,
     const std::vector<SSLConfig::CertAndStatus>& allowed_bad_certs,
     bool enable_ip_based_pooling,
-    bool enable_alternative_services,
-    const NetLogWithSource& net_log) {
+    bool enable_alternative_services) {
   auto controller = std::make_unique<JobController>(
       this, std::move(request_info), priority, allowed_bad_certs,
       enable_ip_based_pooling, enable_alternative_services);
   JobController* controller_raw_ptr = controller.get();
-  // Put `controller` into `job_controllers_` before calling RequestStream() to
+  // Put `controller` into `job_controllers_` before calling HandleRequest() to
   // make sure `job_controllers_` always contains `controller` when
   // OnJobControllerComplete() is called.
   job_controllers_.emplace(std::move(controller));
@@ -197,7 +197,7 @@
     ++limit_ignoring_job_controller_counts_;
   }
 
-  return controller_raw_ptr->RequestStream(delegate, net_log);
+  controller_raw_ptr->HandleStreamRequest(request, delegate);
 }
 
 int HttpStreamPool::Preconnect(HttpStreamPoolRequestInfo request_info,
diff --git a/net/http/http_stream_pool.h b/net/http/http_stream_pool.h
index bc78715..1462c6c2 100644
--- a/net/http/http_stream_pool.h
+++ b/net/http/http_stream_pool.h
@@ -161,15 +161,15 @@
   // the process of being destroyed.
   void OnShuttingDown();
 
-  // Requests an HttpStream.
-  std::unique_ptr<HttpStreamRequest> RequestStream(
+  // Takes over the responsibility of processing an already created `request`.
+  void HandleStreamRequest(
+      HttpStreamRequest* request,
       HttpStreamRequest::Delegate* delegate,
       HttpStreamPoolRequestInfo request_info,
       RequestPriority priority,
       const std::vector<SSLConfig::CertAndStatus>& allowed_bad_certs,
       bool enable_ip_based_pooling,
-      bool enable_alternative_services,
-      const NetLogWithSource& net_log);
+      bool enable_alternative_services);
 
   // Requests that enough connections/sessions for `num_streams` be opened.
   // `callback` is only invoked when the return value is `ERR_IO_PENDING`.
diff --git a/net/http/http_stream_pool_attempt_manager.cc b/net/http/http_stream_pool_attempt_manager.cc
index bac6ae8..ce350de 100644
--- a/net/http/http_stream_pool_attempt_manager.cc
+++ b/net/http/http_stream_pool_attempt_manager.cc
@@ -407,13 +407,11 @@
   // See https://www.rfc-editor.org/rfc/rfc9460.html#section-9.3. Endpoints are
   // usable if there is an overlap between the endpoint's ALPNs and the
   // configured ones.
-  for (const auto& alpn : endpoint.metadata.supported_protocol_alpns) {
-    if (base::Contains(http_network_session()->GetAlpnProtos(),
-                       NextProtoFromString(alpn))) {
-      return true;
-    }
-  }
-  return false;
+  return std::ranges::any_of(
+      endpoint.metadata.supported_protocol_alpns, [&](const auto& alpn) {
+        return base::Contains(http_network_session()->GetAlpnProtos(),
+                              NextProtoFromString(alpn));
+      });
 }
 
 HttpStreamPool::AttemptManager::InitialAttemptState
diff --git a/net/http/http_stream_pool_attempt_manager_unittest.cc b/net/http/http_stream_pool_attempt_manager_unittest.cc
index 89cb78b..4aa79528 100644
--- a/net/http/http_stream_pool_attempt_manager_unittest.cc
+++ b/net/http/http_stream_pool_attempt_manager_unittest.cc
@@ -280,8 +280,15 @@
 
   HttpStreamRequest* RequestStream(HttpStreamPool& pool) {
     const HttpStreamKey stream_key = GetStreamKey();
-    request_ = pool.RequestStream(
-        this,
+    const auto net_log = NetLogWithSource::Make(
+        pool.http_network_session()->net_log(), NetLogSourceType::URL_REQUEST);
+    request_ = std::make_unique<HttpStreamRequest>(
+        /*helper=*/nullptr,
+        /*websocket_handshake_stream_create_helper=*/nullptr, net_log,
+        HttpStreamRequest::StreamType::HTTP_STREAM);
+    pool.HandleStreamRequest(
+        request_.get(),
+        /*delegate=*/this,
         HttpStreamPoolRequestInfo(
             stream_key.destination(), stream_key.privacy_mode(),
             stream_key.socket_tag(), stream_key.network_anonymization_key(),
@@ -293,9 +300,7 @@
                 pool.http_network_session()->net_log(),
                 NetLogSourceType::HTTP_STREAM_JOB_CONTROLLER)),
         priority_, allowed_bad_certs_, enable_ip_based_pooling_,
-        enable_alternative_services_,
-        NetLogWithSource::Make(pool.http_network_session()->net_log(),
-                               NetLogSourceType::URL_REQUEST));
+        enable_alternative_services_);
     Group* group = pool.GetGroupForTesting(stream_key);
     AttemptManager* attempt_manager =
         group ? group->attempt_manager() : nullptr;
@@ -367,9 +372,6 @@
 
   void OnQuicBroken() override {}
 
-  void OnSwitchesToHttpStreamPool(
-      HttpStreamPoolRequestInfo request_info) override {}
-
   HttpStream* stream() {
     CHECK(stream_);
     return stream_.get();
diff --git a/net/http/http_stream_pool_job_controller.cc b/net/http/http_stream_pool_job_controller.cc
index 5314727..9c2f4bcc 100644
--- a/net/http/http_stream_pool_job_controller.cc
+++ b/net/http/http_stream_pool_job_controller.cc
@@ -147,22 +147,21 @@
   net_log_.EndEvent(NetLogEventType::HTTP_STREAM_POOL_JOB_CONTROLLER_ALIVE);
 }
 
-std::unique_ptr<HttpStreamRequest> HttpStreamPool::JobController::RequestStream(
-    HttpStreamRequest::Delegate* delegate,
-    const NetLogWithSource& net_log) {
+void HttpStreamPool::JobController::HandleStreamRequest(
+    HttpStreamRequest* stream_request,
+    HttpStreamRequest::Delegate* delegate) {
+  CHECK(stream_request);
   CHECK(!delegate_);
   CHECK(!stream_request_);
 
+  stream_request->SetHelperForSwitchingToPool(this);
+  delegate_ = delegate;
+  stream_request_ = stream_request;
+
   if (pool_->delegate_for_testing_) {
     pool_->delegate_for_testing_->OnRequestStream(origin_stream_key_);
   }
 
-  delegate_ = delegate;
-  auto stream_request = std::make_unique<HttpStreamRequest>(
-      this, /*websocket_handshake_stream_create_helper=*/nullptr, net_log,
-      HttpStreamRequest::HTTP_STREAM);
-  stream_request_ = stream_request.get();
-
   if (!IsPortAllowedForScheme(origin_stream_key_.destination().port(),
                               origin_stream_key_.destination().scheme())) {
     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
@@ -170,7 +169,7 @@
         base::BindOnce(&HttpStreamPool::JobController::CallOnStreamFailed,
                        weak_ptr_factory_.GetWeakPtr(), ERR_UNSAFE_PORT,
                        NetErrorDetails(), ResolveErrorInfo()));
-    return stream_request;
+    return;
   }
 
   std::unique_ptr<HttpStream> quic_http_stream =
@@ -185,19 +184,20 @@
             &HttpStreamPool::JobController::CallRequestCompleteAndStreamReady,
             weak_ptr_factory_.GetWeakPtr(), std::move(quic_http_stream),
             NextProto::kProtoQUIC));
-    return stream_request;
+    return;
   }
 
   SpdySessionKey spdy_session_key =
       origin_stream_key_.CalculateSpdySessionKey();
   base::WeakPtr<SpdySession> spdy_session = pool_->FindAvailableSpdySession(
-      origin_stream_key_, spdy_session_key, enable_ip_based_pooling_, net_log);
+      origin_stream_key_, spdy_session_key, enable_ip_based_pooling_,
+      stream_request_->net_log());
   if (spdy_session) {
     net_log_.AddEvent(
         NetLogEventType::
             HTTP_STREAM_POOL_JOB_CONTROLLER_FOUND_EXISTING_SPDY_SESSION);
     auto http_stream = std::make_unique<SpdyHttpStream>(
-        spdy_session, net_log.source(),
+        spdy_session, stream_request_->net_log().source(),
         spdy_session_pool()->GetDnsAliasesForSessionKey(spdy_session_key));
     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
         FROM_HERE,
@@ -205,7 +205,7 @@
             &HttpStreamPool::JobController::CallRequestCompleteAndStreamReady,
             weak_ptr_factory_.GetWeakPtr(), std::move(http_stream),
             NextProto::kProtoHTTP2));
-    return stream_request;
+    return;
   }
 
   if (alternative_.has_value()) {
@@ -213,7 +213,7 @@
         pool_
             ->GetOrCreateGroup(alternative_->stream_key, alternative_->quic_key)
             .CreateJob(this, alternative_->quic_version, alternative_->protocol,
-                       net_log);
+                       stream_request_->net_log());
     alternative_job_->Start();
   } else {
     alternative_job_result_ = OK;
@@ -223,13 +223,12 @@
                                          alternative_job_result_.has_value() &&
                                          *alternative_job_result_ == OK;
   if (!alternative_job_succeeded) {
-    origin_job_ = pool_->GetOrCreateGroup(origin_stream_key_, origin_quic_key_)
-                      .CreateJob(this, origin_quic_version_,
-                                 NextProto::kProtoUnknown, net_log);
+    origin_job_ =
+        pool_->GetOrCreateGroup(origin_stream_key_, origin_quic_key_)
+            .CreateJob(this, origin_quic_version_, NextProto::kProtoUnknown,
+                       stream_request_->net_log());
     origin_job_->Start();
   }
-
-  return stream_request;
 }
 
 int HttpStreamPool::JobController::Preconnect(
diff --git a/net/http/http_stream_pool_job_controller.h b/net/http/http_stream_pool_job_controller.h
index c2c23c85..2d22b4a 100644
--- a/net/http/http_stream_pool_job_controller.h
+++ b/net/http/http_stream_pool_job_controller.h
@@ -52,10 +52,9 @@
 
   ~JobController() override;
 
-  // Creates an HttpStreamRequest and starts Job(s) to handle it.
-  std::unique_ptr<HttpStreamRequest> RequestStream(
-      HttpStreamRequest::Delegate* delegate,
-      const NetLogWithSource& net_log);
+  // Takes over the responsibility of processing an already created `request`.
+  void HandleStreamRequest(HttpStreamRequest* stream_request,
+                           HttpStreamRequest::Delegate* delegate);
 
   // Requests that enough connections/sessions for `num_streams` be opened.
   // `callback` is only invoked when the return value is `ERR_IO_PENDING`.
diff --git a/net/http/http_stream_request.cc b/net/http/http_stream_request.cc
index dfe5ac73..aeba78d1 100644
--- a/net/http/http_stream_request.cc
+++ b/net/http/http_stream_request.cc
@@ -98,4 +98,8 @@
   }
 }
 
+void HttpStreamRequest::SetHelperForSwitchingToPool(Helper* helper) {
+  helper_ = helper;
+}
+
 }  // namespace net
diff --git a/net/http/http_stream_request.h b/net/http/http_stream_request.h
index cecfaca..d5443e3 100644
--- a/net/http/http_stream_request.h
+++ b/net/http/http_stream_request.h
@@ -14,7 +14,6 @@
 #include "net/base/request_priority.h"
 #include "net/http/alternative_service.h"
 #include "net/http/http_response_info.h"
-#include "net/http/http_stream_pool_request_info.h"
 #include "net/log/net_log_source.h"
 #include "net/log/net_log_with_source.h"
 #include "net/proxy_resolution/proxy_info.h"
@@ -111,14 +110,6 @@
     // Called when finding all QUIC alternative services are marked broken for
     // the origin in this request which advertises supporting QUIC.
     virtual void OnQuicBroken() = 0;
-
-    // Called when the call site should use HttpStreamPool to request an
-    // HttpStream.
-    // TODO(crbug.com/346835898): Remove this method once we figure out a
-    // better way to resolve proxies. This method is needed because currently
-    // HttpStreamFactory::JobController resolves proxies.
-    virtual void OnSwitchesToHttpStreamPool(
-        HttpStreamPoolRequestInfo request_info) = 0;
   };
 
   class NET_EXPORT_PRIVATE Helper {
@@ -205,6 +196,21 @@
     return dns_resolution_end_time_override_;
   }
 
+  // Sets a new helper for this request so that the new helper can take over
+  // the responsibility of processing this request.
+  //
+  // This *MUST NOT* be used other than switching from HttpStreamFactory to
+  // HttpStreamPool. (Re)setting the helper is extremetely dangerous and can
+  // cause dangling pointers and/or UAFs very easily. This method only exists to
+  // work around the fact that the HttpStreamFactory::JobController performs
+  // proxy resolution for a request. Ideally we should separate proxy resolution
+  // from HttpStreamFactory::JobController and use HttpStreamPool directly from
+  // HttpNetworkTransaction, instead of setting the helper.
+  //
+  // TODO(crbug.com/346835898): Remove this method once we come up with a way
+  // to separate proxy resolution from the HttpStreamFactory::JobController.
+  void SetHelperForSwitchingToPool(Helper* helper);
+
  private:
   // Unowned. The helper must not be destroyed before this object is.
   raw_ptr<Helper> helper_;
diff --git a/net/log/net_log.cc b/net/log/net_log.cc
index fb5a17ad..9b49a0ef 100644
--- a/net/log/net_log.cc
+++ b/net/log/net_log.cc
@@ -10,7 +10,6 @@
 #include "base/check_op.h"
 #include "base/containers/contains.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
@@ -128,7 +127,7 @@
   DCHECK_EQ(this, observer->net_log_);
 
   auto it = std::ranges::find(observers_, observer);
-  CHECK(it != observers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != observers_.end());
   observers_.erase(it);
 
   observer->net_log_ = nullptr;
@@ -156,7 +155,7 @@
   DCHECK(HasCaptureModeObserver(observer));
 
   auto it = std::ranges::find(capture_mode_observers_, observer);
-  CHECK(it != capture_mode_observers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != capture_mode_observers_.end());
   capture_mode_observers_.erase(it);
 
   observer->net_log_ = nullptr;
diff --git a/net/network_error_logging/network_error_logging_service.cc b/net/network_error_logging/network_error_logging_service.cc
index 8f483af..9166fd6 100644
--- a/net/network_error_logging/network_error_logging_service.cc
+++ b/net/network_error_logging/network_error_logging_service.cc
@@ -16,7 +16,6 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notimplemented.h"
 #include "base/rand_util.h"
 #include "base/time/clock.h"
@@ -720,7 +719,7 @@
   // Removes the policy pointed to by |policy_it|. Invalidates |policy_it|.
   // Returns the iterator to the next element.
   PolicyMap::iterator RemovePolicy(PolicyMap::iterator policy_it) {
-    CHECK(policy_it != policies_.end(), base::NotFatalUntil::M130);
+    CHECK(policy_it != policies_.end());
     NelPolicy* policy = &policy_it->second;
     MaybeRemoveWildcardPolicy(policy);
 
@@ -741,7 +740,7 @@
 
     auto wildcard_it =
         wildcard_policies_.find(WildcardNelPolicyKey(origin_key));
-    CHECK(wildcard_it != wildcard_policies_.end(), base::NotFatalUntil::M130);
+    CHECK(wildcard_it != wildcard_policies_.end());
 
     size_t erased = wildcard_it->second.erase(policy);
     DCHECK_EQ(1u, erased);
@@ -774,7 +773,7 @@
 
     // This should only be called if we have hit the max policy limit, so there
     // should be at least one policy.
-    CHECK(stalest_it != policies_.end(), base::NotFatalUntil::M130);
+    CHECK(stalest_it != policies_.end());
 
     RemovePolicy(stalest_it);
   }
diff --git a/net/proxy_resolution/mock_proxy_resolver.cc b/net/proxy_resolution/mock_proxy_resolver.cc
index cab6cb2..562116ff 100644
--- a/net/proxy_resolution/mock_proxy_resolver.cc
+++ b/net/proxy_resolution/mock_proxy_resolver.cc
@@ -9,7 +9,6 @@
 #include <utility>
 
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 
 namespace net {
 
@@ -78,7 +77,7 @@
 void MockAsyncProxyResolver::RemovePendingJob(Job* job) {
   DCHECK(job);
   auto it = std::ranges::find(pending_jobs_, job);
-  CHECK(it != pending_jobs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_jobs_.end());
   pending_jobs_.erase(it);
 }
 
@@ -158,7 +157,7 @@
 
 void MockAsyncProxyResolverFactory::RemovePendingRequest(Request* request) {
   auto it = std::ranges::find(pending_requests_, request);
-  CHECK(it != pending_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_requests_.end());
   pending_requests_.erase(it);
 }
 
diff --git a/net/proxy_resolution/win/proxy_config_service_win.cc b/net/proxy_resolution/win/proxy_config_service_win.cc
index 4264fa83..fc238b5e 100644
--- a/net/proxy_resolution/win/proxy_config_service_win.cc
+++ b/net/proxy_resolution/win/proxy_config_service_win.cc
@@ -14,7 +14,6 @@
 #include "base/functional/callback.h"
 #include "base/functional/callback_helpers.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_tokenizer.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -139,7 +138,7 @@
   // Figure out which registry key signalled this change.
   auto it = std::ranges::find(keys_to_watch_, key,
                               &std::unique_ptr<base::win::RegKey>::get);
-  CHECK(it != keys_to_watch_.end(), base::NotFatalUntil::M130);
+  CHECK(it != keys_to_watch_.end());
 
   // Keep watching the registry key.
   if (!key->StartWatching(
diff --git a/net/quic/quic_chromium_client_stream.cc b/net/quic/quic_chromium_client_stream.cc
index 5ef12ee5..f6becb9 100644
--- a/net/quic/quic_chromium_client_stream.cc
+++ b/net/quic/quic_chromium_client_stream.cc
@@ -19,7 +19,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "net/base/io_buffer.h"
 #include "net/base/net_errors.h"
@@ -704,7 +703,7 @@
         ack_listener) {
   if (!session()->OneRttKeysAvailable()) {
     auto entry = header_block.find(":method");
-    CHECK(entry != header_block.end(), base::NotFatalUntil::M130);
+    CHECK(entry != header_block.end());
     DCHECK(
         entry->second != "POST" ||
         (handle_ != nullptr && handle_->GetRequestIdempotency() == IDEMPOTENT));
diff --git a/net/quic/quic_session_pool.cc b/net/quic/quic_session_pool.cc
index b6d99ba..9779dc55 100644
--- a/net/quic/quic_session_pool.cc
+++ b/net/quic/quic_session_pool.cc
@@ -22,7 +22,6 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/escape.h"
 #include "base/strings/string_number_conversions.h"
@@ -886,7 +885,7 @@
   }
   if (rv == OK) {
     auto it = active_sessions_.find(session_key);
-    CHECK(it != active_sessions_.end(), base::NotFatalUntil::M130);
+    CHECK(it != active_sessions_.end());
     if (it == active_sessions_.end()) {
       return ERR_QUIC_PROTOCOL_ERROR;
     }
@@ -1636,7 +1635,7 @@
         base::TimeTicks::Now() - *proxy_connect_start_time);
   }
 
-  CHECK(iter != active_jobs_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != active_jobs_.end());
   if (rv == OK) {
     if (!has_quic_ever_worked_on_current_network_) {
       set_has_quic_ever_worked_on_current_network(true);
diff --git a/net/quic/quic_session_pool_job.cc b/net/quic/quic_session_pool_job.cc
index 7eb9bcb..124de34 100644
--- a/net/quic/quic_session_pool_job.cc
+++ b/net/quic/quic_session_pool_job.cc
@@ -5,7 +5,6 @@
 #include "net/quic/quic_session_pool_job.h"
 
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "net/base/completion_once_callback.h"
 #include "net/base/network_change_notifier.h"
 #include "net/base/network_handle.h"
@@ -69,7 +68,7 @@
 void QuicSessionPool::Job::RemoveRequest(QuicSessionRequest* request) {
   request->RemovedFromJob();
   auto request_iter = requests_.find(request);
-  CHECK(request_iter != requests_.end(), base::NotFatalUntil::M130);
+  CHECK(request_iter != requests_.end());
   requests_.erase(request_iter);
 }
 
diff --git a/net/reporting/reporting_cache_impl.cc b/net/reporting/reporting_cache_impl.cc
index 5775c76a..346d5490 100644
--- a/net/reporting/reporting_cache_impl.cc
+++ b/net/reporting/reporting_cache_impl.cc
@@ -12,7 +12,6 @@
 
 #include "base/containers/contains.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/stl_util.h"
 #include "base/time/clock.h"
 #include "base/time/tick_clock.h"
@@ -67,7 +66,7 @@
     // There should be at most one extra report (the one added above).
     DCHECK_EQ(context_->policy().max_report_count + 1, reports_.size());
     ReportSet::const_iterator to_evict = FindReportToEvict();
-    CHECK(to_evict != reports_.end(), base::NotFatalUntil::M130);
+    CHECK(to_evict != reports_.end());
     // The newly-added report isn't pending, so even if all other reports are
     // pending, the cache should have a report to evict.
     DCHECK(!to_evict->get()->IsUploadPending());
@@ -173,7 +172,7 @@
         reports) {
   for (const ReportingReport* report : reports) {
     auto it = reports_.find(report);
-    CHECK(it != reports_.end(), base::NotFatalUntil::M130);
+    CHECK(it != reports_.end());
     if (it->get()->status == ReportingReport::Status::DOOMED ||
         it->get()->status == ReportingReport::Status::SUCCESS) {
       reports_.erase(it);
@@ -190,7 +189,7 @@
         reports) {
   for (const ReportingReport* report : reports) {
     auto it = reports_.find(report);
-    CHECK(it != reports_.end(), base::NotFatalUntil::M130);
+    CHECK(it != reports_.end());
     it->get()->attempts++;
     context_->NotifyReportUpdated(it->get());
   }
@@ -316,7 +315,7 @@
     bool delivery_success) {
   for (const ReportingReport* report : reports) {
     auto it = reports_.find(report);
-    CHECK(it != reports_.end(), base::NotFatalUntil::M130);
+    CHECK(it != reports_.end());
 
     switch (it->get()->status) {
       case ReportingReport::Status::DOOMED:
@@ -572,7 +571,7 @@
   if (group_it == endpoint_groups_.end())
     return;
   ClientMap::iterator client_it = FindClientIt(group_key);
-  CHECK(client_it != clients_.end(), base::NotFatalUntil::M130);
+  CHECK(client_it != clients_.end());
 
   RemoveEndpointGroupInternal(client_it, group_it);
   ConsistencyCheckClients();
@@ -604,9 +603,9 @@
     DCHECK(endpoint_it->second.info.url == url);
     const ReportingEndpointGroupKey& group_key = endpoint_it->first;
     ClientMap::iterator client_it = FindClientIt(group_key);
-    CHECK(client_it != clients_.end(), base::NotFatalUntil::M130);
+    CHECK(client_it != clients_.end());
     EndpointGroupMap::iterator group_it = FindEndpointGroupIt(group_key);
-    CHECK(group_it != endpoint_groups_.end(), base::NotFatalUntil::M130);
+    CHECK(group_it != endpoint_groups_.end());
     RemoveEndpointInternal(client_it, group_it, endpoint_it);
   }
 
@@ -1047,7 +1046,7 @@
   }
   const auto it =
       isolation_info_.find(endpoint.group_key.reporting_source.value());
-  CHECK(it != isolation_info_.end(), base::NotFatalUntil::M130);
+  CHECK(it != isolation_info_.end());
   return it->second;
 }
 
@@ -1430,9 +1429,9 @@
 ReportingCacheImpl::RemoveEndpointInternal(ClientMap::iterator client_it,
                                            EndpointGroupMap::iterator group_it,
                                            EndpointMap::iterator endpoint_it) {
-  CHECK(client_it != clients_.end(), base::NotFatalUntil::M130);
-  CHECK(group_it != endpoint_groups_.end(), base::NotFatalUntil::M130);
-  CHECK(endpoint_it != endpoints_.end(), base::NotFatalUntil::M130);
+  CHECK(client_it != clients_.end());
+  CHECK(group_it != endpoint_groups_.end());
+  CHECK(endpoint_it != endpoints_.end());
 
   const ReportingEndpointGroupKey& group_key = endpoint_it->first;
   // If this is the only endpoint in the group, then removing it will cause the
@@ -1458,8 +1457,8 @@
     ClientMap::iterator client_it,
     EndpointGroupMap::iterator group_it,
     size_t* num_endpoints_removed) {
-  CHECK(client_it != clients_.end(), base::NotFatalUntil::M130);
-  CHECK(group_it != endpoint_groups_.end(), base::NotFatalUntil::M130);
+  CHECK(client_it != clients_.end());
+  CHECK(group_it != endpoint_groups_.end());
   const ReportingEndpointGroupKey& group_key = group_it->first;
 
   // Remove the endpoints for this group.
@@ -1502,7 +1501,7 @@
 
 ReportingCacheImpl::ClientMap::iterator
 ReportingCacheImpl::RemoveClientInternal(ClientMap::iterator client_it) {
-  CHECK(client_it != clients_.end(), base::NotFatalUntil::M130);
+  CHECK(client_it != clients_.end());
   const Client& client = client_it->second;
 
   // Erase all groups in this client, and all endpoints in those groups.
@@ -1532,7 +1531,7 @@
 
 void ReportingCacheImpl::EnforcePerClientAndGlobalEndpointLimits(
     ClientMap::iterator client_it) {
-  CHECK(client_it != clients_.end(), base::NotFatalUntil::M130);
+  CHECK(client_it != clients_.end());
   size_t client_endpoint_count = client_it->second.endpoint_count;
   // TODO(chlily): This is actually a limit on the endpoints for a given client
   // (for a NAK, origin pair). Rename this.
@@ -1555,7 +1554,7 @@
       }
     }
 
-    CHECK(to_evict != clients_.end(), base::NotFatalUntil::M130);
+    CHECK(to_evict != clients_.end());
 
     // Evict endpoints from the chosen client.
     size_t num_to_evict = GetEndpointCount() - max_endpoint_count;
@@ -1567,7 +1566,7 @@
 void ReportingCacheImpl::EvictEndpointsFromClient(ClientMap::iterator client_it,
                                                   size_t endpoints_to_evict) {
   DCHECK_GT(endpoints_to_evict, 0u);
-  CHECK(client_it != clients_.end(), base::NotFatalUntil::M130);
+  CHECK(client_it != clients_.end());
   const Client& client = client_it->second;
   // Cache this value as |client| may be deleted.
   size_t client_endpoint_count = client.endpoint_count;
@@ -1615,8 +1614,7 @@
         stalest_group_endpoint_count = group_endpoint_count;
       }
     }
-    CHECK(stalest_group_it != endpoint_groups_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(stalest_group_it != endpoint_groups_.end());
 
     // Evict the least important (lowest priority, lowest weight) endpoint.
     EvictEndpointFromGroup(client_it, stalest_group_it);
@@ -1640,7 +1638,7 @@
       endpoint_to_evict_it = it;
     }
   }
-  CHECK(endpoint_to_evict_it != endpoints_.end(), base::NotFatalUntil::M130);
+  CHECK(endpoint_to_evict_it != endpoints_.end());
 
   RemoveEndpointInternal(client_it, group_it, endpoint_to_evict_it);
 }
@@ -1660,7 +1658,7 @@
         ReportingEndpointGroupKey(client_it->second.network_anonymization_key,
                                   client_it->second.origin, group_name,
                                   ReportingTargetType::kDeveloper));
-    CHECK(group_it != endpoint_groups_.end(), base::NotFatalUntil::M130);
+    CHECK(group_it != endpoint_groups_.end());
     const CachedReportingEndpointGroup& group = group_it->second;
     if (group.expires < now ||
         now - group.last_used > context_->policy().max_group_staleness) {
diff --git a/net/reporting/reporting_uploader.cc b/net/reporting/reporting_uploader.cc
index 1ac85dc..0aa99d1 100644
--- a/net/reporting/reporting_uploader.cc
+++ b/net/reporting/reporting_uploader.cc
@@ -10,7 +10,6 @@
 
 #include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "net/base/elements_upload_data_stream.h"
@@ -295,7 +294,7 @@
     // Grab Upload from map, and hold on to it in a local unique_ptr so it's
     // removed at the end of the method.
     auto it = uploads_.find(request);
-    CHECK(it != uploads_.end(), base::NotFatalUntil::M130);
+    CHECK(it != uploads_.end());
     std::unique_ptr<PendingUpload> upload = std::move(it->second);
     uploads_.erase(it);
 
diff --git a/net/socket/tcp_socket_io_completion_port_win.cc b/net/socket/tcp_socket_io_completion_port_win.cc
index af084bb0..db5cc89e 100644
--- a/net/socket/tcp_socket_io_completion_port_win.cc
+++ b/net/socket/tcp_socket_io_completion_port_win.cc
@@ -556,18 +556,9 @@
 
       SCOPED_CRASH_KEY_NUMBER("TcpSocketIOCP", "ReadIfReadyError", wsa_error);
 
-      NOTREACHED(base::NotFatalUntil::M135)
-          << "ReadIfReady(). Synchronous WSARecv on socket failed "
-          << "with error: " << wsa_error
-          << " after zero byte overlapped WSARecv reported data.";
-
-      bytes_read = 0;
-
-      // If the non overlapped WSARecv call above failed to return any data, we
-      // need to handle this as an immediate completion of the zero byte
-      // overlapped WSARecv call above.
-      // See handle_immediate_completion() for details.
-      return handle_immediate_completion(bytes_read, wsa_error);
+      NOTREACHED() << "ReadIfReady(). Synchronous WSARecv on socket failed "
+                   << "with error: " << wsa_error
+                   << " after zero byte overlapped WSARecv reported data.";
     } else {
       wsa_error = ::WSAGetLastError();
     }
diff --git a/net/socket/transport_client_socket_pool.cc b/net/socket/transport_client_socket_pool.cc
index 85a7c61..1653381a 100644
--- a/net/socket/transport_client_socket_pool.cc
+++ b/net/socket/transport_client_socket_pool.cc
@@ -20,7 +20,6 @@
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/string_util.h"
 #include "base/task/single_thread_task_runner.h"
@@ -1582,7 +1581,7 @@
 
   // Check that |job| is in the list.
   auto it = std::ranges::find(jobs_, job, &std::unique_ptr<ConnectJob>::get);
-  CHECK(it != jobs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != jobs_.end());
 
   // Check if |job| is in the unassigned jobs list. If so, remove it.
   auto it2 = std::ranges::find(unassigned_jobs_, job);
diff --git a/net/spdy/http2_priority_dependencies.cc b/net/spdy/http2_priority_dependencies.cc
index c279feb6..6b92ccac 100644
--- a/net/spdy/http2_priority_dependencies.cc
+++ b/net/spdy/http2_priority_dependencies.cc
@@ -10,7 +10,6 @@
 #include <utility>
 #include <vector>
 
-#include "base/not_fatal_until.h"
 #include "base/trace_event/memory_usage_estimator.h"
 #include "net/third_party/quiche/src/quiche/http2/core/spdy_protocol.h"
 
@@ -66,7 +65,7 @@
 bool Http2PriorityDependencies::ParentOfStream(spdy::SpdyStreamId id,
                                                IdList::iterator* parent) {
   auto entry = entry_by_stream_id_.find(id);
-  CHECK(entry != entry_by_stream_id_.end(), base::NotFatalUntil::M130);
+  CHECK(entry != entry_by_stream_id_.end());
 
   spdy::SpdyPriority priority = entry->second->second;
   auto curr = entry->second;
@@ -87,7 +86,7 @@
 bool Http2PriorityDependencies::ChildOfStream(spdy::SpdyStreamId id,
                                               IdList::iterator* child) {
   auto entry = entry_by_stream_id_.find(id);
-  CHECK(entry != entry_by_stream_id_.end(), base::NotFatalUntil::M130);
+  CHECK(entry != entry_by_stream_id_.end());
 
   spdy::SpdyPriority priority = entry->second->second;
   *child = entry->second;
diff --git a/net/spdy/spdy_session_pool.cc b/net/spdy/spdy_session_pool.cc
index 9fb2d74..c8f7909 100644
--- a/net/spdy/spdy_session_pool.cc
+++ b/net/spdy/spdy_session_pool.cc
@@ -12,7 +12,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/types/expected.h"
 #include "base/values.h"
@@ -338,8 +337,7 @@
 
         auto available_session_it = LookupAvailableSessionByKey(alias_key);
         // It shouldn't be in the aliases table if it doesn't exist!
-        CHECK(available_session_it != available_sessions_.end(),
-              base::NotFatalUntil::M130);
+        CHECK(available_session_it != available_sessions_.end());
 
         SpdySessionKey::CompareForAliasingResult compare_result =
             alias_key.CompareForAliasing(key);
@@ -611,7 +609,7 @@
   DCHECK_EQ(this, request->spdy_session_pool());
 
   auto iter = spdy_session_request_map_.find(request->key());
-  CHECK(iter != spdy_session_request_map_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != spdy_session_request_map_.end());
 
   // Resume all pending requests if it is the blocking request, which is either
   // being canceled, or has completed.
diff --git a/net/tools/huffman_trie/trie/trie_bit_buffer.cc b/net/tools/huffman_trie/trie/trie_bit_buffer.cc
index 0b1b2c43..0fb0997 100644
--- a/net/tools/huffman_trie/trie/trie_bit_buffer.cc
+++ b/net/tools/huffman_trie/trie/trie_bit_buffer.cc
@@ -9,7 +9,6 @@
 #include <ostream>
 
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 #include "net/tools/huffman_trie/bit_writer.h"
 
 namespace net::huffman_trie {
@@ -84,7 +83,7 @@
                               HuffmanBuilder* huffman_builder) {
   HuffmanRepresentationTable::const_iterator item;
   item = table.find(byte);
-  CHECK(item != table.end(), base::NotFatalUntil::M130);
+  CHECK(item != table.end());
   if (huffman_builder) {
     huffman_builder->RecordUsage(byte);
   }
diff --git a/net/url_request/http_with_dns_over_https_unittest.cc b/net/url_request/http_with_dns_over_https_unittest.cc
index 03266cf2..11c18fc 100644
--- a/net/url_request/http_with_dns_over_https_unittest.cc
+++ b/net/url_request/http_with_dns_over_https_unittest.cc
@@ -266,16 +266,6 @@
 
   void OnQuicBroken() override {}
 
-  void OnSwitchesToHttpStreamPool(
-      HttpStreamPoolRequestInfo request_info) override {
-    CHECK(base::FeatureList::IsEnabled(features::kHappyEyeballsV3));
-    request_ = session_->http_stream_pool()->RequestStream(
-        this, std::move(request_info), DEFAULT_PRIORITY,
-        /*allowed_bad_certs=*/{},
-        /*enable_ip_based_pooling=*/false,
-        /*enable_alternative_services=*/false, NetLogWithSource());
-  }
-
  private:
   raw_ptr<HttpNetworkSession> session_;
   base::RunLoop loop_;
diff --git a/ppapi/proxy/audio_encoder_resource.cc b/ppapi/proxy/audio_encoder_resource.cc
index b116143e0..db410eb3 100644
--- a/ppapi/proxy/audio_encoder_resource.cc
+++ b/ppapi/proxy/audio_encoder_resource.cc
@@ -8,7 +8,6 @@
 
 #include "base/functional/bind.h"
 #include "base/memory/unsafe_shared_memory_region.h"
-#include "base/not_fatal_until.h"
 #include "ppapi/c/pp_array_output.h"
 #include "ppapi/c/pp_codecs.h"
 #include "ppapi/proxy/audio_buffer_resource.h"
@@ -259,7 +258,7 @@
     return;
 
   EncodeMap::iterator it = encode_callbacks_.find(buffer_id);
-  CHECK(encode_callbacks_.end() != it, base::NotFatalUntil::M130);
+  CHECK(encode_callbacks_.end() != it);
 
   scoped_refptr<TrackedCallback> callback = it->second;
   encode_callbacks_.erase(it);
diff --git a/ppapi/proxy/nacl_message_scanner.cc b/ppapi/proxy/nacl_message_scanner.cc
index 576f366..582ccb9 100644
--- a/ppapi/proxy/nacl_message_scanner.cc
+++ b/ppapi/proxy/nacl_message_scanner.cc
@@ -12,7 +12,6 @@
 #include <vector>
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "ipc/ipc_message.h"
 #include "ipc/ipc_message_macros.h"
@@ -521,7 +520,7 @@
 NaClMessageScanner::FileIO* NaClMessageScanner::GetFile(
     PP_Resource file_io) {
   FileIOMap::iterator it = files_.find(file_io);
-  CHECK(it != files_.end(), base::NotFatalUntil::M130);
+  CHECK(it != files_.end());
   return it->second;
 }
 
@@ -561,13 +560,13 @@
       if (ppapi::UnpackMessage<PpapiPluginMsg_FileSystem_ReserveQuotaReply>(
           msg, &amount, &file_sizes)) {
         FileSystemMap::iterator it = file_systems_.find(resource);
-        CHECK(it != file_systems_.end(), base::NotFatalUntil::M130);
+        CHECK(it != file_systems_.end());
         it->second->UpdateReservedQuota(amount);
 
         FileSizeMap::const_iterator offset_it = file_sizes.begin();
         for (; offset_it != file_sizes.end(); ++offset_it) {
           FileIOMap::iterator fio_it = files_.find(offset_it->first);
-          CHECK(fio_it != files_.end(), base::NotFatalUntil::M130);
+          CHECK(fio_it != files_.end());
           if (fio_it != files_.end())
             fio_it->second->SetMaxWrittenOffset(offset_it->second);
         }
diff --git a/ppapi/proxy/plugin_resource_tracker.cc b/ppapi/proxy/plugin_resource_tracker.cc
index f81cecaf..05278a3 100644
--- a/ppapi/proxy/plugin_resource_tracker.cc
+++ b/ppapi/proxy/plugin_resource_tracker.cc
@@ -6,7 +6,6 @@
 
 #include "base/check.h"
 #include "base/memory/singleton.h"
-#include "base/not_fatal_until.h"
 #include "ppapi/proxy/plugin_dispatcher.h"
 #include "ppapi/proxy/plugin_globals.h"
 #include "ppapi/proxy/ppapi_messages.h"
@@ -62,8 +61,7 @@
     // The host_resource will be NULL for proxy-only resources, which we
     // obviously don't need to tell the host about.
     CHECK(host_resource_map_.find(object->host_resource()) !=
-              host_resource_map_.end(),
-          base::NotFatalUntil::M130);
+          host_resource_map_.end());
     host_resource_map_.erase(object->host_resource());
 
     bool abandoned = false;
diff --git a/ppapi/proxy/plugin_var_tracker.cc b/ppapi/proxy/plugin_var_tracker.cc
index f6d5cf84..f5d662e 100644
--- a/ppapi/proxy/plugin_var_tracker.cc
+++ b/ppapi/proxy/plugin_var_tracker.cc
@@ -11,7 +11,6 @@
 #include "base/check.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/singleton.h"
-#include "base/not_fatal_until.h"
 #include "ipc/ipc_message.h"
 #include "ppapi/c/dev/ppp_class_deprecated.h"
 #include "ppapi/c/ppb_var.h"
@@ -423,8 +422,8 @@
     return false;
 
   // Clean up the host var mapping.
-  CHECK(host_var_to_plugin_var_.find(host_var) != host_var_to_plugin_var_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(host_var_to_plugin_var_.find(host_var) !=
+        host_var_to_plugin_var_.end());
   host_var_to_plugin_var_.erase(host_var);
   return true;
 }
diff --git a/ppapi/proxy/video_encoder_resource.cc b/ppapi/proxy/video_encoder_resource.cc
index 874c84ab..8bc3d00 100644
--- a/ppapi/proxy/video_encoder_resource.cc
+++ b/ppapi/proxy/video_encoder_resource.cc
@@ -9,7 +9,6 @@
 
 #include "base/functional/bind.h"
 #include "base/memory/unsafe_shared_memory_region.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "ppapi/c/pp_array_output.h"
 #include "ppapi/proxy/ppapi_messages.h"
@@ -368,7 +367,7 @@
   encoder_last_error_ = params.result();
 
   EncodeMap::iterator it = encode_callbacks_.find(video_frame);
-  CHECK(encode_callbacks_.end() != it, base::NotFatalUntil::M130);
+  CHECK(encode_callbacks_.end() != it);
 
   scoped_refptr<TrackedCallback> callback = it->second;
   encode_callbacks_.erase(it);
diff --git a/ppapi/shared_impl/callback_tracker.cc b/ppapi/shared_impl/callback_tracker.cc
index de03f32a..6113cb6 100644
--- a/ppapi/shared_impl/callback_tracker.cc
+++ b/ppapi/shared_impl/callback_tracker.cc
@@ -9,7 +9,6 @@
 #include "base/check_op.h"
 #include "base/compiler_specific.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "ppapi/c/pp_completion_callback.h"
 #include "ppapi/shared_impl/proxy_lock.h"
 #include "ppapi/shared_impl/tracked_callback.h"
@@ -82,9 +81,9 @@
   base::AutoLock acquire(lock_);
   CallbackSetMap::iterator map_it =
       pending_callbacks_.find(tracked_callback->resource_id());
-  CHECK(map_it != pending_callbacks_.end(), base::NotFatalUntil::M130);
+  CHECK(map_it != pending_callbacks_.end());
   CallbackSet::iterator it = map_it->second.find(tracked_callback);
-  CHECK(it != map_it->second.end(), base::NotFatalUntil::M130);
+  CHECK(it != map_it->second.end());
   map_it->second.erase(it);
 
   // If there are no pending callbacks left for this ID, get rid of the entry.
diff --git a/ppapi/shared_impl/ppb_video_decoder_shared.cc b/ppapi/shared_impl/ppb_video_decoder_shared.cc
index 9b2e4c9..1bc4898 100644
--- a/ppapi/shared_impl/ppb_video_decoder_shared.cc
+++ b/ppapi/shared_impl/ppb_video_decoder_shared.cc
@@ -5,7 +5,6 @@
 #include "ppapi/shared_impl/ppb_video_decoder_shared.h"
 
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 #include "gpu/command_buffer/client/gles2_implementation.h"
 #include "ppapi/c/pp_errors.h"
 #include "ppapi/shared_impl/ppb_graphics_3d_shared.h"
@@ -90,7 +89,7 @@
     int32_t result) {
   CallbackById::iterator it =
       bitstream_buffer_callbacks_.find(bitstream_buffer_id);
-  CHECK(it != bitstream_buffer_callbacks_.end(), base::NotFatalUntil::M130);
+  CHECK(it != bitstream_buffer_callbacks_.end());
   scoped_refptr<TrackedCallback> cc = it->second;
   bitstream_buffer_callbacks_.erase(it);
   cc->Run(PP_OK);
diff --git a/printing/metafile_skia.cc b/printing/metafile_skia.cc
index 0f8510e..9af473c 100644
--- a/printing/metafile_skia.cc
+++ b/printing/metafile_skia.cc
@@ -17,7 +17,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/time/time.h"
 #include "base/unguessable_token.h"
@@ -464,7 +463,7 @@
     return;
 
   auto it = data_->subframe_pics.find(content_id);
-  CHECK(it != data_->subframe_pics.end(), base::NotFatalUntil::M130);
+  CHECK(it != data_->subframe_pics.end());
 
   // Found the picture, draw it on canvas.
   sk_sp<SkPicture> pic = it->second;
diff --git a/services/audio/BUILD.gn b/services/audio/BUILD.gn
index ebff7ff..919fc66 100644
--- a/services/audio/BUILD.gn
+++ b/services/audio/BUILD.gn
@@ -18,7 +18,6 @@
     "device_listener_output_stream.h",
     "device_notifier.cc",
     "device_notifier.h",
-    "device_output_listener.h",
     "group_coordinator-impl.h",
     "group_coordinator.h",
     "in_process_audio_manager_accessor.cc",
@@ -55,6 +54,7 @@
     "realtime_audio_thread.cc",
     "realtime_audio_thread.h",
     "reference_output.h",
+    "reference_signal_provider.h",
     "service.cc",
     "service.h",
     "service_factory.cc",
@@ -97,6 +97,8 @@
     sources += [
       "audio_processor_handler.cc",
       "audio_processor_handler.h",
+      "loopback_reference_manager.cc",
+      "loopback_reference_manager.h",
       "mixing_graph.cc",
       "mixing_graph.h",
       "mixing_graph_impl.cc",
@@ -113,8 +115,6 @@
       "processing_audio_fifo.h",
       "sync_mixing_graph_input.cc",
       "sync_mixing_graph_input.h",
-      "system_loopback_listener.cc",
-      "system_loopback_listener.h",
     ]
 
     public_deps += [ "//media/webrtc" ]
diff --git a/services/audio/device_output_listener.h b/services/audio/device_output_listener.h
deleted file mode 100644
index 9ea49b2..0000000
--- a/services/audio/device_output_listener.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_AUDIO_DEVICE_OUTPUT_LISTENER_H_
-#define SERVICES_AUDIO_DEVICE_OUTPUT_LISTENER_H_
-
-#include <string>
-
-#include "services/audio/reference_output.h"
-
-namespace audio {
-
-// Interface to start/stop listening to a device's reference output.
-class DeviceOutputListener {
- public:
-  virtual ~DeviceOutputListener() = default;
-
-  // Starts listening to |device_id|'s output. Can be called multiple times
-  // without calling StopListening(); each new call will replace which device
-  // |listener| is listening to.
-  //
-  // |device_id| is expected to be a physical device ID, or the default device
-  // ID, as defined by media::AudioDeviceDescription::IsDefaultDevice().
-  //
-  // If ever |device_id|'s validity changes (after disconnecting/reconnecting a
-  // device), |listener| might start/stop receiving OnPlayoutData() calls.
-  virtual void StartListening(ReferenceOutput::Listener* listener,
-                              const std::string& device_id) = 0;
-
-  // Stop |listener| from receiving its current device's reference output.
-  // Must be called when |listener| no longer wants to receive data (e.g.
-  // before it is destroyed). StartListening() must have been called.
-  virtual void StopListening(ReferenceOutput::Listener* listener) = 0;
-};
-
-}  // namespace audio
-
-#endif  // SERVICES_AUDIO_DEVICE_OUTPUT_LISTENER_H_
diff --git a/services/audio/group_coordinator-impl.h b/services/audio/group_coordinator-impl.h
index ec96281..bf141b5c 100644
--- a/services/audio/group_coordinator-impl.h
+++ b/services/audio/group_coordinator-impl.h
@@ -10,7 +10,6 @@
 #include "base/compiler_specific.h"
 #include "base/containers/contains.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 
 #if DCHECK_IS_ON()
 #define DCHECK_INCREMENT_MUTATION_COUNT() ++mutation_count_
@@ -67,7 +66,7 @@
   const auto group_it = FindGroup(group_id);
   std::vector<Member*>& members = group_it->second.members;
   const auto member_it = std::ranges::find(members, member);
-  CHECK(member_it != members.end(), base::NotFatalUntil::M130);
+  CHECK(member_it != members.end());
   members.erase(member_it);
   DCHECK_INCREMENT_MUTATION_COUNT();
   DCHECK_REMEMBER_CURRENT_MUTATION_COUNT();
@@ -103,7 +102,7 @@
   const auto group_it = FindGroup(group_id);
   std::vector<Observer*>& observers = group_it->second.observers;
   const auto it = std::ranges::find(observers, observer);
-  CHECK(it != observers.end(), base::NotFatalUntil::M130);
+  CHECK(it != observers.end());
   observers.erase(it);
   DCHECK_INCREMENT_MUTATION_COUNT();
 
diff --git a/services/audio/input_controller.cc b/services/audio/input_controller.cc
index 45fc170..fe58b33 100644
--- a/services/audio/input_controller.cc
+++ b/services/audio/input_controller.cc
@@ -35,10 +35,10 @@
 #include "media/base/audio_processing.h"
 #include "media/base/media_switches.h"
 #include "services/audio/audio_manager_power_user.h"
-#include "services/audio/device_output_listener.h"
 #include "services/audio/output_tapper.h"
 #include "services/audio/processing_audio_fifo.h"
 #include "services/audio/reference_output.h"
+#include "services/audio/reference_signal_provider.h"
 
 #if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
 #include "services/audio/audio_processor_handler.h"
@@ -186,7 +186,7 @@
 InputController::InputController(
     EventHandler* event_handler,
     SyncWriter* sync_writer,
-    DeviceOutputListener* device_output_listener,
+    std::unique_ptr<ReferenceSignalProvider> reference_signal_provider,
     media::AecdumpRecordingManager* aecdump_recording_manager,
     media::mojom::AudioProcessingConfigPtr processing_config,
     const media::AudioParameters& output_params,
@@ -204,7 +204,7 @@
 
 #if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
   MaybeSetUpAudioProcessing(std::move(processing_config), output_params,
-                            device_params, device_output_listener,
+                            device_params, std::move(reference_signal_provider),
                             aecdump_recording_manager);
 #endif
 }
@@ -214,10 +214,11 @@
     media::mojom::AudioProcessingConfigPtr processing_config,
     const media::AudioParameters& processing_output_params,
     const media::AudioParameters& device_params,
-    DeviceOutputListener* device_output_listener,
+    std::unique_ptr<ReferenceSignalProvider> reference_signal_provider,
     media::AecdumpRecordingManager* aecdump_recording_manager) {
-  if (!device_output_listener)
+  if (!reference_signal_provider) {
     return;
+  }
 
   if (!(processing_config &&
         processing_config->settings.NeedWebrtcAudioProcessing())) {
@@ -269,7 +270,7 @@
 
   // Unretained() is safe, since |event_handler_| outlives |output_tapper_|.
   output_tapper_ = std::make_unique<OutputTapper>(
-      device_output_listener, audio_processor_handler_.get(),
+      std::move(reference_signal_provider), audio_processor_handler_.get(),
       base::BindRepeating(&EventHandler::OnLog,
                           base::Unretained(event_handler_)));
 }
@@ -287,7 +288,7 @@
     media::AudioManager* audio_manager,
     EventHandler* event_handler,
     SyncWriter* sync_writer,
-    DeviceOutputListener* device_output_listener,
+    std::unique_ptr<ReferenceSignalProvider> reference_signal_provider,
     media::AecdumpRecordingManager* aecdump_recording_manager,
     media::mojom::AudioProcessingConfigPtr processing_config,
     const media::AudioParameters& params,
@@ -310,7 +311,7 @@
   // Using `new` to access a non-public constructor.
   std::unique_ptr<InputController> controller =
       base::WrapUnique(new InputController(
-          event_handler, sync_writer, device_output_listener,
+          event_handler, sync_writer, std::move(reference_signal_provider),
           aecdump_recording_manager, std::move(processing_config), params,
           device_params, ParamsToStreamType(params)));
 
diff --git a/services/audio/input_controller.h b/services/audio/input_controller.h
index 208ad01..c33560b 100644
--- a/services/audio/input_controller.h
+++ b/services/audio/input_controller.h
@@ -40,7 +40,7 @@
 namespace audio {
 class AudioProcessorHandler;
 class AudioCallback;
-class DeviceOutputListener;
+class ReferenceSignalProvider;
 class OutputTapper;
 
 #if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
@@ -184,7 +184,7 @@
       media::AudioManager* audio_manager,
       EventHandler* event_handler,
       SyncWriter* sync_writer,
-      DeviceOutputListener* device_output_listener,
+      std::unique_ptr<ReferenceSignalProvider> reference_signal_provider,
       media::AecdumpRecordingManager* aecdump_recording_manager,
       media::mojom::AudioProcessingConfigPtr processing_config,
       const media::AudioParameters& params,
@@ -229,14 +229,15 @@
     CAPTURE_STARTUP_RESULT_MAX = CAPTURE_STARTUP_STOPPED_EARLY,
   };
 
-  InputController(EventHandler* event_handler,
-                  SyncWriter* sync_writer,
-                  DeviceOutputListener* device_output_listener,
-                  media::AecdumpRecordingManager* aecdump_recording_manager,
-                  media::mojom::AudioProcessingConfigPtr processing_config,
-                  const media::AudioParameters& output_params,
-                  const media::AudioParameters& device_params,
-                  StreamType type);
+  InputController(
+      EventHandler* event_handler,
+      SyncWriter* sync_writer,
+      std::unique_ptr<ReferenceSignalProvider> reference_signal_provider,
+      media::AecdumpRecordingManager* aecdump_recording_manager,
+      media::mojom::AudioProcessingConfigPtr processing_config,
+      const media::AudioParameters& output_params,
+      const media::AudioParameters& device_params,
+      StreamType type);
 
   void DoCreate(media::AudioManager* audio_manager,
                 const media::AudioParameters& params,
@@ -289,7 +290,7 @@
       media::mojom::AudioProcessingConfigPtr processing_config,
       const media::AudioParameters& processing_output_params,
       const media::AudioParameters& device_params,
-      DeviceOutputListener* device_output_listener,
+      std::unique_ptr<ReferenceSignalProvider> reference_signal_provider,
       media::AecdumpRecordingManager* aecdump_recording_manager);
 
   // Used as a callback for |audio_processor_handler_|.
diff --git a/services/audio/input_controller_unittest.cc b/services/audio/input_controller_unittest.cc
index 727996e..5930cd1 100644
--- a/services/audio/input_controller_unittest.cc
+++ b/services/audio/input_controller_unittest.cc
@@ -26,9 +26,9 @@
 #include "media/base/audio_processing.h"
 #include "media/base/media_switches.h"
 #include "mojo/public/cpp/bindings/remote.h"
-#include "services/audio/device_output_listener.h"
 #include "services/audio/processing_audio_fifo.h"
 #include "services/audio/reference_output.h"
+#include "services/audio/reference_signal_provider.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -387,10 +387,10 @@
   raw_ptr<InputController> controller_;
 };
 
-class MockDeviceOutputListener : public DeviceOutputListener {
+class MockReferenceSignalProvider : public ReferenceSignalProvider {
  public:
-  MockDeviceOutputListener() = default;
-  ~MockDeviceOutputListener() override = default;
+  MockReferenceSignalProvider() = default;
+  ~MockReferenceSignalProvider() override = default;
 
   MOCK_METHOD2(StartListening,
                void(ReferenceOutput::Listener*, const std::string&));
@@ -407,9 +407,10 @@
     // https://stackoverflow.com/q/4643074
     this->controller_ = InputController::Create(
         this->audio_manager_.get(), &this->event_handler_, &this->sync_writer_,
-        &this->device_output_listener_, &this->aecdump_recording_manager_,
-        std::move(processing_config_), this->params_,
-        media::AudioDeviceDescription::kDefaultDeviceId, false);
+        std::unique_ptr<ReferenceSignalProvider>(
+            this->reference_signal_provider_),
+        &this->aecdump_recording_manager_, std::move(processing_config_),
+        this->params_, media::AudioDeviceDescription::kDefaultDeviceId, false);
 
     helper_ =
         std::make_unique<InputControllerTestHelper>(this->controller_.get());
@@ -444,7 +445,13 @@
         remote_controls_.BindNewPipeAndPassReceiver(), settings);
   }
 
-  NiceMock<MockDeviceOutputListener> device_output_listener_;
+  // The MockReferenceSignalProvider will be destroyed automatically when the
+  // InputController is destroyed. We retain a pointer to it to be able to
+  // expect mock calls. It will be dangling between the destruction of the
+  // InputController and the destruction of the test suite, so we disable
+  // dangling pointer detection.
+  raw_ptr<NiceMock<MockReferenceSignalProvider>, DisableDanglingPtrDetection>
+      reference_signal_provider_ = new NiceMock<MockReferenceSignalProvider>();
   media::mojom::AudioProcessingConfigPtr processing_config_;
   mojo::Remote<media::mojom::AudioProcessorControls> remote_controls_;
   std::unique_ptr<InputControllerTestHelper> helper_;
@@ -527,8 +534,8 @@
   base::test::ScopedFeatureList features;
   const std::string kOutputDeviceId = "0x123";
 
-  EXPECT_CALL(device_output_listener_, StartListening(_, _)).Times(0);
-  EXPECT_CALL(device_output_listener_, StopListening(_)).Times(0);
+  EXPECT_CALL(*reference_signal_provider_, StartListening(_, _)).Times(0);
+  EXPECT_CALL(*reference_signal_provider_, StopListening(_)).Times(0);
 
   SetupProcessingConfig(AudioProcessingType::kWithoutPlayoutReference);
   CreateAudioController();
@@ -550,10 +557,10 @@
   const std::string kOutputDeviceId = "0x123";
 
   // Calling Record() will start listening to the "" device by default.
-  EXPECT_CALL(device_output_listener_, StartListening(_, "")).Times(1);
-  EXPECT_CALL(device_output_listener_, StartListening(_, kOutputDeviceId))
+  EXPECT_CALL(*reference_signal_provider_, StartListening(_, "")).Times(1);
+  EXPECT_CALL(*reference_signal_provider_, StartListening(_, kOutputDeviceId))
       .Times(1);
-  EXPECT_CALL(device_output_listener_, StopListening(_)).Times(1);
+  EXPECT_CALL(*reference_signal_provider_, StopListening(_)).Times(1);
 
   SetupProcessingConfig(AudioProcessingType::kWithPlayoutReference);
   CreateAudioController();
@@ -574,9 +581,9 @@
 
 TEST_P(InputControllerTestWithDeviceListener, RecordAfterSetOutputForAec) {
   const std::string kOutputDeviceId = "0x123";
-  EXPECT_CALL(device_output_listener_, StartListening(_, kOutputDeviceId))
+  EXPECT_CALL(*reference_signal_provider_, StartListening(_, kOutputDeviceId))
       .Times(1);
-  EXPECT_CALL(device_output_listener_, StopListening(_)).Times(1);
+  EXPECT_CALL(*reference_signal_provider_, StopListening(_)).Times(1);
 
   SetupProcessingConfig(AudioProcessingType::kWithPlayoutReference);
   CreateAudioController();
@@ -597,9 +604,9 @@
 
 TEST_P(InputControllerTestWithDeviceListener, FifoSize) {
   const std::string kOutputDeviceId = "0x123";
-  EXPECT_CALL(device_output_listener_, StartListening(_, kOutputDeviceId))
+  EXPECT_CALL(*reference_signal_provider_, StartListening(_, kOutputDeviceId))
       .Times(1);
-  EXPECT_CALL(device_output_listener_, StopListening(_)).Times(1);
+  EXPECT_CALL(*reference_signal_provider_, StopListening(_)).Times(1);
 
   SetupProcessingConfig(AudioProcessingType::kWithPlayoutReference);
   CreateAudioController();
@@ -629,13 +636,14 @@
   const std::string kOtherOutputDeviceId = "0x987";
 
   // Each output ID should receive one call to StartListening().
-  EXPECT_CALL(device_output_listener_, StartListening(_, kOutputDeviceId))
+  EXPECT_CALL(*reference_signal_provider_, StartListening(_, kOutputDeviceId))
       .Times(1);
-  EXPECT_CALL(device_output_listener_, StartListening(_, kOtherOutputDeviceId))
+  EXPECT_CALL(*reference_signal_provider_,
+              StartListening(_, kOtherOutputDeviceId))
       .Times(1);
 
   // StopListening() should be called once, regardless of how many ID changes.
-  EXPECT_CALL(device_output_listener_, StopListening(_)).Times(1);
+  EXPECT_CALL(*reference_signal_provider_, StopListening(_)).Times(1);
 
   SetupProcessingConfig(AudioProcessingType::kWithPlayoutReference);
   CreateAudioController();
diff --git a/services/audio/input_stream.cc b/services/audio/input_stream.cc
index 3fa2a9e..23bf4344 100644
--- a/services/audio/input_stream.cc
+++ b/services/audio/input_stream.cc
@@ -21,6 +21,7 @@
 #include "mojo/public/cpp/system/handle.h"
 #include "mojo/public/cpp/system/platform_handle.h"
 #include "services/audio/input_sync_writer.h"
+#include "services/audio/reference_signal_provider.h"
 
 namespace audio {
 
@@ -70,7 +71,7 @@
     mojo::PendingRemote<media::mojom::AudioLog> log,
     media::AudioManager* audio_manager,
     media::AecdumpRecordingManager* aecdump_recording_manager,
-    DeviceOutputListener* device_output_listener,
+    std::unique_ptr<ReferenceSignalProvider> reference_signal_provider,
     media::mojom::AudioProcessingConfigPtr processing_config,
     const std::string& device_id,
     const media::AudioParameters& params,
@@ -129,7 +130,7 @@
   }
 
   controller_ = InputController::Create(
-      audio_manager, this, writer_.get(), device_output_listener,
+      audio_manager, this, writer_.get(), std::move(reference_signal_provider),
       aecdump_recording_manager, std::move(processing_config), params,
       device_id, enable_agc);
 }
diff --git a/services/audio/input_stream.h b/services/audio/input_stream.h
index e5118c61..468cd962 100644
--- a/services/audio/input_stream.h
+++ b/services/audio/input_stream.h
@@ -29,7 +29,6 @@
 }  // namespace media
 
 namespace audio {
-class DeviceOutputListener;
 class InputSyncWriter;
 
 class InputStream final : public media::mojom::AudioInputStream,
@@ -50,7 +49,7 @@
       mojo::PendingRemote<media::mojom::AudioLog> log,
       media::AudioManager* manager,
       media::AecdumpRecordingManager* aecdump_recording_manager,
-      DeviceOutputListener* device_output_listener,
+      std::unique_ptr<ReferenceSignalProvider> reference_signal_provider,
       media::mojom::AudioProcessingConfigPtr processing_config,
       const std::string& device_id,
       const media::AudioParameters& params,
diff --git a/services/audio/loopback_reference_manager.cc b/services/audio/loopback_reference_manager.cc
new file mode 100644
index 0000000..a8fbc26
--- /dev/null
+++ b/services/audio/loopback_reference_manager.cc
@@ -0,0 +1,219 @@
+// 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 "services/audio/loopback_reference_manager.h"
+
+#include <memory>
+
+#include "base/containers/flat_set.h"
+#include "base/functional/callback.h"
+#include "base/logging.h"
+#include "base/memory/weak_ptr.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/strings/strcat.h"
+#include "base/synchronization/lock.h"
+#include "base/time/time.h"
+#include "base/trace_event/trace_event.h"
+#include "media/audio/audio_device_description.h"
+#include "media/audio/audio_io.h"
+#include "media/base/audio_bus.h"
+#include "services/audio/audio_manager_power_user.h"
+#include "services/audio/reference_signal_provider.h"
+
+// The design of LoopbackReferenceManager is divided into three classes:
+//
+// * LoopbackReferenceManager is a singleton in the AudioService, and is
+// responsible for creating LoopbackReferenceProviders for the caller. It owns
+// up to one lazily created LoopbackReferenceManagerCore, which the created
+// LoopbackReferenceProviders get a weak reference to.
+//
+// * LoopbackReferenceManagerCore contains the logic for starting and stopping
+// the loopback stream, as well as delivering data to the listeners. If the core
+// experiences an error, it will be destroyed (not implemented yet because error
+// handling is not imlpemented).
+//
+// * LoopbackReferenceProvider implements ReferenceSignalProvider. Each
+// LoopbackReferenceProvider contains a weak pointer to a
+// LoopbackReferenceManagerCore, which it forwards StartListening() and
+// StopListening() to. If the core has been destroyed due to an error, it does
+// nothing (this cannot happen yet because error handling is not implemented).
+
+namespace audio {
+
+// Tracks ReferenceOutput::Listeners. When there are at least one listener, it
+// creates a system loopback stream and forwards the audio to the listeners.
+class LoopbackReferenceManagerCore
+    : public media::AudioInputStream::AudioInputCallback {
+ public:
+  explicit LoopbackReferenceManagerCore(media::AudioManager* audio_manager)
+      : audio_manager_(audio_manager) {}
+
+  LoopbackReferenceManagerCore(const LoopbackReferenceManagerCore&) = delete;
+  LoopbackReferenceManagerCore& operator=(const LoopbackReferenceManagerCore&) =
+      delete;
+
+  ~LoopbackReferenceManagerCore() override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+    EnsureLoopbackStreamClosed();
+  }
+
+  void StartListening(ReferenceOutput::Listener* listener,
+                      const std::string& device_id) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+    EnsureLoopbackStreamStarted();
+    base::AutoLock scoped_lock(lock_);
+    listeners_.insert(listener);
+  }
+
+  void StopListening(ReferenceOutput::Listener* listener) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+    bool is_empty;
+    {
+      base::AutoLock scoped_lock(lock_);
+      listeners_.erase(listener);
+      is_empty = listeners_.empty();
+    }
+    if (is_empty) {
+      // TODO(crbug.com/412581642): Close after a delay instead, in case we are
+      // calling StartListening() again soon.
+      EnsureLoopbackStreamClosed();
+    }
+  }
+
+  base::WeakPtr<LoopbackReferenceManagerCore> GetWeakPtr() {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+    return weak_ptr_factory_.GetWeakPtr();
+  }
+
+  // AudioInputCallback implementation
+  void OnData(const media::AudioBus* source,
+              base::TimeTicks capture_time,
+              double volume,
+              const media::AudioGlitchInfo& audio_glitch_info) override {
+    base::AutoLock scoped_lock(lock_);
+    for (ReferenceOutput::Listener* listener : listeners_) {
+      // Since we are using a loopback signal, the audio has likely already been
+      // played out at this point, so the delay would be negative. To avoid
+      // confusion in the AudioProcessor, we set it to 0 for now.
+      // TODO(crbug.com/412581642): Figure out the correct value for this delay.
+      listener->OnPlayoutData(*source, sample_rate_,
+                              /*audio_delay=*/base::TimeDelta());
+    }
+  }
+
+  void OnError() override {
+    // TODO(crbug.com/412581642): Handle errors.
+    LOG(ERROR) << "System loopback AEC reference stream failed.";
+  }
+
+ private:
+  void EnsureLoopbackStreamStarted() {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+    if (loopback_stream_) {
+      return;
+    }
+    // Capture audio from all audio devices, or equivalently, audio from all
+    // PIDs playing out audio.
+    const std::string loopback_device_id =
+        media::AudioDeviceDescription::kLoopbackAllDevicesId;
+
+    // TODO(crbug.com/412581642): Determine optimal parameters.
+    const media::AudioParameters params =
+        AudioManagerPowerUser(audio_manager_)
+            .GetInputStreamParameters(loopback_device_id);
+    sample_rate_ = params.sample_rate();
+
+    // TODO(crbug.com/412581642): Add a different AudioComponent for the
+    // reference loopback streams and show them in chrome://media-internals
+    audio_log_ = audio_manager_->CreateAudioLog(
+        media::AudioLogFactory::AudioComponent::kAudioInputController,
+        next_loopback_stream_id_++);
+
+    loopback_stream_ = audio_manager_->MakeAudioInputStream(
+        params, loopback_device_id,
+        base::BindRepeating(&media::AudioLog::OnLogMessage,
+                            base::Unretained(audio_log_.get())));
+    loopback_stream_->Open();
+    audio_log_->OnCreated(params, loopback_device_id);
+    loopback_stream_->Start(this);
+    audio_log_->OnStarted();
+  }
+
+  void EnsureLoopbackStreamClosed() {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+    if (!loopback_stream_) {
+      return;
+    }
+    loopback_stream_->Stop();
+    audio_log_->OnStopped();
+    // The the stream will destroy itself upon Close(), so we use
+    // ExtractAsDangling() to clear the raw_ptr first.
+    loopback_stream_.ExtractAsDangling()->Close();
+    audio_log_->OnClosed();
+    audio_log_.reset();
+  }
+
+  SEQUENCE_CHECKER(owning_sequence_);
+  const raw_ptr<media::AudioManager> audio_manager_;
+  raw_ptr<media::AudioInputStream> loopback_stream_ = nullptr;
+  std::unique_ptr<media::AudioLog> audio_log_;
+  // To differentiate the streams that LoopbackReferenceManagerCore creates from
+  // the InputControllers, we start their ids at 1000000.
+  // TODO(crbug.com/412581642): Remove this hack once the reference streams get
+  // their own category.
+  int next_loopback_stream_id_ = 1000000;
+  int sample_rate_;
+
+  base::Lock lock_;
+  base::flat_set<ReferenceOutput::Listener*> listeners_ GUARDED_BY(lock_);
+
+  base::WeakPtrFactory<LoopbackReferenceManagerCore> weak_ptr_factory_{this};
+};
+
+// Contains a weak pointer to a LoopbackReferenceManagerCore, and forwards its
+// calls to it. If the core has been destroyed due to an error, all its
+// operations become safe no-ops. (not implemented yet).
+class LoopbackReferenceProvider : public ReferenceSignalProvider {
+ public:
+  LoopbackReferenceProvider(base::WeakPtr<LoopbackReferenceManagerCore> core)
+      : core_(core) {}
+
+  void StartListening(ReferenceOutput::Listener* listener,
+                      const std::string& device_id) final {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+    DCHECK(core_);
+    if (core_) {
+      core_->StartListening(listener, device_id);
+    }
+  }
+
+  void StopListening(ReferenceOutput::Listener* listener) final {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+    DCHECK(core_);
+    if (core_) {
+      core_->StopListening(listener);
+    }
+  }
+
+ private:
+  SEQUENCE_CHECKER(owning_sequence_);
+  base::WeakPtr<LoopbackReferenceManagerCore> core_;
+};
+
+LoopbackReferenceManager::LoopbackReferenceManager(
+    media::AudioManager* audio_manager)
+    : audio_manager_(audio_manager) {}
+
+std::unique_ptr<ReferenceSignalProvider>
+LoopbackReferenceManager::GetReferenceSignalProvider() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+  if (!core_) {
+    core_ = std::make_unique<LoopbackReferenceManagerCore>(audio_manager_);
+  }
+  return std::make_unique<LoopbackReferenceProvider>(core_->GetWeakPtr());
+}
+
+LoopbackReferenceManager::~LoopbackReferenceManager() = default;
+
+}  // namespace audio
diff --git a/services/audio/loopback_reference_manager.h b/services/audio/loopback_reference_manager.h
new file mode 100644
index 0000000..23e3222
--- /dev/null
+++ b/services/audio/loopback_reference_manager.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 SERVICES_AUDIO_LOOPBACK_REFERENCE_MANAGER_H_
+#define SERVICES_AUDIO_LOOPBACK_REFERENCE_MANAGER_H_
+
+#include <string>
+#include <string_view>
+
+#include "base/memory/raw_ptr.h"
+#include "base/sequence_checker.h"
+#include "media/audio/audio_manager.h"
+#include "services/audio/reference_signal_provider.h"
+
+namespace audio {
+
+class LoopbackReferenceManagerCore;
+
+// Singleton in the AudioService.
+//
+// 1) Owns a single system loopback stream and manages its lifetime. It is
+// created/deleted on demand when listeners are added/removed.
+//
+// 2) Produces ReferenceSignalProviders which subscribe to the loopback stream
+// and provide its data as the reference signal.
+//
+// TODO(crbug.com/412581642): Add tests.
+class LoopbackReferenceManager : public ReferenceSignalProviderFactory {
+ public:
+  explicit LoopbackReferenceManager(media::AudioManager* audio_manager);
+  LoopbackReferenceManager(const LoopbackReferenceManager&) = delete;
+  LoopbackReferenceManager& operator=(const LoopbackReferenceManager&) = delete;
+  ~LoopbackReferenceManager() override;
+
+  // ReferenceSignalProviderFactory implementation
+  std::unique_ptr<ReferenceSignalProvider> GetReferenceSignalProvider() final;
+
+ private:
+  SEQUENCE_CHECKER(owning_sequence_);
+  const raw_ptr<media::AudioManager> audio_manager_;
+  std::unique_ptr<LoopbackReferenceManagerCore> core_;
+};
+
+}  // namespace audio
+
+#endif  // SERVICES_AUDIO_LOOPBACK_REFERENCE_MANAGER_H_
diff --git a/services/audio/loopback_stream.cc b/services/audio/loopback_stream.cc
index cfc3665f..a5fb7ee 100644
--- a/services/audio/loopback_stream.cc
+++ b/services/audio/loopback_stream.cc
@@ -10,7 +10,6 @@
 
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/sync_socket.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/time/default_tick_clock.h"
@@ -263,7 +262,7 @@
 
   base::AutoLock scoped_lock(lock_);
   const auto it = std::ranges::find(inputs_, node);
-  CHECK(it != inputs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != inputs_.end());
   inputs_.erase(it);
 }
 
diff --git a/services/audio/mixing_graph_impl.cc b/services/audio/mixing_graph_impl.cc
index 703e44c..eaebea0 100644
--- a/services/audio/mixing_graph_impl.cc
+++ b/services/audio/mixing_graph_impl.cc
@@ -7,7 +7,6 @@
 
 #include "base/compiler_specific.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/trace_event/trace_event.h"
 #include "media/base/audio_timestamp_helper.h"
 #include "media/base/loopback_audio_converter.h"
@@ -183,7 +182,7 @@
   }
 
   auto converter = converters_.find(key);
-  CHECK(converter != converters_.end(), base::NotFatalUntil::M130);
+  CHECK(converter != converters_.end());
   media::LoopbackAudioConverter* parent = converter->second.get();
   {
     base::AutoLock scoped_lock(lock_);
diff --git a/services/audio/output_controller.cc b/services/audio/output_controller.cc
index 8133b3b..7efccc22 100644
--- a/services/audio/output_controller.cc
+++ b/services/audio/output_controller.cc
@@ -18,7 +18,6 @@
 #include "base/functional/callback_helpers.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/to_string.h"
@@ -541,7 +540,7 @@
   // The list will only update on this thread, and only be read on the realtime
   // audio thread.
   const auto it = std::ranges::find(snoopers_, snooper);
-  CHECK(it != snoopers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != snoopers_.end());
   // We also don't care about ordering, so swap and pop rather than erase.
   base::AutoLock lock(snooper_lock_);
   *it = snoopers_.back();
diff --git a/services/audio/output_device_mixer_impl.cc b/services/audio/output_device_mixer_impl.cc
index f1d368b..29813fe2 100644
--- a/services/audio/output_device_mixer_impl.cc
+++ b/services/audio/output_device_mixer_impl.cc
@@ -10,7 +10,6 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/strcat.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
@@ -477,7 +476,7 @@
   {
     base::AutoLock scoped_lock(listener_lock_);
     auto iter = listeners_.find(listener);
-    CHECK(iter != listeners_.end(), base::NotFatalUntil::M130);
+    CHECK(iter != listeners_.end());
     listeners_.erase(iter);
   }
 
@@ -612,7 +611,7 @@
   DCHECK(!base::Contains(active_tracks_, mix_track));
 
   auto iter = mix_tracks_.find(mix_track);
-  CHECK(iter != mix_tracks_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != mix_tracks_.end());
 
   mix_tracks_.erase(iter);
 }
diff --git a/services/audio/output_device_mixer_manager.cc b/services/audio/output_device_mixer_manager.cc
index 75110125..09b78e7 100644
--- a/services/audio/output_device_mixer_manager.cc
+++ b/services/audio/output_device_mixer_manager.cc
@@ -43,6 +43,39 @@
 
 namespace audio {
 
+class OutputDeviceMixerReferenceProvider : public ReferenceSignalProvider {
+ public:
+  OutputDeviceMixerReferenceProvider(
+      OutputDeviceMixerManager* output_device_mixer_manager)
+      : output_device_mixer_manager_(output_device_mixer_manager) {}
+
+  void StartListening(ReferenceOutput::Listener* listener,
+                      const std::string& device_id) final {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+    output_device_mixer_manager_->StartListening(listener, device_id);
+  }
+
+  void StopListening(ReferenceOutput::Listener* listener) final {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+    output_device_mixer_manager_->StopListening(listener);
+  }
+
+ private:
+  SEQUENCE_CHECKER(owning_sequence_);
+
+  // Ownership of the OutputDeviceMixerReferenceProvider goes:
+  // StreamFactory -> InputStream -> InputController -> OutputTapper ->
+  // ReferenceSignalProvider
+  //
+  // Ownership of the OutputDeviceMixerManager goes:
+  // StreamFactory -> OutputDeviceMixerManager
+  //
+  // Since input_streams_ is destroyed before output_device_mixer_manager_ in
+  // services/audio/stream_factory.h, this pointer will never be dangling.
+  const raw_ptr<OutputDeviceMixerManager> output_device_mixer_manager_
+      GUARDED_BY_CONTEXT(owning_sequence_);
+};
+
 OutputDeviceMixerManager::OutputDeviceMixerManager(
     media::AudioManager* audio_manager,
     OutputDeviceMixer::CreateCallback create_mixer_callback)
@@ -136,6 +169,12 @@
   mixer->StartListening(listener);
 }
 
+std::unique_ptr<ReferenceSignalProvider>
+OutputDeviceMixerManager::GetReferenceSignalProvider() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+  return std::make_unique<OutputDeviceMixerReferenceProvider>(this);
+}
+
 void OutputDeviceMixerManager::StartListening(
     ReferenceOutput::Listener* listener,
     const std::string& output_device_id) {
diff --git a/services/audio/output_device_mixer_manager.h b/services/audio/output_device_mixer_manager.h
index f48d6784..ea32e770 100644
--- a/services/audio/output_device_mixer_manager.h
+++ b/services/audio/output_device_mixer_manager.h
@@ -15,9 +15,9 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "media/base/audio_parameters.h"
-#include "services/audio/device_output_listener.h"
 #include "services/audio/output_device_mixer.h"
 #include "services/audio/reference_output.h"
+#include "services/audio/reference_signal_provider.h"
 
 namespace media {
 class AudioManager;
@@ -26,12 +26,14 @@
 
 namespace audio {
 
+class OutputDeviceMixerReferenceProvider;
+
 // Creates OutputDeviceMixers as needed, when playback is requested through
 // MakeOutputStream(). OutputDeviceMixers are destroyed on device change, or
 // when the Audio service shuts down, but are not cleaned up otherwise.
 // Listening to a device has no effect, until that device's OutputDeviceMixer is
 // created and playback has started.
-class OutputDeviceMixerManager : public DeviceOutputListener {
+class OutputDeviceMixerManager : public ReferenceSignalProviderFactory {
  public:
   OutputDeviceMixerManager(
       media::AudioManager* audio_manager,
@@ -48,13 +50,18 @@
       const media::AudioParameters& params,
       base::OnceClosure close_stream_on_device_change);
 
-  // DeviceOutputListener implementation
-  void StartListening(ReferenceOutput::Listener* listener,
-                      const std::string& device_id) final;
-  void StopListening(ReferenceOutput::Listener* listener) final;
+  // ReferenceSignalProviderFactory implementation. Needs to be called on the
+  // same sequence that OutputDeviceMixerManager was created on.
+  std::unique_ptr<ReferenceSignalProvider> GetReferenceSignalProvider() final;
 
  private:
   friend class OutputDeviceMixerManagerTest;
+  friend class OutputDeviceMixerReferenceProvider;
+
+  // Corresponds to the ReferenceSignalProvider interface
+  void StartListening(ReferenceOutput::Listener* listener,
+                      const std::string& device_id);
+  void StopListening(ReferenceOutput::Listener* listener);
 
   using OutputDeviceMixers = std::vector<std::unique_ptr<OutputDeviceMixer>>;
   using ListenerToDeviceMap =
@@ -113,7 +120,6 @@
   base::WeakPtrFactory<OutputDeviceMixerManager> device_change_weak_ptr_factory_
       GUARDED_BY_CONTEXT(owning_sequence_);
 };
-
 }  // namespace audio
 
 #endif  // SERVICES_AUDIO_OUTPUT_DEVICE_MIXER_MANAGER_H_
diff --git a/services/audio/output_device_mixer_manager_unittest.cc b/services/audio/output_device_mixer_manager_unittest.cc
index c9f4214a..c8a7fdbc 100644
--- a/services/audio/output_device_mixer_manager_unittest.cc
+++ b/services/audio/output_device_mixer_manager_unittest.cc
@@ -152,7 +152,9 @@
             &audio_manager_,
             base::BindRepeating(
                 &OutputDeviceMixerManagerTest::CreateOutputDeviceMixerCalled,
-                base::Unretained(this))) {
+                base::Unretained(this))),
+        reference_signal_provider_(
+            output_mixer_manager_.GetReferenceSignalProvider()) {
     EXPECT_CALL(audio_manager_, GetOutputStreamParameters(_))
         .WillRepeatedly(Return(default_params_));
 
@@ -370,6 +372,7 @@
   AudioParameters default_params_;
   NiceMock<LocalMockAudioManager> audio_manager_;
   OutputDeviceMixerManager output_mixer_manager_;
+  std::unique_ptr<ReferenceSignalProvider> reference_signal_provider_;
 
  private:
   std::unique_ptr<NiceMock<MockListener>> GetListenerWithStartStopExpectations(
@@ -926,8 +929,8 @@
   StrictMock<MockListener> listener;
 
   // Attach/detach multiple listeners to/from multiple devices.
-  output_mixer_manager_.StartListening(&listener, kFakeDeviceId);
-  output_mixer_manager_.StopListening(&listener);
+  reference_signal_provider_->StartListening(&listener, kFakeDeviceId);
+  reference_signal_provider_->StopListening(&listener);
 }
 
 // Attach/detach listeners to multiple devices with no mixers.
@@ -938,11 +941,11 @@
   StrictMock<MockListener> listener_a;
   StrictMock<MockListener> listener_b;
 
-  output_mixer_manager_.StartListening(&listener_a, kFakeDeviceId);
-  output_mixer_manager_.StartListening(&listener_b, kOtherFakeDeviceId);
+  reference_signal_provider_->StartListening(&listener_a, kFakeDeviceId);
+  reference_signal_provider_->StartListening(&listener_b, kOtherFakeDeviceId);
 
-  output_mixer_manager_.StopListening(&listener_a);
-  output_mixer_manager_.StopListening(&listener_b);
+  reference_signal_provider_->StopListening(&listener_a);
+  reference_signal_provider_->StopListening(&listener_b);
 }
 
 // Attach/detach multiple listeners to a single device with no mixer.
@@ -953,11 +956,11 @@
   StrictMock<MockListener> listener_a;
   StrictMock<MockListener> listener_b;
 
-  output_mixer_manager_.StartListening(&listener_a, kFakeDeviceId);
-  output_mixer_manager_.StartListening(&listener_b, kFakeDeviceId);
+  reference_signal_provider_->StartListening(&listener_a, kFakeDeviceId);
+  reference_signal_provider_->StartListening(&listener_b, kFakeDeviceId);
 
-  output_mixer_manager_.StopListening(&listener_a);
-  output_mixer_manager_.StopListening(&listener_b);
+  reference_signal_provider_->StopListening(&listener_a);
+  reference_signal_provider_->StopListening(&listener_b);
 }
 
 // Attach/detach to the reserved device.
@@ -967,8 +970,8 @@
 
   StrictMock<MockListener> listener;
 
-  output_mixer_manager_.StartListening(&listener, reserved_device_id());
-  output_mixer_manager_.StopListening(&listener);
+  reference_signal_provider_->StartListening(&listener, reserved_device_id());
+  reference_signal_provider_->StopListening(&listener);
 }
 
 // Listeners are attached as they are added.
@@ -978,8 +981,9 @@
   auto listener = GetListener_MixerExpectsStartStop(mixer);
 
   ForceOutputMixerCreation(kOtherFakeDeviceId);
-  output_mixer_manager_.StartListening(listener.get(), kOtherFakeDeviceId);
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StartListening(listener.get(),
+                                             kOtherFakeDeviceId);
+  reference_signal_provider_->StopListening(listener.get());
 }
 
 // Listeners are attached on mixer creation.
@@ -988,9 +992,10 @@
 
   auto listener = GetListener_MixerExpectsStartStop(mixer);
 
-  output_mixer_manager_.StartListening(listener.get(), kOtherFakeDeviceId);
+  reference_signal_provider_->StartListening(listener.get(),
+                                             kOtherFakeDeviceId);
   ForceOutputMixerCreation(kOtherFakeDeviceId);
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StopListening(listener.get());
 }
 
 // Removed listeners are not attached.
@@ -999,8 +1004,9 @@
 
   auto listener = GetListener_MixerExpectsNoCalls(mixer);
 
-  output_mixer_manager_.StartListening(listener.get(), kOtherFakeDeviceId);
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StartListening(listener.get(),
+                                             kOtherFakeDeviceId);
+  reference_signal_provider_->StopListening(listener.get());
   ForceOutputMixerCreation(kOtherFakeDeviceId);
 }
 
@@ -1015,9 +1021,9 @@
   auto listener = GetListener_MixerExpectsStartStop(mixer);
 
   ForceOutputMixerCreation(current_reserved_physical_device());
-  output_mixer_manager_.StartListening(listener.get(),
-                                       current_reserved_physical_device());
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StartListening(
+      listener.get(), current_reserved_physical_device());
+  reference_signal_provider_->StopListening(listener.get());
 }
 
 // Listeners are attached on mixer creation.
@@ -1030,10 +1036,10 @@
 
   auto listener = GetListener_MixerExpectsStartStop(mixer);
 
-  output_mixer_manager_.StartListening(listener.get(),
-                                       current_reserved_physical_device());
+  reference_signal_provider_->StartListening(
+      listener.get(), current_reserved_physical_device());
   ForceOutputMixerCreation(current_reserved_physical_device());
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StopListening(listener.get());
 }
 
 // Removed listeners are not attached.
@@ -1046,9 +1052,9 @@
 
   auto listener = GetListener_MixerExpectsNoCalls(mixer);
 
-  output_mixer_manager_.StartListening(listener.get(),
-                                       current_reserved_physical_device());
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StartListening(
+      listener.get(), current_reserved_physical_device());
+  reference_signal_provider_->StopListening(listener.get());
   ForceOutputMixerCreation(current_reserved_physical_device());
 }
 
@@ -1060,11 +1066,11 @@
   auto listener = GetListener_MixerExpectsStart(default_mixer);
   auto removed_listener = GetListener_MixerExpectsNoCalls(default_mixer);
 
-  output_mixer_manager_.StartListening(listener.get(),
-                                       current_default_physical_device());
-  output_mixer_manager_.StartListening(removed_listener.get(),
-                                       current_default_physical_device());
-  output_mixer_manager_.StopListening(removed_listener.get());
+  reference_signal_provider_->StartListening(listener.get(),
+                                             current_default_physical_device());
+  reference_signal_provider_->StartListening(removed_listener.get(),
+                                             current_default_physical_device());
+  reference_signal_provider_->StopListening(removed_listener.get());
   ForceOutputMixerCreation(current_default_physical_device());
 }
 
@@ -1075,8 +1081,9 @@
   auto listener = GetListener_MixerExpectsStartStop(reserved_mixer);
 
   ForceOutputMixerCreation(reserved_device_id());
-  output_mixer_manager_.StartListening(listener.get(), reserved_device_id());
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StartListening(listener.get(),
+                                             reserved_device_id());
+  reference_signal_provider_->StopListening(listener.get());
 }
 
 TEST_P(OutputDeviceMixerManagerTest,
@@ -1085,9 +1092,10 @@
 
   auto listener = GetListener_MixerExpectsStartStop(reserved_mixer);
 
-  output_mixer_manager_.StartListening(listener.get(), reserved_device_id());
+  reference_signal_provider_->StartListening(listener.get(),
+                                             reserved_device_id());
   ForceOutputMixerCreation(reserved_device_id());
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StopListening(listener.get());
 }
 
 TEST_P(OutputDeviceMixerManagerTest,
@@ -1096,8 +1104,9 @@
 
   auto listener = GetListener_MixerExpectsNoCalls(reserved_mixer);
 
-  output_mixer_manager_.StartListening(listener.get(), reserved_device_id());
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StartListening(listener.get(),
+                                             reserved_device_id());
+  reference_signal_provider_->StopListening(listener.get());
   ForceOutputMixerCreation(reserved_device_id());
 }
 
@@ -1108,9 +1117,9 @@
   auto listener = GetListener_MixerExpectsStartStop(default_mixer);
 
   // kEmptyDeviceId should be treated the same as kReservedDefaultId.
-  output_mixer_manager_.StartListening(listener.get(), kEmptyDeviceId);
+  reference_signal_provider_->StartListening(listener.get(), kEmptyDeviceId);
   ForceOutputMixerCreation(kEmptyDeviceId);
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StopListening(listener.get());
 }
 
 // Makes sure reserved-listeners are attached to the reserved-mixer when it is
@@ -1121,9 +1130,10 @@
 
   auto listener = GetListener_MixerExpectsStartStop(reserved_mixer);
 
-  output_mixer_manager_.StartListening(listener.get(), reserved_device_id());
+  reference_signal_provider_->StartListening(listener.get(),
+                                             reserved_device_id());
   ForceOutputMixerCreation(current_reserved_physical_device());
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StopListening(listener.get());
 }
 
 // Makes sure current_reserved_physical_device() listeners are attached when the
@@ -1134,10 +1144,10 @@
 
   auto listener = GetListener_MixerExpectsStartStop(reserved_mixer);
 
-  output_mixer_manager_.StartListening(listener.get(),
-                                       current_reserved_physical_device());
+  reference_signal_provider_->StartListening(
+      listener.get(), current_reserved_physical_device());
   ForceOutputMixerCreation(reserved_device_id());
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StopListening(listener.get());
 }
 
 // Makes sure the presence of listeners does not force device recreation
@@ -1150,11 +1160,12 @@
   auto listener = GetListener_MixerExpectsStart(mixer);
 
   ForceOutputMixerCreation(kOtherFakeDeviceId);
-  output_mixer_manager_.StartListening(listener.get(), kOtherFakeDeviceId);
+  reference_signal_provider_->StartListening(listener.get(),
+                                             kOtherFakeDeviceId);
 
   SimulateDeviceChange();
 
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StopListening(listener.get());
 }
 
 // Makes sure listeners are re-attached when mixers are recreated.
@@ -1166,7 +1177,8 @@
   auto listener = GetListener_MixerExpectsStart(mixer);
 
   ForceOutputMixerCreation(kOtherFakeDeviceId);
-  output_mixer_manager_.StartListening(listener.get(), kOtherFakeDeviceId);
+  reference_signal_provider_->StartListening(listener.get(),
+                                             kOtherFakeDeviceId);
 
   SimulateDeviceChange();
 
@@ -1192,7 +1204,8 @@
 
   auto listener = GetListener_MixerExpectsStart(reserved_mixer);
 
-  output_mixer_manager_.StartListening(listener.get(), reserved_device_id());
+  reference_signal_provider_->StartListening(listener.get(),
+                                             reserved_device_id());
 
   // |listener| will be started when |reserved_mixer| is created.
   ForceOutputMixerCreation(current_reserved_physical_device());
@@ -1224,8 +1237,8 @@
   // |reserved_mixer| should never get a call to StopListening(|listener|).
   auto listener = GetListener_MixerExpectsStart(reserved_mixer);
 
-  output_mixer_manager_.StartListening(listener.get(),
-                                       current_reserved_physical_device());
+  reference_signal_provider_->StartListening(
+      listener.get(), current_reserved_physical_device());
 
   // |listener| should be attached to |mixer|.
   ForceOutputMixerCreation(reserved_device_id());
@@ -1277,12 +1290,13 @@
   auto other_listener = GetListener_MixerExpectsNoCalls(reserved_mixer);
 
   // Start all listeners.
-  output_mixer_manager_.StartListening(reserved_listener.get(),
-                                       reserved_device_id());
-  output_mixer_manager_.StartListening(current_reserved_physical_listener.get(),
-                                       current_reserved_physical_device());
-  output_mixer_manager_.StartListening(other_listener.get(),
-                                       kOtherFakeDeviceId);
+  reference_signal_provider_->StartListening(reserved_listener.get(),
+                                             reserved_device_id());
+  reference_signal_provider_->StartListening(
+      current_reserved_physical_listener.get(),
+      current_reserved_physical_device());
+  reference_signal_provider_->StartListening(other_listener.get(),
+                                             kOtherFakeDeviceId);
 
   // |default_listener| and |current_default_physical_listener| should be
   // attached to |default_mixer|.
@@ -1306,12 +1320,13 @@
   auto other_listener = GetListener_MixerExpectsNoCalls(reserved_mixer);
 
   // Start all listeners.
-  output_mixer_manager_.StartListening(reserved_listener.get(),
-                                       reserved_device_id());
-  output_mixer_manager_.StartListening(current_reserved_physical_listener.get(),
-                                       current_reserved_physical_device());
-  output_mixer_manager_.StartListening(other_listener.get(),
-                                       kOtherFakeDeviceId);
+  reference_signal_provider_->StartListening(reserved_listener.get(),
+                                             reserved_device_id());
+  reference_signal_provider_->StartListening(
+      current_reserved_physical_listener.get(),
+      current_reserved_physical_device());
+  reference_signal_provider_->StartListening(other_listener.get(),
+                                             kOtherFakeDeviceId);
 
   // |reserved_listener| and |current_reserved_physical_listener| should be
   // attached to |reserved_mixer|.
@@ -1336,12 +1351,13 @@
   auto other_listener = GetListener_MixerExpectsStart(other_mixer);
 
   // Start all listeners.
-  output_mixer_manager_.StartListening(reserved_listener.get(),
-                                       reserved_device_id());
-  output_mixer_manager_.StartListening(current_reserved_physical_listener.get(),
-                                       current_reserved_physical_device());
-  output_mixer_manager_.StartListening(other_listener.get(),
-                                       kOtherFakeDeviceId);
+  reference_signal_provider_->StartListening(reserved_listener.get(),
+                                             reserved_device_id());
+  reference_signal_provider_->StartListening(
+      current_reserved_physical_listener.get(),
+      current_reserved_physical_device());
+  reference_signal_provider_->StartListening(other_listener.get(),
+                                             kOtherFakeDeviceId);
 
   // Only |other_listener| should be attached to |other_mixer|.
   ForceOutputMixerCreation(kOtherFakeDeviceId);
@@ -1357,23 +1373,26 @@
   auto listener = GetListener_MixerExpectsStartStop(default_mixer);
 
   // Start listener.
-  output_mixer_manager_.StartListening(listener.get(), reserved_device_id());
+  reference_signal_provider_->StartListening(listener.get(),
+                                             reserved_device_id());
 
   // Verify starting with the same ID.
-  output_mixer_manager_.StartListening(listener.get(), reserved_device_id());
+  reference_signal_provider_->StartListening(listener.get(),
+                                             reserved_device_id());
 
   // Verify starting with equivalent IDs.
   if (reserved_id_test_type() == ReservedIdTestType::kDefault) {
     // The kEmptyDeviceId also maps to kReservedDefaultId.
-    output_mixer_manager_.StartListening(listener.get(), kEmptyDeviceId);
+    reference_signal_provider_->StartListening(listener.get(), kEmptyDeviceId);
   }
-  output_mixer_manager_.StartListening(listener.get(),
-                                       current_reserved_physical_device());
+  reference_signal_provider_->StartListening(
+      listener.get(), current_reserved_physical_device());
 
   // Return to the original ID.
-  output_mixer_manager_.StartListening(listener.get(), reserved_device_id());
+  reference_signal_provider_->StartListening(listener.get(),
+                                             reserved_device_id());
 
-  output_mixer_manager_.StopListening(listener.get());
+  reference_signal_provider_->StopListening(listener.get());
 }
 
 // Makes sure we can call StartListening multiple times with the same listener,
@@ -1394,10 +1413,12 @@
   EXPECT_CALL(*other_mixer, StartListening(listener.get())).Times(1);
   EXPECT_CALL(*other_mixer, StopListening(listener.get())).Times(0);
 
-  output_mixer_manager_.StartListening(listener.get(), kReservedDefaultId);
+  reference_signal_provider_->StartListening(listener.get(),
+                                             kReservedDefaultId);
 
   // This call should stop |default_mixer|.
-  output_mixer_manager_.StartListening(listener.get(), kOtherFakeDeviceId);
+  reference_signal_provider_->StartListening(listener.get(),
+                                             kOtherFakeDeviceId);
 }
 
 // Makes sure listeners are properly updated internally when going from a
@@ -1411,10 +1432,12 @@
   std::string original_reserved_id = current_reserved_physical_device();
 
   auto listener = GetListener_MixerExpectsStart(reserved_mixer);
-  output_mixer_manager_.StartListening(listener.get(), reserved_device_id());
+  reference_signal_provider_->StartListening(listener.get(),
+                                             reserved_device_id());
 
   // Switch |listener| to listen to the current reserved device ID.
-  output_mixer_manager_.StartListening(listener.get(), original_reserved_id);
+  reference_signal_provider_->StartListening(listener.get(),
+                                             original_reserved_id);
 
   // Change the reserved device ID.
   ASSERT_NE(current_reserved_physical_device(), kOtherFakeDeviceId);
diff --git a/services/audio/output_tapper.cc b/services/audio/output_tapper.cc
index 0b06ed4..a1187182 100644
--- a/services/audio/output_tapper.cc
+++ b/services/audio/output_tapper.cc
@@ -11,18 +11,19 @@
 #include "base/trace_event/trace_event.h"
 #include "media/audio/audio_device_description.h"
 #include "media/base/audio_bus.h"
-#include "services/audio/device_output_listener.h"
+#include "services/audio/reference_signal_provider.h"
 
 namespace audio {
 
-OutputTapper::OutputTapper(DeviceOutputListener* device_output_listener,
-                           ReferenceOutput::Listener* listener,
-                           LogCallback log_callback)
-    : device_output_listener_(device_output_listener),
+OutputTapper::OutputTapper(
+    std::unique_ptr<ReferenceSignalProvider> reference_signal_provider,
+    ReferenceOutput::Listener* listener,
+    LogCallback log_callback)
+    : reference_signal_provider_(std::move(reference_signal_provider)),
       listener_(listener),
       log_callback_(std::move(log_callback)) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
-  DCHECK(device_output_listener_);
+  DCHECK(reference_signal_provider_);
   DCHECK(listener_);
   DCHECK(log_callback_);
 }
@@ -57,7 +58,7 @@
 void OutputTapper::Stop() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
   DCHECK(active_);
-  device_output_listener_->StopListening(listener_);
+  reference_signal_provider_->StopListening(listener_);
   log_callback_.Run("OutputTapper: stop listening");
   active_ = false;
 }
@@ -67,7 +68,7 @@
   DCHECK(active_);
   log_callback_.Run(base::StrCat(
       {"OutputTapper: listening to output device: ", output_device_id_}));
-  device_output_listener_->StartListening(listener_, output_device_id_);
+  reference_signal_provider_->StartListening(listener_, output_device_id_);
 }
 
 }  // namespace audio
diff --git a/services/audio/output_tapper.h b/services/audio/output_tapper.h
index 934081aa..87930d1 100644
--- a/services/audio/output_tapper.h
+++ b/services/audio/output_tapper.h
@@ -14,15 +14,16 @@
 #include "services/audio/reference_output.h"
 
 namespace audio {
-class DeviceOutputListener;
+class ReferenceSignalProvider;
 
 class OutputTapper {
  public:
   using LogCallback = base::RepeatingCallback<void(std::string_view)>;
 
-  OutputTapper(DeviceOutputListener* device_output_listener,
-               ReferenceOutput::Listener* listener,
-               LogCallback log_callback);
+  OutputTapper(
+      std::unique_ptr<ReferenceSignalProvider> reference_signal_provider,
+      ReferenceOutput::Listener* listener,
+      LogCallback log_callback);
   OutputTapper(const OutputTapper&) = delete;
   OutputTapper& operator=(const OutputTapper&) = delete;
   ~OutputTapper();
@@ -37,7 +38,7 @@
   SEQUENCE_CHECKER(owning_sequence_);
   bool active_ = false;
   std::string output_device_id_;
-  raw_ptr<DeviceOutputListener> const device_output_listener_;
+  std::unique_ptr<ReferenceSignalProvider> const reference_signal_provider_;
   raw_ptr<ReferenceOutput::Listener> const listener_;
   const LogCallback log_callback_;
 };
diff --git a/services/audio/reference_signal_provider.h b/services/audio/reference_signal_provider.h
new file mode 100644
index 0000000..e327ef13
--- /dev/null
+++ b/services/audio/reference_signal_provider.h
@@ -0,0 +1,49 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_AUDIO_REFERENCE_SIGNAL_PROVIDER_H_
+#define SERVICES_AUDIO_REFERENCE_SIGNAL_PROVIDER_H_
+
+#include <string>
+
+#include "services/audio/reference_output.h"
+
+namespace audio {
+
+// Interface to start/stop listening to a device's reference output.
+class ReferenceSignalProvider {
+ public:
+  virtual ~ReferenceSignalProvider() = default;
+
+  // Starts listening to `device_id`'s output. Can be called multiple times
+  // without calling StopListening(); each new call will replace which device
+  // `listener` is listening to. Depending on implementation, additional devices
+  // may also be included in the reference signal (as is the case with the
+  // provider from LoopbackReferenceManager)
+  //
+  // `device_id` is expected to be a physical device ID, or the default device
+  // ID, as defined by media::AudioDeviceDescription::IsDefaultDevice().
+  //
+  // If ever `device_id`'s validity changes (after disconnecting/reconnecting a
+  // device), `listener` might start/stop receiving OnPlayoutData() calls.
+  virtual void StartListening(ReferenceOutput::Listener* listener,
+                              const std::string& device_id) = 0;
+
+  // Stop `listener` from receiving its current device's reference output.
+  // Must be called when `listener` no longer wants to receive data (e.g.
+  // before it is destroyed). StartListening() must have been called.
+  virtual void StopListening(ReferenceOutput::Listener* listener) = 0;
+};
+
+class ReferenceSignalProviderFactory {
+ public:
+  virtual ~ReferenceSignalProviderFactory() = default;
+
+  virtual std::unique_ptr<ReferenceSignalProvider>
+  GetReferenceSignalProvider() = 0;
+};
+
+}  // namespace audio
+
+#endif  // SERVICES_AUDIO_REFERENCE_SIGNAL_PROVIDER_H_
diff --git a/services/audio/stream_factory.cc b/services/audio/stream_factory.cc
index 1093f6b..017317e 100644
--- a/services/audio/stream_factory.cc
+++ b/services/audio/stream_factory.cc
@@ -9,7 +9,6 @@
 
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/trace_event/trace_event.h"
 #include "base/unguessable_token.h"
@@ -20,10 +19,11 @@
 #include "services/audio/local_muter.h"
 #include "services/audio/loopback_stream.h"
 #include "services/audio/output_stream.h"
+#include "services/audio/reference_signal_provider.h"
 
 #if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
+#include "services/audio/loopback_reference_manager.h"
 #include "services/audio/output_device_mixer.h"
-#include "services/audio/system_loopback_listener.h"
 #endif
 
 namespace audio {
@@ -40,13 +40,13 @@
       audio_manager, base::BindRepeating(&OutputDeviceMixer::Create));
 }
 
-std::unique_ptr<SystemLoopbackListener> MaybeCreateSystemLoopbackListener(
+std::unique_ptr<LoopbackReferenceManager> MaybeCreateLoopbackReferenceManager(
     media::AudioManager* audio_manager) {
   if (!media::IsSystemLoopbackAsAecReferenceEnabled()) {
     return nullptr;
   }
 
-  return std::make_unique<SystemLoopbackListener>(audio_manager);
+  return std::make_unique<LoopbackReferenceManager>(audio_manager);
 }
 #endif  // BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
 
@@ -66,8 +66,8 @@
 #if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
       output_device_mixer_manager_(
           MaybeCreateOutputDeviceMixerManager(audio_manager)),
-      system_loopback_listener_(
-          MaybeCreateSystemLoopbackListener(audio_manager)),
+      loopback_reference_manager_(
+          MaybeCreateLoopbackReferenceManager(audio_manager)),
 #endif
       loopback_worker_thread_("Loopback Worker", kReatimeThreadPeriod) {
 }
@@ -107,11 +107,7 @@
       std::move(stream_receiver), std::move(client), std::move(observer),
       std::move(pending_log), audio_manager_, aecdump_recording_manager_,
 #if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
-      system_loopback_listener_
-          ? static_cast<DeviceOutputListener*>(system_loopback_listener_.get())
-          : static_cast<DeviceOutputListener*>(
-                output_device_mixer_manager_.get()),
-      std::move(processing_config),
+      GetNewReferenceSignalProvider(), std::move(processing_config),
 #else
       nullptr, nullptr,
 #endif
@@ -295,7 +291,7 @@
 
   const auto it =
       std::ranges::find_if(loopback_streams_, base::MatchesUniquePtr(stream));
-  CHECK(it != loopback_streams_.end(), base::NotFatalUntil::M130);
+  CHECK(it != loopback_streams_.end());
   loopback_streams_.erase(it);
 
   // If all LoopbackStreams have ended, stop and join the worker thread.
@@ -362,4 +358,17 @@
       device_id_or_group_id, params, &coordinator_, group_id));
 }
 
+#if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
+std::unique_ptr<ReferenceSignalProvider>
+StreamFactory::GetNewReferenceSignalProvider() {
+  if (loopback_reference_manager_) {
+    return loopback_reference_manager_->GetReferenceSignalProvider();
+  }
+  if (output_device_mixer_manager_) {
+    return output_device_mixer_manager_->GetReferenceSignalProvider();
+  }
+  return nullptr;
+}
+#endif
+
 }  // namespace audio
diff --git a/services/audio/stream_factory.h b/services/audio/stream_factory.h
index ddd9fd5..02f4c95 100644
--- a/services/audio/stream_factory.h
+++ b/services/audio/stream_factory.h
@@ -25,8 +25,8 @@
 #include "services/audio/realtime_audio_thread.h"
 
 #if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
+#include "services/audio/loopback_reference_manager.h"
 #include "services/audio/output_device_mixer_manager.h"
-#include "services/audio/system_loopback_listener.h"
 #endif
 
 namespace base {
@@ -112,6 +112,9 @@
       uint32_t shared_memory_count,
       const base::UnguessableToken& group_id,
       CreateLoopbackStreamCallback created_callback) final;
+#if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
+  std::unique_ptr<ReferenceSignalProvider> GetNewReferenceSignalProvider();
+#endif
 
  private:
   using InputStreamSet =
@@ -147,8 +150,10 @@
 
   // Order of the following members is important for a clean shutdown.
 #if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
+  // output_device_mixer_manager_ must be before input_streams_ to guarantee
+  // correct destruction order.
   const std::unique_ptr<OutputDeviceMixerManager> output_device_mixer_manager_;
-  const std::unique_ptr<SystemLoopbackListener> system_loopback_listener_;
+  const std::unique_ptr<LoopbackReferenceManager> loopback_reference_manager_;
 #endif
   LoopbackCoordinator coordinator_;
   std::vector<std::unique_ptr<LocalMuter>> muters_;
diff --git a/services/audio/system_loopback_listener.cc b/services/audio/system_loopback_listener.cc
deleted file mode 100644
index f85b6297..0000000
--- a/services/audio/system_loopback_listener.cc
+++ /dev/null
@@ -1,140 +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 "services/audio/system_loopback_listener.h"
-
-#include <memory>
-
-#include "base/containers/flat_set.h"
-#include "base/logging.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/strings/strcat.h"
-#include "base/synchronization/lock.h"
-#include "base/time/time.h"
-#include "base/trace_event/trace_event.h"
-#include "media/audio/audio_device_description.h"
-#include "media/audio/audio_io.h"
-#include "media/base/audio_bus.h"
-#include "services/audio/audio_manager_power_user.h"
-#include "services/audio/device_output_listener.h"
-
-namespace audio {
-
-class SystemLoopbackListener::AudioCallback
-    : public media::AudioInputStream::AudioInputCallback {
- public:
-  explicit AudioCallback(int sample_rate) : sample_rate_(sample_rate) {}
-
-  void OnData(const media::AudioBus* source,
-              base::TimeTicks capture_time,
-              double volume,
-              const media::AudioGlitchInfo& audio_glitch_info) override {
-    base::AutoLock scoped_lock(lock_);
-    for (ReferenceOutput::Listener* listener : listeners_) {
-      // Since we are using a loopback signal, the audio has likely already been
-      // played out at this point, so the delay would be negative. To avoid
-      // confusion in the AudioProcessor, we set it to 0 for now.
-      // TODO(crbug.com/412581642): Figure out the correct value for this delay.
-      listener->OnPlayoutData(*source, sample_rate_,
-                              /*audio_delay=*/base::TimeDelta());
-    }
-  }
-
-  void OnError() override {
-    // TODO(crbug.com/412581642): Handle errors.
-    LOG(ERROR) << "System loopback AEC reference stream failed.";
-  }
-
-  base::Lock lock_;
-  base::flat_set<ReferenceOutput::Listener*> listeners_ GUARDED_BY(lock_);
-  const int sample_rate_;
-
-  void AddListener(ReferenceOutput::Listener* listener) {
-    base::AutoLock scoped_lock(lock_);
-    listeners_.insert(listener);
-  }
-
-  bool RemoveListener(ReferenceOutput::Listener* listener) {
-    base::AutoLock scoped_lock(lock_);
-    listeners_.erase(listener);
-    return listeners_.empty();
-  }
-};
-
-SystemLoopbackListener::SystemLoopbackListener(
-    media::AudioManager* audio_manager)
-    : audio_manager_(audio_manager) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
-}
-
-SystemLoopbackListener::~SystemLoopbackListener() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
-  EnsureLoopbackStreamClosed();
-}
-
-void SystemLoopbackListener::StartListening(ReferenceOutput::Listener* listener,
-                                            const std::string& device_id) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
-  EnsureLoopbackStreamStarted();
-  audio_callback_->AddListener(listener);
-}
-
-void SystemLoopbackListener::StopListening(
-    ReferenceOutput::Listener* listener) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
-  if (audio_callback_->RemoveListener(listener)) {
-    // TODO(crbug.com/412581642): Close after a delay instead, in case we are
-    // calling StartListening() again soon.
-    EnsureLoopbackStreamClosed();
-  }
-}
-
-void SystemLoopbackListener::EnsureLoopbackStreamStarted() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
-  if (loopback_stream_) {
-    return;
-  }
-  // Capture audio from all audio devices, or equivalently, audio from all PIDs
-  // playing out audio.
-  const std::string loopback_device_id =
-      media::AudioDeviceDescription::kLoopbackAllDevicesId;
-
-  // TODO(crbug.com/412581642): Determine optimal parameters.
-  const media::AudioParameters params =
-      AudioManagerPowerUser(audio_manager_)
-          .GetInputStreamParameters(loopback_device_id);
-  audio_callback_ = std::make_unique<AudioCallback>(params.sample_rate());
-
-  // TODO(crbug.com/412581642): Add a different AudioComponent for the reference
-  // loopback streams and show them in chrome://media-internals
-  audio_log_ = audio_manager_->CreateAudioLog(
-      media::AudioLogFactory::AudioComponent::kAudioInputController,
-      next_loopback_stream_id_++);
-
-  loopback_stream_ = audio_manager_->MakeAudioInputStream(
-      params, loopback_device_id,
-      base::BindRepeating(&media::AudioLog::OnLogMessage,
-                          base::Unretained(audio_log_.get())));
-  loopback_stream_->Open();
-  audio_log_->OnCreated(params, loopback_device_id);
-  loopback_stream_->Start(audio_callback_.get());
-  audio_log_->OnStarted();
-}
-
-void SystemLoopbackListener::EnsureLoopbackStreamClosed() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
-  if (!loopback_stream_) {
-    return;
-  }
-  loopback_stream_->Stop();
-  audio_log_->OnStopped();
-  // The the stream will destroy itself upon Close(), so we use
-  // ExtractAsDangling() to clear the raw_ptr first.
-  loopback_stream_.ExtractAsDangling()->Close();
-  audio_log_->OnClosed();
-  audio_callback_.reset();
-  audio_log_.reset();
-}
-
-}  // namespace audio
diff --git a/services/audio/system_loopback_listener.h b/services/audio/system_loopback_listener.h
deleted file mode 100644
index d46883311..0000000
--- a/services/audio/system_loopback_listener.h
+++ /dev/null
@@ -1,52 +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 SERVICES_AUDIO_SYSTEM_LOOPBACK_LISTENER_H_
-#define SERVICES_AUDIO_SYSTEM_LOOPBACK_LISTENER_H_
-
-#include <string>
-#include <string_view>
-
-#include "base/functional/callback.h"
-#include "base/memory/raw_ptr.h"
-#include "base/sequence_checker.h"
-#include "media/audio/audio_manager.h"
-#include "services/audio/device_output_listener.h"
-#include "services/audio/reference_output.h"
-
-namespace audio {
-
-class SystemLoopbackListener : public DeviceOutputListener {
- public:
-  class AudioCallback;
-
-  explicit SystemLoopbackListener(media::AudioManager* audio_manager);
-  SystemLoopbackListener(const SystemLoopbackListener&) = delete;
-  SystemLoopbackListener& operator=(const SystemLoopbackListener&) = delete;
-  ~SystemLoopbackListener() override;
-
-  void StartListening(ReferenceOutput::Listener* listener,
-                      const std::string& device_id) override;
-
-  void StopListening(ReferenceOutput::Listener* listener) override;
-
- private:
-  void EnsureLoopbackStreamStarted();
-  void EnsureLoopbackStreamClosed();
-
-  SEQUENCE_CHECKER(owning_sequence_);
-  const raw_ptr<media::AudioManager> audio_manager_;
-  raw_ptr<media::AudioInputStream> loopback_stream_ = nullptr;
-  std::unique_ptr<media::AudioLog> audio_log_;
-  // To differentiate the streams that SystemLoopbackListener creates from the
-  // InputControllers, we start their ids at 1000000.
-  // TODO(crbug.com/412581642): Remove this hack once the reference streams get
-  // their own category.
-  int next_loopback_stream_id_ = 1000000;
-  std::unique_ptr<AudioCallback> audio_callback_;
-};
-
-}  // namespace audio
-
-#endif  // SERVICES_AUDIO_SYSTEM_LOOPBACK_LISTENER_H_
diff --git a/services/cert_verifier/cert_net_url_loader/cert_net_fetcher_url_loader.cc b/services/cert_verifier/cert_net_url_loader/cert_net_fetcher_url_loader.cc
index 4b4bc92..0c2b89d 100644
--- a/services/cert_verifier/cert_net_url_loader/cert_net_fetcher_url_loader.cc
+++ b/services/cert_verifier/cert_net_url_loader/cert_net_fetcher_url_loader.cc
@@ -71,7 +71,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_math.h"
 #include "base/sequence_checker.h"
 #include "base/synchronization/waitable_event.h"
@@ -470,7 +469,7 @@
   std::unique_ptr<Job> delete_this;
 
   auto it = std::ranges::find(requests_, request);
-  CHECK(it != requests_.end(), base::NotFatalUntil::M130);
+  CHECK(it != requests_.end());
   requests_.erase(it);
 
   // If there are no longer any requests attached to the job then
diff --git a/services/data_decoder/public/cpp/safe_web_bundle_parser.cc b/services/data_decoder/public/cpp/safe_web_bundle_parser.cc
index 9a2153c..00c38381 100644
--- a/services/data_decoder/public/cpp/safe_web_bundle_parser.cc
+++ b/services/data_decoder/public/cpp/safe_web_bundle_parser.cc
@@ -9,7 +9,6 @@
 
 #include "base/check.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "base/types/expected.h"
@@ -270,7 +269,7 @@
     web_package::mojom::BundleResponsePtr response,
     web_package::mojom::BundleResponseParseErrorPtr error) {
   auto it = response_callbacks_.find(callback_id);
-  CHECK(it != response_callbacks_.end(), base::NotFatalUntil::M130);
+  CHECK(it != response_callbacks_.end());
   auto callback = std::move(it->second);
   response_callbacks_.erase(it);
   std::move(callback).Run(std::move(response), std::move(error));
diff --git a/services/device/generic_sensor/platform_sensor_provider_chromeos.cc b/services/device/generic_sensor/platform_sensor_provider_chromeos.cc
index 3c1f7cf..e19c65b5 100644
--- a/services/device/generic_sensor/platform_sensor_provider_chromeos.cc
+++ b/services/device/generic_sensor/platform_sensor_provider_chromeos.cc
@@ -12,7 +12,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task/sequenced_task_runner.h"
 #include "chromeos/components/sensors/sensor_util.h"
@@ -352,7 +351,7 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   auto it = sensors_.find(id);
-  CHECK(it != sensors_.end(), base::NotFatalUntil::M130);
+  CHECK(it != sensors_.end());
   auto& sensor = it->second;
   DCHECK(sensor.remote.is_bound());
 
diff --git a/services/device/geolocation/geolocation_context.cc b/services/device/geolocation/geolocation_context.cc
index 9144bf7..fd67662 100644
--- a/services/device/geolocation/geolocation_context.cc
+++ b/services/device/geolocation/geolocation_context.cc
@@ -8,7 +8,6 @@
 #include <vector>
 
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "services/device/geolocation/geolocation_impl.h"
 #include "url/origin.h"
@@ -54,7 +53,7 @@
 void GeolocationContext::OnConnectionError(GeolocationImpl* impl) {
   auto it =
       std::ranges::find(impls_, impl, &std::unique_ptr<GeolocationImpl>::get);
-  CHECK(it != impls_.end(), base::NotFatalUntil::M130);
+  CHECK(it != impls_.end());
   impls_.erase(it);
 }
 
diff --git a/services/device/hid/hid_connection_win.cc b/services/device/hid/hid_connection_win.cc
index ab2e4d65..901f99f1 100644
--- a/services/device/hid/hid_connection_win.cc
+++ b/services/device/hid/hid_connection_win.cc
@@ -14,7 +14,6 @@
 #include "base/files/file.h"
 #include "base/functional/bind.h"
 #include "base/memory/ref_counted_memory.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/win/object_watcher.h"
 #include "components/device_event_log/device_event_log.h"
@@ -330,7 +329,7 @@
     PendingHidTransfer* transfer) {
   auto it = std::ranges::find(transfers_, transfer,
                               &std::unique_ptr<PendingHidTransfer>::get);
-  CHECK(it != transfers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != transfers_.end());
   std::unique_ptr<PendingHidTransfer> saved_transfer = std::move(*it);
   transfers_.erase(it);
   return saved_transfer;
diff --git a/services/device/public/cpp/test/fake_serial_port_manager.cc b/services/device/public/cpp/test/fake_serial_port_manager.cc
index 7f729ea..08c919a 100644
--- a/services/device/public/cpp/test/fake_serial_port_manager.cc
+++ b/services/device/public/cpp/test/fake_serial_port_manager.cc
@@ -8,7 +8,6 @@
 #include <vector>
 
 #include "base/functional/callback.h"
-#include "base/not_fatal_until.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
@@ -107,7 +106,7 @@
 
 void FakeSerialPortManager::RemovePort(base::UnguessableToken token) {
   auto it = ports_.find(token);
-  CHECK(it != ports_.end(), base::NotFatalUntil::M130);
+  CHECK(it != ports_.end());
   mojom::SerialPortInfoPtr info = std::move(it->second);
   ports_.erase(it);
   info->connected = false;
diff --git a/services/device/public/cpp/test/test_wake_lock_provider.cc b/services/device/public/cpp/test/test_wake_lock_provider.cc
index 93a0ab6e..38b05c93 100644
--- a/services/device/public/cpp/test/test_wake_lock_provider.cc
+++ b/services/device/public/cpp/test/test_wake_lock_provider.cc
@@ -10,7 +10,6 @@
 #include "base/check_op.h"
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
@@ -183,7 +182,7 @@
 TestWakeLockProvider::GetWakeLockDataPerType(mojom::WakeLockType type) const {
   auto it = wake_lock_store_.find(type);
   // An entry for |type| should always be created in the constructor.
-  CHECK(it != wake_lock_store_.end(), base::NotFatalUntil::M130);
+  CHECK(it != wake_lock_store_.end());
   return *(it->second);
 }
 
diff --git a/services/device/serial/fake_serial_device_enumerator.cc b/services/device/serial/fake_serial_device_enumerator.cc
index 85880f69..1f1bd49f6 100644
--- a/services/device/serial/fake_serial_device_enumerator.cc
+++ b/services/device/serial/fake_serial_device_enumerator.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "base/not_fatal_until.h"
 
 namespace device {
 
@@ -24,7 +23,7 @@
 
 void FakeSerialEnumerator::RemoveDevicePath(const base::FilePath& path) {
   auto it = paths_.find(path);
-  CHECK(it != paths_.end(), base::NotFatalUntil::M130);
+  CHECK(it != paths_.end());
   base::UnguessableToken token = it->second;
   paths_.erase(it);
   RemovePort(token);
diff --git a/services/device/serial/serial_device_enumerator.cc b/services/device/serial/serial_device_enumerator.cc
index 5069ea9..9d633f8 100644
--- a/services/device/serial/serial_device_enumerator.cc
+++ b/services/device/serial/serial_device_enumerator.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/unguessable_token.h"
@@ -97,7 +96,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   auto it = ports_.find(token);
-  CHECK(it != ports_.end(), base::NotFatalUntil::M130);
+  CHECK(it != ports_.end());
   mojom::SerialPortInfoPtr port = std::move(it->second);
 
   SERIAL_LOG(EVENT) << "Serial device removed: path=" << port->path;
@@ -115,7 +114,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   auto it = ports_.find(token);
-  CHECK(it != ports_.end(), base::NotFatalUntil::M130);
+  CHECK(it != ports_.end());
   auto& port = it->second;
   if (port->connected == is_connected) {
     return;
diff --git a/services/device/usb/usb_device_handle_usbfs.cc b/services/device/usb/usb_device_handle_usbfs.cc
index a59f20a..8f2d7a1 100644
--- a/services/device/usb/usb_device_handle_usbfs.cc
+++ b/services/device/usb/usb_device_handle_usbfs.cc
@@ -24,7 +24,6 @@
 #include "base/functional/bind.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted_memory.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/checked_math.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/sequence_checker.h"
@@ -931,7 +930,7 @@
   }
 
   auto it = interfaces_.find(interface_number);
-  CHECK(it != interfaces_.end(), base::NotFatalUntil::M130);
+  CHECK(it != interfaces_.end());
   interfaces_.erase(it);
   if (device_) {
     // Only refresh endpoints if a device is still attached.
@@ -1127,7 +1126,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = std::ranges::find(transfers_, transfer_ptr,
                               &std::unique_ptr<Transfer>::get);
-  CHECK(it != transfers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != transfers_.end());
   std::unique_ptr<Transfer> transfer = std::move(*it);
   transfers_.erase(it);
   return transfer;
diff --git a/services/device/usb/usb_device_handle_win.cc b/services/device/usb/usb_device_handle_win.cc
index f6575ac..54ce5fdd 100644
--- a/services/device/usb/usb_device_handle_win.cc
+++ b/services/device/usb/usb_device_handle_win.cc
@@ -25,7 +25,6 @@
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted_memory.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/thread_pool.h"
 #include "base/threading/scoped_blocking_call.h"
@@ -395,7 +394,7 @@
 
   auto interface_it =
       interfaces_.find(endpoint_it->second.interface->interface_number);
-  CHECK(interface_it != interfaces_.end(), base::NotFatalUntil::M130);
+  CHECK(interface_it != interfaces_.end());
   Interface& interface = interface_it->second;
   if (!interface.claimed) {
     task_runner_->PostTask(FROM_HERE,
@@ -551,7 +550,7 @@
 
   auto interface_it =
       interfaces_.find(endpoint_it->second.interface->interface_number);
-  CHECK(interface_it != interfaces_.end(), base::NotFatalUntil::M130);
+  CHECK(interface_it != interfaces_.end());
   Interface* interface = &interface_it->second;
   if (!interface->claimed) {
     task_runner_->PostTask(
@@ -725,7 +724,7 @@
         return interface;
 
       auto it = interfaces_.find(interface->first_interface);
-      CHECK(it != interfaces_.end(), base::NotFatalUntil::M130);
+      CHECK(it != interfaces_.end());
       return &it->second;
     }
   }
@@ -776,7 +775,7 @@
                                                 OpenInterfaceCallback callback,
                                                 Interface* first_interface) {
   auto interface_it = interfaces_.find(interface_number);
-  CHECK(interface_it != interfaces_.end(), base::NotFatalUntil::M130);
+  CHECK(interface_it != interfaces_.end());
   Interface* interface = &interface_it->second;
   if (device_->driver_type() == UsbDeviceWin::DriverType::kComposite) {
     DCHECK_NE(interface->first_interface, interface->interface_number);
@@ -821,7 +820,7 @@
                                                         ResultCallback callback,
                                                         bool result) {
   auto it = interfaces_.find(interface_number);
-  CHECK(it != interfaces_.end(), base::NotFatalUntil::M130);
+  CHECK(it != interfaces_.end());
   Interface& interface = it->second;
 
   if (!result) {
@@ -874,7 +873,7 @@
                                      ResultCallback callback,
                                      bool result) {
   auto it = interfaces_.find(interface_number);
-  CHECK(it != interfaces_.end(), base::NotFatalUntil::M130);
+  CHECK(it != interfaces_.end());
   ReleaseInterfaceReference(&it->second);
 
   std::move(callback).Run(result);
@@ -1012,7 +1011,7 @@
     UsbDeviceHandleWin::Request* request_ptr) {
   auto it =
       std::ranges::find(requests_, request_ptr, &std::unique_ptr<Request>::get);
-  CHECK(it != requests_.end(), base::NotFatalUntil::M130);
+  CHECK(it != requests_.end());
   std::unique_ptr<Request> request = std::move(*it);
   requests_.erase(it);
   return request;
@@ -1106,7 +1105,7 @@
 
   DCHECK_NE(request->interface_number(), -1);
   auto it = interfaces_.find(request->interface_number());
-  CHECK(it != interfaces_.end(), base::NotFatalUntil::M130);
+  CHECK(it != interfaces_.end());
   ReleaseInterfaceReference(&it->second);
 
   std::move(callback).Run(status, std::move(buffer), bytes_transferred);
diff --git a/services/device/usb/usb_service.cc b/services/device/usb/usb_service.cc
index 0180e9c..d08efbd5 100644
--- a/services/device/usb/usb_service.cc
+++ b/services/device/usb/usb_service.cc
@@ -10,7 +10,6 @@
 #include "base/functional/bind.h"
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/thread_pool.h"
@@ -114,7 +113,7 @@
   auto testing_devices_it = testing_devices_.find(device_guid);
   if (testing_devices_it != testing_devices_.end()) {
     auto devices_it = devices_.find(device_guid);
-    CHECK(devices_it != devices_.end(), base::NotFatalUntil::M130);
+    CHECK(devices_it != devices_.end());
     scoped_refptr<UsbDevice> device = devices_it->second;
     devices_.erase(devices_it);
     testing_devices_.erase(testing_devices_it);
@@ -128,7 +127,7 @@
   devices->reserve(testing_devices_.size());
   for (const std::string& guid : testing_devices_) {
     auto it = devices_.find(guid);
-    CHECK(it != devices_.end(), base::NotFatalUntil::M130);
+    CHECK(it != devices_.end());
     devices->push_back(it->second);
   }
 }
diff --git a/services/device/wake_lock/wake_lock_provider.cc b/services/device/wake_lock/wake_lock_provider.cc
index 952d42a..2c03a567 100644
--- a/services/device/wake_lock/wake_lock_provider.cc
+++ b/services/device/wake_lock/wake_lock_provider.cc
@@ -8,7 +8,6 @@
 #include <string>
 #include <utility>
 
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
@@ -158,7 +157,7 @@
     mojom::WakeLockType type) {
   auto it = wake_lock_store_.find(type);
   // An entry for |type| should always be created in the constructor.
-  CHECK(it != wake_lock_store_.end(), base::NotFatalUntil::M130);
+  CHECK(it != wake_lock_store_.end());
   return *(it->second);
 }
 
diff --git a/services/network/cors/cors_url_loader_factory.h b/services/network/cors/cors_url_loader_factory.h
index 980966a..0713f60 100644
--- a/services/network/cors/cors_url_loader_factory.h
+++ b/services/network/cors/cors_url_loader_factory.h
@@ -12,7 +12,6 @@
 #include "base/containers/flat_set.h"
 #include "base/containers/unique_ptr_adapters.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/rand_util.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -175,7 +174,7 @@
       std::set<std::unique_ptr<T>, base::UniquePtrComparator>& loaders) {
     context_->LoaderDestroyed(process_id_);
     auto it = loaders.find(loader);
-    CHECK(it != loaders.end(), base::NotFatalUntil::M130);
+    CHECK(it != loaders.end());
     loaders.erase(it);
 
     DeleteIfNeeded();
diff --git a/services/network/cors/preflight_controller.cc b/services/network/cors/preflight_controller.cc
index a162888..d97730b 100644
--- a/services/network/cors/preflight_controller.cc
+++ b/services/network/cors/preflight_controller.cc
@@ -13,7 +13,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/unguessable_token.h"
 #include "net/base/isolation_info.h"
@@ -837,7 +836,7 @@
 
 void PreflightController::RemoveLoader(PreflightLoader* loader) {
   auto it = loaders_.find(loader);
-  CHECK(it != loaders_.end(), base::NotFatalUntil::M130);
+  CHECK(it != loaders_.end());
   loaders_.erase(it);
 }
 
diff --git a/services/network/host_resolver.cc b/services/network/host_resolver.cc
index b5d4ed7..89a450fe 100644
--- a/services/network/host_resolver.cc
+++ b/services/network/host_resolver.cc
@@ -9,7 +9,6 @@
 
 #include "base/functional/bind.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "build/build_config.h"
 #include "mojo/public/cpp/bindings/enum_traits.h"
@@ -181,13 +180,13 @@
   DCHECK_NE(net::ERR_IO_PENDING, error);
 
   auto found_request = requests_.find(request);
-  CHECK(found_request != requests_.end(), base::NotFatalUntil::M130);
+  CHECK(found_request != requests_.end());
   requests_.erase(found_request);
 }
 
 void HostResolver::OnMdnsListenerCancelled(HostResolverMdnsListener* listener) {
   auto found_listener = listeners_.find(listener);
-  CHECK(found_listener != listeners_.end(), base::NotFatalUntil::M130);
+  CHECK(found_listener != listeners_.end());
   listeners_.erase(found_listener);
 }
 
diff --git a/services/network/keepalive_statistics_recorder.cc b/services/network/keepalive_statistics_recorder.cc
index 9870315..afbcd6f7 100644
--- a/services/network/keepalive_statistics_recorder.cc
+++ b/services/network/keepalive_statistics_recorder.cc
@@ -6,7 +6,6 @@
 
 #include <algorithm>
 
-#include "base/not_fatal_until.h"
 
 namespace network {
 
@@ -28,7 +27,7 @@
 void KeepaliveStatisticsRecorder::Unregister(
     const base::UnguessableToken& top_level_frame_id) {
   auto it = per_top_level_frame_records_.find(top_level_frame_id);
-  CHECK(it != per_top_level_frame_records_.end(), base::NotFatalUntil::M130);
+  CHECK(it != per_top_level_frame_records_.end());
 
   if (it->second.num_registrations == 1) {
     per_top_level_frame_records_.erase(it);
diff --git a/services/network/mdns_responder.cc b/services/network/mdns_responder.cc
index 6ab9d537..184b37c 100644
--- a/services/network/mdns_responder.cc
+++ b/services/network/mdns_responder.cc
@@ -16,7 +16,6 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/rand_util.h"
 #include "base/strings/stringprintf.h"
@@ -935,7 +934,7 @@
 
 void MdnsResponderManager::OnMojoConnectionError(MdnsResponder* responder) {
   auto it = responders_.find(responder);
-  CHECK(it != responders_.end(), base::NotFatalUntil::M130);
+  CHECK(it != responders_.end());
   responders_.erase(it);
 }
 
@@ -1015,7 +1014,7 @@
   // We should not remove the socket handler for a non-fatal error.
   DCHECK(IsFatalError(result));
   auto it = socket_handler_by_id_.find(socket_handler_id);
-  CHECK(it != socket_handler_by_id_.end(), base::NotFatalUntil::M130);
+  CHECK(it != socket_handler_by_id_.end());
   // It is safe to remove the handler in error since the handler has exited the
   // read loop and is done with |OnRead|.
   socket_handler_by_id_.erase(it);
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index 7217510..e9d152a 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -29,7 +29,6 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/sequence_checker.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -1066,7 +1065,7 @@
     const network::RestrictedCookieManager* rcm) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = restricted_cookie_managers_.find(rcm);
-  CHECK(it != restricted_cookie_managers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != restricted_cookie_managers_.end());
   restricted_cookie_managers_.erase(it);
 }
 
@@ -1215,7 +1214,7 @@
 void NetworkContext::OnProxyLookupComplete(
     ProxyLookupRequest* proxy_lookup_request) {
   auto it = proxy_lookup_requests_.find(proxy_lookup_request);
-  CHECK(it != proxy_lookup_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(it != proxy_lookup_requests_.end());
   proxy_lookup_requests_.erase(it);
 }
 
@@ -1235,7 +1234,7 @@
     return;
   }
   auto it = url_loader_factories_.find(url_loader_factory);
-  CHECK(it != url_loader_factories_.end(), base::NotFatalUntil::M130);
+  CHECK(it != url_loader_factories_.end());
   url_loader_factories_.erase(it);
 }
 
@@ -1252,7 +1251,7 @@
 
 void NetworkContext::LoaderDestroyed(uint32_t process_id) {
   auto it = loader_count_per_process_.find(process_id);
-  CHECK(it != loader_count_per_process_.end(), base::NotFatalUntil::M130);
+  CHECK(it != loader_count_per_process_.end());
   it->second -= 1;
   if (it->second == 0) {
     loader_count_per_process_.erase(it);
@@ -3107,7 +3106,7 @@
 
 void NetworkContext::OnHostResolverShutdown(HostResolver* resolver) {
   auto found_resolver = host_resolvers_.find(resolver);
-  CHECK(found_resolver != host_resolvers_.end(), base::NotFatalUntil::M130);
+  CHECK(found_resolver != host_resolvers_.end());
   host_resolvers_.erase(found_resolver);
 }
 
@@ -3169,7 +3168,7 @@
 #if BUILDFLAG(IS_P2P_ENABLED)
 void NetworkContext::DestroySocketManager(P2PSocketManager* socket_manager) {
   auto iter = socket_managers_.find(socket_manager);
-  CHECK(iter != socket_managers_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != socket_managers_.end());
   socket_managers_.erase(iter);
 }
 #endif  // BUILDFLAG(IS_P2P_ENABLED)
@@ -3186,7 +3185,7 @@
 
 void NetworkContext::OnVerifyCertComplete(uint64_t cert_verify_id, int result) {
   auto iter = cert_verifier_requests_.find(cert_verify_id);
-  CHECK(iter != cert_verifier_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != cert_verifier_requests_.end());
 
   auto pending_cert_verify = std::move(iter->second);
   cert_verifier_requests_.erase(iter);
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
index 6466e66..7ac99d4 100644
--- a/services/network/network_service.cc
+++ b/services/network/network_service.cc
@@ -30,7 +30,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
@@ -1171,7 +1170,7 @@
 void NetworkService::OnNetworkContextConnectionClosed(
     NetworkContext* network_context) {
   auto it = owned_network_contexts_.find(network_context);
-  CHECK(it != owned_network_contexts_.end(), base::NotFatalUntil::M130);
+  CHECK(it != owned_network_contexts_.end());
   if (file_net_log_observer_) {
     net_log_polled_data_list_.Append(
         net::GetNetInfo(network_context->url_request_context()));
diff --git a/services/network/oblivious_http_request_handler.cc b/services/network/oblivious_http_request_handler.cc
index e550192..24e5f61 100644
--- a/services/network/oblivious_http_request_handler.cc
+++ b/services/network/oblivious_http_request_handler.cc
@@ -8,7 +8,6 @@
 #include <array>
 
 #include "base/i18n/time_formatting.h"
-#include "base/not_fatal_until.h"
 #include "base/rand_util.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
 #include "net/base/load_flags.h"
@@ -270,7 +269,7 @@
   }
 
   auto state_iter = client_state_.find(id);
-  CHECK(state_iter != client_state_.end(), base::NotFatalUntil::M130);
+  CHECK(state_iter != client_state_.end());
 
   RequestState* state = state_iter->second.get();
   state->trust_token_helper = status_or_helper.TakeOrCrash();
@@ -298,7 +297,7 @@
     std::optional<net::HttpRequestHeaders> headers,
     mojo::RemoteSetElementId id) {
   auto state_iter = client_state_.find(id);
-  CHECK(state_iter != client_state_.end(), base::NotFatalUntil::M130);
+  CHECK(state_iter != client_state_.end());
   RequestState* state = state_iter->second.get();
 
   std::string bhttp_payload = CreateAndSerializeBhttpMessage(
@@ -398,7 +397,7 @@
   mojom::ObliviousHttpClient* client = clients_.Get(id);
   auto state_iter = client_state_.find(id);
   DCHECK(client);
-  CHECK(state_iter != client_state_.end(), base::NotFatalUntil::M130);
+  CHECK(state_iter != client_state_.end());
   RequestState* state = state_iter->second.get();
   state->net_log.EndEvent(net::NetLogEventType::OBLIVIOUS_HTTP_REQUEST, [&] {
     base::Value::Dict params;
@@ -431,7 +430,7 @@
     mojo::RemoteSetElementId id,
     std::unique_ptr<std::string> response) {
   auto state_iter = client_state_.find(id);
-  CHECK(state_iter != client_state_.end(), base::NotFatalUntil::M130);
+  CHECK(state_iter != client_state_.end());
 
   RequestState* state = state_iter->second.get();
   if (!response) {
@@ -520,7 +519,7 @@
   mojom::ObliviousHttpClient* client = clients_.Get(id);
   auto state_iter = client_state_.find(id);
   DCHECK(client);
-  CHECK(state_iter != client_state_.end(), base::NotFatalUntil::M130);
+  CHECK(state_iter != client_state_.end());
   RequestState* state = state_iter->second.get();
   net::NetLogResponseHeaders(
       state->net_log, net::NetLogEventType::OBLIVIOUS_HTTP_RESPONSE_HEADERS,
diff --git a/services/network/p2p/socket_manager.cc b/services/network/p2p/socket_manager.cc
index f4e6340..99bb88d 100644
--- a/services/network/p2p/socket_manager.cc
+++ b/services/network/p2p/socket_manager.cc
@@ -11,7 +11,6 @@
 
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/task/thread_pool.h"
 #include "net/base/address_family.h"
@@ -231,7 +230,7 @@
 
 void P2PSocketManager::DestroySocket(P2PSocket* socket) {
   auto iter = sockets_.find(socket);
-  CHECK(iter != sockets_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != sockets_.end());
   sockets_.erase(iter);
 }
 
diff --git a/services/network/trust_tokens/in_memory_trust_token_persister.cc b/services/network/trust_tokens/in_memory_trust_token_persister.cc
index 92d33fae..79a7e0cd 100644
--- a/services/network/trust_tokens/in_memory_trust_token_persister.cc
+++ b/services/network/trust_tokens/in_memory_trust_token_persister.cc
@@ -4,7 +4,6 @@
 
 #include "services/network/trust_tokens/in_memory_trust_token_persister.h"
 
-#include "base/not_fatal_until.h"
 #include "services/network/trust_tokens/types.h"
 #include "url/gurl.h"
 
@@ -109,7 +108,7 @@
 
   for (auto const& origin : keys_to_delete) {
     auto it = issuer_configs_.find(origin);
-    CHECK(it != issuer_configs_.end(), base::NotFatalUntil::M130);
+    CHECK(it != issuer_configs_.end());
     issuer_configs_.erase(it);
   }
   for (const auto& kv : key_value_pairs_to_update) {
@@ -133,7 +132,7 @@
   }
   for (auto const& origin : keys_to_delete) {
     auto it = toplevel_configs_.find(origin);
-    CHECK(it != toplevel_configs_.end(), base::NotFatalUntil::M130);
+    CHECK(it != toplevel_configs_.end());
     toplevel_configs_.erase(it);
   }
   return data_deleted;
@@ -176,7 +175,7 @@
   }
   for (auto const& key : keys_to_delete) {
     auto it = issuer_toplevel_pair_configs_.find(key);
-    CHECK(it != issuer_toplevel_pair_configs_.end(), base::NotFatalUntil::M130);
+    CHECK(it != issuer_toplevel_pair_configs_.end());
     issuer_toplevel_pair_configs_.erase(it);
   }
   return data_deleted;
diff --git a/services/network/url_loader_util.cc b/services/network/url_loader_util.cc
index 2a0ea6e..c56c009 100644
--- a/services/network/url_loader_util.cc
+++ b/services/network/url_loader_util.cc
@@ -338,7 +338,7 @@
             body, element.As<DataElementBytes>()));
         break;
       case network::mojom::DataElementDataView::Tag::kFile:
-        CHECK(opened_file != opened_files.end(), base::NotFatalUntil::M130);
+        CHECK(opened_file != opened_files.end());
         element_readers.push_back(std::make_unique<FileElementReader>(
             body, file_task_runner, element.As<network::DataElementFile>(),
             std::move(*opened_file++)));
diff --git a/services/on_device_model/on_device_model_service.cc b/services/on_device_model/on_device_model_service.cc
index 0c2ebdb..a9296bb 100644
--- a/services/on_device_model/on_device_model_service.cc
+++ b/services/on_device_model/on_device_model_service.cc
@@ -11,7 +11,6 @@
 
 #include "base/feature_list.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/task/bind_post_task.h"
 #include "base/task/task_traits.h"
@@ -491,7 +490,7 @@
     return;
   }
   auto it = models_.find(model.get());
-  CHECK(it != models_.end(), base::NotFatalUntil::M130);
+  CHECK(it != models_.end());
   models_.erase(it);
 }
 
diff --git a/services/proxy_resolver/proxy_host_resolver_cache.cc b/services/proxy_resolver/proxy_host_resolver_cache.cc
index c564e20..80324da 100644
--- a/services/proxy_resolver/proxy_host_resolver_cache.cc
+++ b/services/proxy_resolver/proxy_host_resolver_cache.cc
@@ -11,7 +11,6 @@
 #include <vector>
 
 #include "base/check_op.h"
-#include "base/not_fatal_until.h"
 #include "base/time/time.h"
 #include "net/base/ip_address.h"
 #include "net/base/net_errors.h"
@@ -40,8 +39,7 @@
   // Delete any old, now-obsolete entries.
   auto old_entry = entries_.find(key);
   if (old_entry != entries_.end()) {
-    CHECK(old_entry->second.expiration_list_it != expiration_list_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(old_entry->second.expiration_list_it != expiration_list_.end());
     expiration_list_.erase(old_entry->second.expiration_list_it);
     entries_.erase(old_entry);
   }
@@ -73,8 +71,7 @@
   if (entry == entries_.end())
     return nullptr;
 
-  CHECK(entry->second.expiration_list_it != expiration_list_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(entry->second.expiration_list_it != expiration_list_.end());
   if (entry->second.expiration < base::TimeTicks::Now()) {
     expiration_list_.erase(std::move(entry->second.expiration_list_it));
     entries_.erase(entry);
diff --git a/services/proxy_resolver_win/windows_system_proxy_resolver_impl.cc b/services/proxy_resolver_win/windows_system_proxy_resolver_impl.cc
index 870b1f5c..518857923 100644
--- a/services/proxy_resolver_win/windows_system_proxy_resolver_impl.cc
+++ b/services/proxy_resolver_win/windows_system_proxy_resolver_impl.cc
@@ -16,7 +16,6 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/ref_counted.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/sequenced_task_runner.h"
@@ -291,7 +290,7 @@
 
   // Now, it's finally safe to delete this object.
   auto it = parent_->requests_.find(this);
-  CHECK(it != parent_->requests_.end(), base::NotFatalUntil::M130);
+  CHECK(it != parent_->requests_.end());
   parent_->requests_.erase(it);
 
   // DO NOT ADD ANYTHING BELOW THIS LINE, THE OBJECT HAS NOW BEEN DESTROYED.
diff --git a/services/resource_coordinator/memory_instrumentation/coordinator_impl.cc b/services/resource_coordinator/memory_instrumentation/coordinator_impl.cc
index ab6c3fdd..8d1d02de 100644
--- a/services/resource_coordinator/memory_instrumentation/coordinator_impl.cc
+++ b/services/resource_coordinator/memory_instrumentation/coordinator_impl.cc
@@ -17,7 +17,6 @@
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "base/trace_event/memory_dump_request_args.h"
@@ -484,12 +483,11 @@
                                                  OSMemDumpMap os_dumps) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   auto request_it = in_progress_vm_region_requests_.find(dump_guid);
-  CHECK(request_it != in_progress_vm_region_requests_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(request_it != in_progress_vm_region_requests_.end());
 
   QueuedVmRegionRequest* request = request_it->second.get();
   auto it = request->pending_responses.find(process_id);
-  CHECK(it != request->pending_responses.end(), base::NotFatalUntil::M130);
+  CHECK(it != request->pending_responses.end());
   request->pending_responses.erase(it);
   request->responses[process_id].os_dumps = std::move(os_dumps);
 
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.cc b/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.cc
index 06ff7f2..89914f7 100644
--- a/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.cc
+++ b/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.cc
@@ -7,7 +7,6 @@
 #include "base/containers/flat_map.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
-#include "base/not_fatal_until.h"
 #include "base/process/process.h"
 #include "base/synchronization/lock.h"
 #include "base/task/single_thread_task_runner.h"
@@ -103,8 +102,7 @@
   DCHECK(success || !process_memory_dump);
 
   auto callback_it = pending_chrome_callbacks_.find(dump_guid);
-  CHECK(callback_it != pending_chrome_callbacks_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(callback_it != pending_chrome_callbacks_.end());
 
   auto callback = std::move(callback_it->second);
   pending_chrome_callbacks_.erase(callback_it);
diff --git a/services/service_manager/service_manager.cc b/services/service_manager/service_manager.cc
index eeebb67..40bd3b9 100644
--- a/services/service_manager/service_manager.cc
+++ b/services/service_manager/service_manager.cc
@@ -13,7 +13,6 @@
 #include "base/functional/callback_helpers.h"
 #include "base/logging.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/path_service.h"
 #include "base/process/process.h"
 #include "base/process/process_handle.h"
@@ -393,7 +392,7 @@
 
   MakeInstanceUnreachable(instance);
   auto it = instances_.find(instance);
-  CHECK(it != instances_.end(), base::NotFatalUntil::M130);
+  CHECK(it != instances_.end());
 
   // Deletes |instance|.
   instances_.erase(it);
diff --git a/sql/BUILD.gn b/sql/BUILD.gn
index 24fa1426..14fbb47 100644
--- a/sql/BUILD.gn
+++ b/sql/BUILD.gn
@@ -33,6 +33,8 @@
     "sandboxed_vfs.h",
     "sandboxed_vfs_file.cc",
     "sandboxed_vfs_file.h",
+    "sandboxed_vfs_file_impl.cc",
+    "sandboxed_vfs_file_impl.h",
     "sql_features.cc",
     "sql_features.h",
     "sql_memory_dump_provider.cc",
diff --git a/sql/sandboxed_vfs.cc b/sql/sandboxed_vfs.cc
index c8198fa6..b6bf826f 100644
--- a/sql/sandboxed_vfs.cc
+++ b/sql/sandboxed_vfs.cc
@@ -178,9 +178,20 @@
     return Open(full_path, result_file, new_flags, granted_flags);
   }
 
-  SandboxedVfsFile::Create(std::move(file), std::move(file_path),
-                           VfsFileTypeFromPath(full_path),
-                           this, result_file);
+  SandboxedVfsFile* vfs_file =
+      delegate_->RetrieveSandboxedVfsFile(std::move(file), std::move(file_path),
+                                          VfsFileTypeFromPath(full_path), this);
+  if (!vfs_file) {
+    return SQLITE_CANTOPEN;
+  }
+
+  // Bind the sandboxed file pointer with the sqlite_file structure. This
+  // pointer can later be unboxed (retrieved from the vfs_file structure after
+  // an upcast from sqlite_file* to a SandboxedVfsFileSqliteBridge*) and use
+  // this pointer to redirect the calls (from the sqlite io_methods calls) to
+  // their corresponding sandboxed implementation.
+  SandboxedVfsFile::BindSandboxedFile(vfs_file, result_file);
+
   if (granted_flags)
     *granted_flags = requested_flags;
   return SQLITE_OK;
diff --git a/sql/sandboxed_vfs.h b/sql/sandboxed_vfs.h
index 98d2b95..f318bab 100644
--- a/sql/sandboxed_vfs.h
+++ b/sql/sandboxed_vfs.h
@@ -12,10 +12,23 @@
 #include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/time/time.h"
+#include "sql/sandboxed_vfs_file.h"
 #include "third_party/sqlite/sqlite3.h"
 
 namespace sql {
 
+// The file types associated with a SQLite database.
+enum class SandboxedVfsFileType {
+  // The main file, which stores the database pages.
+  kDatabase,
+  // The transaction rollback journal file. Used when WAL is off.
+  // This file has the same path as the database, plus the "-journal" suffix.
+  kJournal,
+  // The Write-Ahead Log (WAL) file.
+  // This file has the same path as the database, plus the "-wal" suffix.
+  kWal,
+};
+
 // SQLite VFS file implementation that works in a sandboxed process.
 //
 // Instances are thread-friendly.
@@ -36,6 +49,17 @@
    public:
     virtual ~Delegate() = default;
 
+    // Retrieve a sandboxed file associated to `file`.
+    //
+    // Returns the sandboxed file for a given file. Do not take ownership of the
+    // returned instance. The VFS is responsible for the liveness of this
+    // object.
+    virtual SandboxedVfsFile* RetrieveSandboxedVfsFile(
+        base::File file,
+        base::FilePath file_path,
+        SandboxedVfsFileType file_type,
+        SandboxedVfs* vfs) = 0;
+
     // Opens a file.
     //
     // `file_path` is the parsed version of a path passed by SQLite to Open().
diff --git a/sql/sandboxed_vfs_file.cc b/sql/sandboxed_vfs_file.cc
index 2fc43a6a..f6abcfe 100644
--- a/sql/sandboxed_vfs_file.cc
+++ b/sql/sandboxed_vfs_file.cc
@@ -133,18 +133,15 @@
 
 }  // namespace
 
+SandboxedVfsFile::SandboxedVfsFile() = default;
+SandboxedVfsFile::~SandboxedVfsFile() = default;
+
 // static
-void SandboxedVfsFile::Create(base::File file,
-                              base::FilePath file_path,
-                              SandboxedVfsFileType file_type,
-                              SandboxedVfs* vfs,
-                              sqlite3_file& buffer) {
+void SandboxedVfsFile::BindSandboxedFile(SandboxedVfsFile* vfs_file,
+                                         sqlite3_file& buffer) {
   SandboxedVfsFileSqliteBridge& bridge =
       SandboxedVfsFileSqliteBridge::FromSqliteFile(buffer);
-  bridge.sandboxed_vfs_file =
-      new SandboxedVfsFile(std::move(file), std::move(file_path),
-                           file_type,
-                           vfs);
+  bridge.sandboxed_vfs_file = vfs_file;
   bridge.sqlite_file.pMethods = GetSqliteIoMethods();
 }
 
@@ -154,417 +151,6 @@
               .sandboxed_vfs_file;
 }
 
-int SandboxedVfsFile::Close() {
-  file_.Close();
-  delete this;
-  return SQLITE_OK;
-}
-
-int SandboxedVfsFile::Read(void* buffer, int size, sqlite3_int64 offset) {
-  DCHECK(buffer);
-  DCHECK_GE(size, 0);
-  DCHECK_GE(offset, 0);
-
-  // See http://www.sqlite.org/fileformat2.html#database_header
-  constexpr int kSqliteDatabaseHeaderOffset = 0;
-  constexpr int kSqliteDatabaseHeaderSize = 100;
-  // SQLite's locking protocol only acquires locks on the database file. The
-  // journal and the WAL file are always unlocked. Also, as an optimization,
-  // SQLite first reads the database header without locking the file.
-  DCHECK(sqlite_lock_mode_ > SQLITE_LOCK_NONE ||
-         file_type_ != SandboxedVfsFileType::kDatabase ||
-         (offset == kSqliteDatabaseHeaderOffset &&
-          size == kSqliteDatabaseHeaderSize))
-      << "Read from database file with lock mode " << sqlite_lock_mode_
-      << "of size" << size << " at offset " << offset;
-
-  char* data = reinterpret_cast<char*>(buffer);
-
-  // If we supported mmap()ed files, we'd check for a memory mapping here,
-  // and try to fill as much of the request as possible from the mmap()ed
-  // region.
-
-  int bytes_read = file_.Read(offset, data, size);
-  DCHECK_LE(bytes_read, size);
-  if (bytes_read == size)
-    return SQLITE_OK;
-
-  if (bytes_read < 0) {
-    // SQLite first reads the database header without locking the file. On
-    // Windows, this read will fail if there is an exclusive lock on the file,
-    // even if the current process owns that lock.
-    if (sqlite_lock_mode_ == SQLITE_LOCK_NONE) {
-      // The unlocked read is considered an optimization. SQLite can continue
-      // even if the read fails, as long as failure is communicated by zeroing
-      // out the output buffer.
-      std::memset(data, 0, size);
-      return SQLITE_OK;
-    }
-
-    vfs_->SetLastError(base::File::GetLastFileError());
-    return SQLITE_IOERR_READ;
-  }
-
-  // SQLite requires that we fill the unread bytes in the buffer with zeros.
-  std::memset(data + bytes_read, 0, size - bytes_read);
-  return SQLITE_IOERR_SHORT_READ;
-}
-
-int SandboxedVfsFile::Write(const void* buffer,
-                            int size,
-                            sqlite3_int64 offset) {
-  DCHECK(buffer);
-  DCHECK_GE(size, 0);
-  DCHECK_GE(offset, 0);
-
-  // SQLite's locking protocol only acquires locks on the database file. The
-  // journal and the WAL file are always unlocked.
-  DCHECK(sqlite_lock_mode_ == SQLITE_LOCK_EXCLUSIVE ||
-         file_type_ != SandboxedVfsFileType::kDatabase)
-      << "Write to database file with lock mode " << sqlite_lock_mode_;
-
-  const char* data = reinterpret_cast<const char*>(buffer);
-
-  // If we supported mmap()ed files, we'd check for a memory mapping here,
-  // and try to fill as much of the request as possible by copying to the
-  // mmap()ed region.
-
-  int bytes_written = file_.Write(offset, data, size);
-  DCHECK_LE(bytes_written, size);
-  if (bytes_written >= size)
-    return SQLITE_OK;
-
-  base::File::Error last_error = base::File::GetLastFileError();
-  vfs_->SetLastError(last_error);
-  if (last_error == base::File::Error::FILE_ERROR_NO_SPACE)
-    return SQLITE_FULL;
-
-  return SQLITE_IOERR_WRITE;
-}
-
-int SandboxedVfsFile::Truncate(sqlite3_int64 size) {
-  if (file_.SetLength(size)) {
-    return SQLITE_OK;
-  }
-
-  return SQLITE_IOERR_TRUNCATE;
-}
-
-int SandboxedVfsFile::Sync(int flags) {
-  // NOTE: SQLite passes in (SQLITE_SYNC_NORMAL or SQLITE_SYNC_FULL),
-  //       potentially OR-ed with SQLITE_SYNC_DATAONLY. Implementing these could
-  //       lead to better performance.
-  if (!file_.Flush()) {
-    vfs_->SetLastError(base::File::GetLastFileError());
-    return SQLITE_IOERR_FSYNC;
-  }
-
-  // The unix VFS also syncs the file's directory on the first xSync() call.
-  // Chrome's LevelDB Env implementation does the same for specific files
-  // (database manifests).
-  //
-  // For WebSQL, we would want to sync the directory at file open time, when the
-  // file is opened for writing.
-
-  return SQLITE_OK;
-}
-
-int SandboxedVfsFile::FileSize(sqlite3_int64* result_size) {
-  int64_t length = file_.GetLength();
-  if (length < 0) {
-    vfs_->SetLastError(base::File::GetLastFileError());
-    return SQLITE_IOERR_FSTAT;
-  }
-
-  // SQLite's unix VFS reports 1-byte files as empty. This is documented as a
-  // workaround for a fairly obscure bug. See unixFileSize() in os_unix.c.
-  if (length == 1)
-    length = 0;
-
-  *result_size = length;
-  return SQLITE_OK;
-}
-
-namespace {
-
-// True if our simplified implementation uses an exclusive lock for a mode.
-bool IsExclusiveLockMode(int sqlite_lock_mode) {
-  switch (sqlite_lock_mode) {
-    case SQLITE_LOCK_NONE:
-    case SQLITE_LOCK_SHARED:
-      return false;
-
-    case SQLITE_LOCK_RESERVED:
-    case SQLITE_LOCK_PENDING:
-    case SQLITE_LOCK_EXCLUSIVE:
-      return true;
-  }
-
-  NOTREACHED() << "Unsupported mode: " << sqlite_lock_mode;
-}
-
-}  // namespace
-
-int SandboxedVfsFile::Lock(int mode) {
-  DCHECK_GE(mode, sqlite_lock_mode_)
-      << "SQLite asked the VFS to lock the file up to mode " << mode
-      << " but the file is already locked at mode " << sqlite_lock_mode_;
-
-#if BUILDFLAG(IS_FUCHSIA)
-  return SQLITE_IOERR_LOCK;
-#else
-  base::File::LockMode file_lock_mode = base::File::LockMode::kExclusive;
-
-  switch (mode) {
-    case SQLITE_LOCK_NONE:
-      return SQLITE_OK;
-
-    case SQLITE_LOCK_SHARED:
-      if (sqlite_lock_mode_ != SQLITE_LOCK_NONE)
-        return SQLITE_OK;
-
-      file_lock_mode = base::File::LockMode::kShared;
-      break;
-
-    case SQLITE_LOCK_RESERVED:
-      // A SHARED lock is required before a RESERVED lock is acquired.
-      DCHECK_EQ(sqlite_lock_mode_, SQLITE_LOCK_SHARED);
-      file_lock_mode = base::File::LockMode::kExclusive;
-      break;
-
-    case SQLITE_LOCK_PENDING:
-      NOTREACHED() << "SQLite never directly asks for PENDING locks";
-
-    case SQLITE_LOCK_EXCLUSIVE:
-      // A SHARED lock is required before an EXCLUSIVE lock is acquired.
-      //
-      // No higher level is required. In fact, SQLite upgrades the lock directly
-      // from SHARED to EXCLUSIVE when rolling back a transaction, to avoid
-      // having other readers queue up in the RESERVED state.
-      DCHECK_GE(sqlite_lock_mode_, SQLITE_LOCK_SHARED);
-
-      if (IsExclusiveLockMode(sqlite_lock_mode_)) {
-        sqlite_lock_mode_ = mode;
-        return SQLITE_OK;
-      }
-      file_lock_mode = base::File::LockMode::kExclusive;
-      break;
-
-    default:
-      NOTREACHED() << "Unimplemented xLock() mode: " << mode;
-  }
-
-  DCHECK_EQ(IsExclusiveLockMode(mode),
-            file_lock_mode == base::File::LockMode::kExclusive)
-      << "Incorrect file_lock_mode logic for SQLite mode: " << mode;
-
-  // On POSIX, it would be possible to upgrade atomically from a shared lock to
-  // an exclusive lock. This implementation prioritizes the simplicity of no
-  // platform-specific code over being faster in high contention cases.
-  if (sqlite_lock_mode_ != SQLITE_LOCK_NONE) {
-    base::File::Error error = file_.Unlock();
-    if (error != base::File::FILE_OK) {
-      vfs_->SetLastError(base::File::GetLastFileError());
-      return SQLITE_IOERR_LOCK;
-    }
-    sqlite_lock_mode_ = SQLITE_LOCK_NONE;
-  }
-
-  base::File::Error error = file_.Lock(file_lock_mode);
-  if (error != base::File::FILE_OK) {
-    vfs_->SetLastError(base::File::GetLastFileError());
-    return SQLITE_IOERR_LOCK;
-  }
-
-  sqlite_lock_mode_ = mode;
-  return SQLITE_OK;
-#endif  // BUILDFLAG(IS_FUCHSIA)
-}
-
-int SandboxedVfsFile::Unlock(int mode) {
-  // The 2nd term in the DCHECK predicate is there because SQLite occasionally
-  // attempts to unlock (to SQLITE_LOCK_NONE) a file that was already unlocked.
-  // We're not aware of any other case of no-op VFS unlock calls.
-  DCHECK(mode < sqlite_lock_mode_ ||
-         (mode == sqlite_lock_mode_ && mode == SQLITE_LOCK_NONE))
-      << "SQLite asked the VFS to unlock the file down to mode " << mode
-      << " but the file is already at mode " << sqlite_lock_mode_;
-
-  // No-op if we're already unlocked or at the requested mode.
-  if (sqlite_lock_mode_ == mode || sqlite_lock_mode_ == SQLITE_LOCK_NONE)
-    return SQLITE_OK;
-
-#if BUILDFLAG(IS_FUCHSIA)
-  return SQLITE_IOERR_UNLOCK;
-#else
-  // On POSIX, it is possible to downgrade atomically from an exclusive lock to
-  // a shared lock. SQLite's unix VFS takes advantage of this. This
-  // implementation prioritizes the simplicity of no platform-specific code over
-  // being faster in high contention cases.
-  base::File::Error error = file_.Unlock();
-  if (error != base::File::FILE_OK) {
-    vfs_->SetLastError(base::File::GetLastFileError());
-    return SQLITE_IOERR_UNLOCK;
-  }
-
-  if (mode == SQLITE_LOCK_NONE) {
-    sqlite_lock_mode_ = mode;
-    return SQLITE_OK;
-  }
-
-  DCHECK_EQ(mode, SQLITE_LOCK_SHARED);
-  error = file_.Lock(base::File::LockMode::kShared);
-  if (error == base::File::FILE_OK) {
-    sqlite_lock_mode_ = mode;
-    return SQLITE_OK;
-  }
-
-  // Gave up the exclusive lock, but failed to get a shared lock.
-  vfs_->SetLastError(base::File::GetLastFileError());
-  sqlite_lock_mode_ = SQLITE_LOCK_NONE;
-  return SQLITE_IOERR_UNLOCK;
-#endif  // BUILDFLAG(IS_FUCHSIA)
-}
-
-int SandboxedVfsFile::CheckReservedLock(int* has_reserved_lock) {
-  if (IsExclusiveLockMode(sqlite_lock_mode_)) {
-    *has_reserved_lock = 1;
-    return SQLITE_OK;
-  }
-
-  if (sqlite_lock_mode_ == SQLITE_LOCK_SHARED) {
-    // Lock modes at or above RESERVED map to exclusive locks in our simplified
-    // implementation. If this process has a shared lock, no other process can
-    // have an exclusive lock.
-    *has_reserved_lock = 0;
-    return SQLITE_OK;
-  }
-
-#if BUILDFLAG(IS_FUCHSIA)
-  return SQLITE_IOERR_CHECKRESERVEDLOCK;
-#else
-  // On POSIX, it's possible to query the existing lock state of a file. The
-  // SQLite unix VFS takes advantage of this. On Windows, this isn't the case.
-  // Follow the strategy of the Windows VFS, which checks by trying to get an
-  // exclusive lock on the file.
-  base::File::Error error = file_.Lock(base::File::LockMode::kShared);
-  if (error != base::File::FILE_OK) {
-    *has_reserved_lock = 1;
-    return SQLITE_OK;
-  }
-
-  *has_reserved_lock = 0;
-  if (file_.Unlock() == base::File::FILE_OK)
-    return SQLITE_OK;
-
-  // We acquired a shared lock that we can't get rid of.
-  sqlite_lock_mode_ = SQLITE_LOCK_SHARED;
-  return SQLITE_IOERR_CHECKRESERVEDLOCK;
-#endif  // BUILDFLAG(IS_FUCHSIA)
-}
-
-int SandboxedVfsFile::FileControl(int opcode, void* data) {
-  switch (opcode) {
-    case SQLITE_FCNTL_MMAP_SIZE:
-      // Implementing memory-mapping will require handling this correctly.
-      return SQLITE_NOTFOUND;
-    default:
-      return SQLITE_NOTFOUND;
-  }
-}
-
-int SandboxedVfsFile::SectorSize() {
-  return 0;
-}
-
-int SandboxedVfsFile::DeviceCharacteristics() {
-  // TODO(pwnall): Figure out if we can get away with returning 0 on Windows.
-#if BUILDFLAG(IS_WIN)
-  return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN;
-#else
-  // NOTE: SQLite's unix VFS attempts to detect the underlying filesystem and
-  // sets some flags based on the result.
-  return 0;
-#endif  // BUILDFLAG(IS_WIN)
-}
-
-int SandboxedVfsFile::ShmMap(int page_index,
-                             int page_size,
-                             int extend_file_if_needed,
-                             void volatile** result) {
-  DCHECK_GE(page_index, 0);
-  DCHECK_GE(page_size, 0);
-  DCHECK(result);
-
-  // https://www.sqlite.org/wal.html#use_of_wal_without_shared_memory states
-  // that SQLite only attempts to use shared memory "-shm" files for databases
-  // in WAL mode that may be accessed by multiple processes (are not EXCLUSIVE).
-  //
-  // Chrome will not only use WAL mode on EXCLUSIVE databases.
-  NOTREACHED() << "SQLite should not attempt to use shared memory";
-}
-
-int SandboxedVfsFile::ShmLock(int offset, int size, int flags) {
-  DCHECK_GE(offset, 0);
-  DCHECK_GE(size, 0);
-
-  // https://www.sqlite.org/wal.html#use_of_wal_without_shared_memory states
-  // that SQLite only attempts to use shared memory "-shm" files for databases
-  // in WAL mode that may be accessed by multiple processes (are not EXCLUSIVE).
-  //
-  // Chrome will not only use WAL mode on EXCLUSIVE databases.
-  NOTREACHED() << "SQLite should not attempt to use shared memory";
-}
-
-void SandboxedVfsFile::ShmBarrier() {
-  // https://www.sqlite.org/wal.html#use_of_wal_without_shared_memory states
-  // that SQLite only attempts to use shared memory "-shm" files for databases
-  // in WAL mode that may be accessed by multiple processes (are not EXCLUSIVE).
-  //
-  // Chrome will not only use WAL mode on EXCLUSIVE databases.
-  NOTREACHED() << "SQLite should not attempt to use shared memory";
-}
-
-int SandboxedVfsFile::ShmUnmap(int also_delete_file) {
-  // https://www.sqlite.org/wal.html#use_of_wal_without_shared_memory states
-  // that SQLite only attempts to use shared memory "-shm" files for databases
-  // in WAL mode that may be accessed by multiple processes (are not EXCLUSIVE).
-  //
-  // Chrome will not only use WAL mode on EXCLUSIVE databases.
-  NOTREACHED() << "SQLite should not attempt to use shared memory";
-}
-
-int SandboxedVfsFile::Fetch(sqlite3_int64 offset, int size, void** result) {
-  DCHECK_GE(offset, 0);
-  DCHECK_GE(size, 0);
-  DCHECK(result);
-
-  // NOTE: This would be needed for mmap()ed file support.
-  *result = nullptr;
-  return SQLITE_IOERR;
-}
-
-int SandboxedVfsFile::Unfetch(sqlite3_int64 offset, void* fetch_result) {
-  DCHECK_GE(offset, 0);
-  DCHECK(fetch_result);
-
-  // NOTE: This would be needed for mmap()ed file support.
-  return SQLITE_IOERR;
-}
-
-SandboxedVfsFile::SandboxedVfsFile(base::File file,
-                                   base::FilePath file_path,
-                                   SandboxedVfsFileType file_type,
-                                   SandboxedVfs* vfs)
-    : file_(std::move(file)),
-      sqlite_lock_mode_(SQLITE_LOCK_NONE),
-      vfs_(vfs),
-      file_type_(file_type),
-      file_path_(std::move(file_path)) {
-}
-
-SandboxedVfsFile::~SandboxedVfsFile() = default;
-
 // static
 SandboxedVfsFileSqliteBridge& SandboxedVfsFileSqliteBridge::FromSqliteFile(
     sqlite3_file& sqlite_file) {
diff --git a/sql/sandboxed_vfs_file.h b/sql/sandboxed_vfs_file.h
index c03c0826..21ac6d4 100644
--- a/sql/sandboxed_vfs_file.h
+++ b/sql/sandboxed_vfs_file.h
@@ -5,97 +5,48 @@
 #ifndef SQL_SANDBOXED_VFS_FILE_H_
 #define SQL_SANDBOXED_VFS_FILE_H_
 
-#include "base/files/file.h"
-#include "base/files/file_path.h"
+#include "base/component_export.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/raw_ptr_exclusion.h"
 #include "third_party/sqlite/sqlite3.h"
 
 namespace sql {
 
-// The file types associated with a SQLite database.
-enum class SandboxedVfsFileType {
-  // The main file, which stores the database pages.
-  kDatabase,
-  // The transaction rollback journal file. Used when WAL is off.
-  // This file has the same path as the database, plus the "-journal" suffix.
-  kJournal,
-  // The Write-Ahead Log (WAL) file.
-  // This file has the same path as the database, plus the "-wal" suffix.
-  kWal,
-};
-
-class SandboxedVfs;
-
-// SQLite VFS file implementation that works in a sandboxed process.
-//
-// An instance is created when SQLite calls into SandboxedVfs::Open(). The
-// instance is deleted by a call to SandboxedVfsFile::Close().
-//
-// The SQLite VFS API includes a complex locking strategy documented in
-// https://www.sqlite.org/lockingv3.html
-//
-// This implementation uses a simplified locking strategy, where we grab an
-// exclusive lock when entering any of the modes that prepare for a transition
-// to EXCLUSIVE. (These modes are RESERVED and PENDING). This approach is easy
-// to implement on top of base::File's locking primitives, at the cost of some
-// false contention, which makes us slower under high concurrency.
-//
-// SQLite's built-in VFSes use the OS support for locking a range of bytes in
-// the file, rather locking than the whole file.
-class SandboxedVfsFile {
+// SQLite VFS file interface of an vfs file that works in a sandboxed process.
+class COMPONENT_EXPORT(SQL) SandboxedVfsFile {
  public:
-  // Creates an instance in the given buffer. Note that `vfs` MUST outlive the
-  // returned sqlite3_file object.
-  static void Create(base::File file,
-                     base::FilePath file_path,
-                     SandboxedVfsFileType file_type,
-                     SandboxedVfs* vfs,
-                     sqlite3_file& buffer);
+  SandboxedVfsFile();
+  virtual ~SandboxedVfsFile();
+
+  // Bind the `vfs_file` to an instance in the given sqlite3_file buffer.
+  static void BindSandboxedFile(SandboxedVfsFile* vfs_file,
+                                sqlite3_file& buffer);
 
   // Extracts the instance bridged to the given SQLite VFS file.
   static SandboxedVfsFile& FromSqliteFile(sqlite3_file& sqlite_file);
 
   // sqlite3_file implementation.
-  int Close();
-  int Read(void* buffer, int size, sqlite3_int64 offset);
-  int Write(const void* buffer, int size, sqlite3_int64 offset);
-  int Truncate(sqlite3_int64 size);
-  int Sync(int flags);
-  int FileSize(sqlite3_int64* result_size);
-  int Lock(int mode);
-  int Unlock(int mode);
-  int CheckReservedLock(int* has_reserved_lock);
-  int FileControl(int opcode, void* data);
-  int SectorSize();
-  int DeviceCharacteristics();
-  int ShmMap(int page_index,
-             int page_size,
-             int extend_file_if_needed,
-             void volatile** result);
-  int ShmLock(int offset, int size, int flags);
-  void ShmBarrier();
-  int ShmUnmap(int also_delete_file);
-  int Fetch(sqlite3_int64 offset, int size, void** result);
-  int Unfetch(sqlite3_int64 offset, void* fetch_result);
-
- private:
-  SandboxedVfsFile(base::File file,
-                   base::FilePath file_path,
-                   SandboxedVfsFileType file_type,
-                   SandboxedVfs* vfs);
-  ~SandboxedVfsFile();
-
-  // Constructed from a file handle passed from the browser process.
-  base::File file_;
-  // One of the SQLite locking mode constants.
-  int sqlite_lock_mode_;
-  // The SandboxedVfs that created this instance.
-  const raw_ptr<SandboxedVfs> vfs_;
-  // Tracked to check assumptions about SQLite's locking protocol.
-  const SandboxedVfsFileType file_type_;
-  // Used to identify the file in IPCs to the browser process.
-  const base::FilePath file_path_;
+  virtual int Close() = 0;
+  virtual int Read(void* buffer, int size, sqlite3_int64 offset) = 0;
+  virtual int Write(const void* buffer, int size, sqlite3_int64 offset) = 0;
+  virtual int Truncate(sqlite3_int64 size) = 0;
+  virtual int Sync(int flags) = 0;
+  virtual int FileSize(sqlite3_int64* result_size) = 0;
+  virtual int Lock(int mode) = 0;
+  virtual int Unlock(int mode) = 0;
+  virtual int CheckReservedLock(int* has_reserved_lock) = 0;
+  virtual int FileControl(int opcode, void* data) = 0;
+  virtual int SectorSize() = 0;
+  virtual int DeviceCharacteristics() = 0;
+  virtual int ShmMap(int page_index,
+                     int page_size,
+                     int extend_file_if_needed,
+                     void volatile** result) = 0;
+  virtual int ShmLock(int offset, int size, int flags) = 0;
+  virtual void ShmBarrier() = 0;
+  virtual int ShmUnmap(int also_delete_file) = 0;
+  virtual int Fetch(sqlite3_int64 offset, int size, void** result) = 0;
+  virtual int Unfetch(sqlite3_int64 offset, void* fetch_result) = 0;
 };
 
 // sqlite3_file "subclass" that bridges to a SandboxedVfsFile instance.
diff --git a/sql/sandboxed_vfs_file_impl.cc b/sql/sandboxed_vfs_file_impl.cc
new file mode 100644
index 0000000..8857891
--- /dev/null
+++ b/sql/sandboxed_vfs_file_impl.cc
@@ -0,0 +1,435 @@
+// 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.
+
+#ifdef UNSAFE_BUFFERS_BUILD
+// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
+#pragma allow_unsafe_buffers
+#endif
+
+#include "sql/sandboxed_vfs_file_impl.h"
+
+#include "base/notreached.h"
+#include "sql/sandboxed_vfs.h"
+
+namespace sql {
+
+SandboxedVfsFileImpl::SandboxedVfsFileImpl(base::File file,
+                                           base::FilePath file_path,
+                                           SandboxedVfsFileType file_type,
+                                           SandboxedVfs* vfs)
+    : SandboxedVfsFile(),
+      file_(std::move(file)),
+      sqlite_lock_mode_(SQLITE_LOCK_NONE),
+      vfs_(vfs),
+      file_type_(file_type),
+      file_path_(std::move(file_path)) {}
+
+SandboxedVfsFileImpl::~SandboxedVfsFileImpl() = default;
+
+int SandboxedVfsFileImpl::Close() {
+  file_.Close();
+  delete this;
+  return SQLITE_OK;
+}
+
+int SandboxedVfsFileImpl::Read(void* buffer, int size, sqlite3_int64 offset) {
+  DCHECK(buffer);
+  DCHECK_GE(size, 0);
+  DCHECK_GE(offset, 0);
+
+  // See http://www.sqlite.org/fileformat2.html#database_header
+  constexpr int kSqliteDatabaseHeaderOffset = 0;
+  constexpr int kSqliteDatabaseHeaderSize = 100;
+  // SQLite's locking protocol only acquires locks on the database file. The
+  // journal and the WAL file are always unlocked. Also, as an optimization,
+  // SQLite first reads the database header without locking the file.
+  DCHECK(sqlite_lock_mode_ > SQLITE_LOCK_NONE ||
+         file_type_ != SandboxedVfsFileType::kDatabase ||
+         (offset == kSqliteDatabaseHeaderOffset &&
+          size == kSqliteDatabaseHeaderSize))
+      << "Read from database file with lock mode " << sqlite_lock_mode_
+      << "of size" << size << " at offset " << offset;
+
+  char* data = reinterpret_cast<char*>(buffer);
+
+  // If we supported mmap()ed files, we'd check for a memory mapping here,
+  // and try to fill as much of the request as possible from the mmap()ed
+  // region.
+
+  int bytes_read = file_.Read(offset, data, size);
+  DCHECK_LE(bytes_read, size);
+  if (bytes_read == size) {
+    return SQLITE_OK;
+  }
+
+  if (bytes_read < 0) {
+    // SQLite first reads the database header without locking the file. On
+    // Windows, this read will fail if there is an exclusive lock on the file,
+    // even if the current process owns that lock.
+    if (sqlite_lock_mode_ == SQLITE_LOCK_NONE) {
+      // The unlocked read is considered an optimization. SQLite can continue
+      // even if the read fails, as long as failure is communicated by zeroing
+      // out the output buffer.
+      std::memset(data, 0, size);
+      return SQLITE_OK;
+    }
+
+    vfs_->SetLastError(base::File::GetLastFileError());
+    return SQLITE_IOERR_READ;
+  }
+
+  // SQLite requires that we fill the unread bytes in the buffer with zeros.
+  std::memset(data + bytes_read, 0, size - bytes_read);
+  return SQLITE_IOERR_SHORT_READ;
+}
+
+int SandboxedVfsFileImpl::Write(const void* buffer,
+                                int size,
+                                sqlite3_int64 offset) {
+  DCHECK(buffer);
+  DCHECK_GE(size, 0);
+  DCHECK_GE(offset, 0);
+
+  // SQLite's locking protocol only acquires locks on the database file. The
+  // journal and the WAL file are always unlocked.
+  DCHECK(sqlite_lock_mode_ == SQLITE_LOCK_EXCLUSIVE ||
+         file_type_ != SandboxedVfsFileType::kDatabase)
+      << "Write to database file with lock mode " << sqlite_lock_mode_;
+
+  const char* data = reinterpret_cast<const char*>(buffer);
+
+  // If we supported mmap()ed files, we'd check for a memory mapping here,
+  // and try to fill as much of the request as possible by copying to the
+  // mmap()ed region.
+
+  int bytes_written = file_.Write(offset, data, size);
+  DCHECK_LE(bytes_written, size);
+  if (bytes_written >= size) {
+    return SQLITE_OK;
+  }
+
+  base::File::Error last_error = base::File::GetLastFileError();
+  vfs_->SetLastError(last_error);
+  if (last_error == base::File::Error::FILE_ERROR_NO_SPACE) {
+    return SQLITE_FULL;
+  }
+
+  return SQLITE_IOERR_WRITE;
+}
+
+int SandboxedVfsFileImpl::Truncate(sqlite3_int64 size) {
+  if (file_.SetLength(size)) {
+    return SQLITE_OK;
+  }
+
+  return SQLITE_IOERR_TRUNCATE;
+}
+
+int SandboxedVfsFileImpl::Sync(int flags) {
+  // NOTE: SQLite passes in (SQLITE_SYNC_NORMAL or SQLITE_SYNC_FULL),
+  //       potentially OR-ed with SQLITE_SYNC_DATAONLY. Implementing these could
+  //       lead to better performance.
+  if (!file_.Flush()) {
+    vfs_->SetLastError(base::File::GetLastFileError());
+    return SQLITE_IOERR_FSYNC;
+  }
+
+  // The unix VFS also syncs the file's directory on the first xSync() call.
+  // Chrome's LevelDB Env implementation does the same for specific files
+  // (database manifests).
+  //
+  // For WebSQL, we would want to sync the directory at file open time, when the
+  // file is opened for writing.
+
+  return SQLITE_OK;
+}
+
+int SandboxedVfsFileImpl::FileSize(sqlite3_int64* result_size) {
+  int64_t length = file_.GetLength();
+  if (length < 0) {
+    vfs_->SetLastError(base::File::GetLastFileError());
+    return SQLITE_IOERR_FSTAT;
+  }
+
+  // SQLite's unix VFS reports 1-byte files as empty. This is documented as a
+  // workaround for a fairly obscure bug. See unixFileSize() in os_unix.c.
+  if (length == 1) {
+    length = 0;
+  }
+
+  *result_size = length;
+  return SQLITE_OK;
+}
+
+namespace {
+
+// True if our simplified implementation uses an exclusive lock for a mode.
+bool IsExclusiveLockMode(int sqlite_lock_mode) {
+  switch (sqlite_lock_mode) {
+    case SQLITE_LOCK_NONE:
+    case SQLITE_LOCK_SHARED:
+      return false;
+
+    case SQLITE_LOCK_RESERVED:
+    case SQLITE_LOCK_PENDING:
+    case SQLITE_LOCK_EXCLUSIVE:
+      return true;
+  }
+
+  NOTREACHED() << "Unsupported mode: " << sqlite_lock_mode;
+}
+
+}  // namespace
+
+int SandboxedVfsFileImpl::Lock(int mode) {
+  DCHECK_GE(mode, sqlite_lock_mode_)
+      << "SQLite asked the VFS to lock the file up to mode " << mode
+      << " but the file is already locked at mode " << sqlite_lock_mode_;
+
+#if BUILDFLAG(IS_FUCHSIA)
+  return SQLITE_IOERR_LOCK;
+#else
+  base::File::LockMode file_lock_mode = base::File::LockMode::kExclusive;
+
+  switch (mode) {
+    case SQLITE_LOCK_NONE:
+      return SQLITE_OK;
+
+    case SQLITE_LOCK_SHARED:
+      if (sqlite_lock_mode_ != SQLITE_LOCK_NONE) {
+        return SQLITE_OK;
+      }
+
+      file_lock_mode = base::File::LockMode::kShared;
+      break;
+
+    case SQLITE_LOCK_RESERVED:
+      // A SHARED lock is required before a RESERVED lock is acquired.
+      DCHECK_EQ(sqlite_lock_mode_, SQLITE_LOCK_SHARED);
+      file_lock_mode = base::File::LockMode::kExclusive;
+      break;
+
+    case SQLITE_LOCK_PENDING:
+      NOTREACHED() << "SQLite never directly asks for PENDING locks";
+
+    case SQLITE_LOCK_EXCLUSIVE:
+      // A SHARED lock is required before an EXCLUSIVE lock is acquired.
+      //
+      // No higher level is required. In fact, SQLite upgrades the lock directly
+      // from SHARED to EXCLUSIVE when rolling back a transaction, to avoid
+      // having other readers queue up in the RESERVED state.
+      DCHECK_GE(sqlite_lock_mode_, SQLITE_LOCK_SHARED);
+
+      if (IsExclusiveLockMode(sqlite_lock_mode_)) {
+        sqlite_lock_mode_ = mode;
+        return SQLITE_OK;
+      }
+      file_lock_mode = base::File::LockMode::kExclusive;
+      break;
+
+    default:
+      NOTREACHED() << "Unimplemented xLock() mode: " << mode;
+  }
+
+  DCHECK_EQ(IsExclusiveLockMode(mode),
+            file_lock_mode == base::File::LockMode::kExclusive)
+      << "Incorrect file_lock_mode logic for SQLite mode: " << mode;
+
+  // On POSIX, it would be possible to upgrade atomically from a shared lock to
+  // an exclusive lock. This implementation prioritizes the simplicity of no
+  // platform-specific code over being faster in high contention cases.
+  if (sqlite_lock_mode_ != SQLITE_LOCK_NONE) {
+    base::File::Error error = file_.Unlock();
+    if (error != base::File::FILE_OK) {
+      vfs_->SetLastError(base::File::GetLastFileError());
+      return SQLITE_IOERR_LOCK;
+    }
+    sqlite_lock_mode_ = SQLITE_LOCK_NONE;
+  }
+
+  base::File::Error error = file_.Lock(file_lock_mode);
+  if (error != base::File::FILE_OK) {
+    vfs_->SetLastError(base::File::GetLastFileError());
+    return SQLITE_IOERR_LOCK;
+  }
+
+  sqlite_lock_mode_ = mode;
+  return SQLITE_OK;
+#endif  // BUILDFLAG(IS_FUCHSIA)
+}
+
+int SandboxedVfsFileImpl::Unlock(int mode) {
+  // The 2nd term in the DCHECK predicate is there because SQLite occasionally
+  // attempts to unlock (to SQLITE_LOCK_NONE) a file that was already unlocked.
+  // We're not aware of any other case of no-op VFS unlock calls.
+  DCHECK(mode < sqlite_lock_mode_ ||
+         (mode == sqlite_lock_mode_ && mode == SQLITE_LOCK_NONE))
+      << "SQLite asked the VFS to unlock the file down to mode " << mode
+      << " but the file is already at mode " << sqlite_lock_mode_;
+
+  // No-op if we're already unlocked or at the requested mode.
+  if (sqlite_lock_mode_ == mode || sqlite_lock_mode_ == SQLITE_LOCK_NONE) {
+    return SQLITE_OK;
+  }
+
+#if BUILDFLAG(IS_FUCHSIA)
+  return SQLITE_IOERR_UNLOCK;
+#else
+  // On POSIX, it is possible to downgrade atomically from an exclusive lock to
+  // a shared lock. SQLite's unix VFS takes advantage of this. This
+  // implementation prioritizes the simplicity of no platform-specific code over
+  // being faster in high contention cases.
+  base::File::Error error = file_.Unlock();
+  if (error != base::File::FILE_OK) {
+    vfs_->SetLastError(base::File::GetLastFileError());
+    return SQLITE_IOERR_UNLOCK;
+  }
+
+  if (mode == SQLITE_LOCK_NONE) {
+    sqlite_lock_mode_ = mode;
+    return SQLITE_OK;
+  }
+
+  DCHECK_EQ(mode, SQLITE_LOCK_SHARED);
+  error = file_.Lock(base::File::LockMode::kShared);
+  if (error == base::File::FILE_OK) {
+    sqlite_lock_mode_ = mode;
+    return SQLITE_OK;
+  }
+
+  // Gave up the exclusive lock, but failed to get a shared lock.
+  vfs_->SetLastError(base::File::GetLastFileError());
+  sqlite_lock_mode_ = SQLITE_LOCK_NONE;
+  return SQLITE_IOERR_UNLOCK;
+#endif  // BUILDFLAG(IS_FUCHSIA)
+}
+
+int SandboxedVfsFileImpl::CheckReservedLock(int* has_reserved_lock) {
+  if (IsExclusiveLockMode(sqlite_lock_mode_)) {
+    *has_reserved_lock = 1;
+    return SQLITE_OK;
+  }
+
+  if (sqlite_lock_mode_ == SQLITE_LOCK_SHARED) {
+    // Lock modes at or above RESERVED map to exclusive locks in our simplified
+    // implementation. If this process has a shared lock, no other process can
+    // have an exclusive lock.
+    *has_reserved_lock = 0;
+    return SQLITE_OK;
+  }
+
+#if BUILDFLAG(IS_FUCHSIA)
+  return SQLITE_IOERR_CHECKRESERVEDLOCK;
+#else
+  // On POSIX, it's possible to query the existing lock state of a file. The
+  // SQLite unix VFS takes advantage of this. On Windows, this isn't the case.
+  // Follow the strategy of the Windows VFS, which checks by trying to get an
+  // exclusive lock on the file.
+  base::File::Error error = file_.Lock(base::File::LockMode::kShared);
+  if (error != base::File::FILE_OK) {
+    *has_reserved_lock = 1;
+    return SQLITE_OK;
+  }
+
+  *has_reserved_lock = 0;
+  if (file_.Unlock() == base::File::FILE_OK) {
+    return SQLITE_OK;
+  }
+
+  // We acquired a shared lock that we can't get rid of.
+  sqlite_lock_mode_ = SQLITE_LOCK_SHARED;
+  return SQLITE_IOERR_CHECKRESERVEDLOCK;
+#endif  // BUILDFLAG(IS_FUCHSIA)
+}
+
+int SandboxedVfsFileImpl::FileControl(int opcode, void* data) {
+  switch (opcode) {
+    case SQLITE_FCNTL_MMAP_SIZE:
+      // Implementing memory-mapping will require handling this correctly.
+      return SQLITE_NOTFOUND;
+    default:
+      return SQLITE_NOTFOUND;
+  }
+}
+
+int SandboxedVfsFileImpl::SectorSize() {
+  return 0;
+}
+
+int SandboxedVfsFileImpl::DeviceCharacteristics() {
+  // TODO(pwnall): Figure out if we can get away with returning 0 on Windows.
+#if BUILDFLAG(IS_WIN)
+  return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN;
+#else
+  // NOTE: SQLite's unix VFS attempts to detect the underlying filesystem and
+  // sets some flags based on the result.
+  return 0;
+#endif  // BUILDFLAG(IS_WIN)
+}
+
+int SandboxedVfsFileImpl::ShmMap(int page_index,
+                                 int page_size,
+                                 int extend_file_if_needed,
+                                 void volatile** result) {
+  DCHECK_GE(page_index, 0);
+  DCHECK_GE(page_size, 0);
+  DCHECK(result);
+
+  // https://www.sqlite.org/wal.html#use_of_wal_without_shared_memory states
+  // that SQLite only attempts to use shared memory "-shm" files for databases
+  // in WAL mode that may be accessed by multiple processes (are not EXCLUSIVE).
+  //
+  // Chrome will not only use WAL mode on EXCLUSIVE databases.
+  NOTREACHED() << "SQLite should not attempt to use shared memory";
+}
+
+int SandboxedVfsFileImpl::ShmLock(int offset, int size, int flags) {
+  DCHECK_GE(offset, 0);
+  DCHECK_GE(size, 0);
+
+  // https://www.sqlite.org/wal.html#use_of_wal_without_shared_memory states
+  // that SQLite only attempts to use shared memory "-shm" files for databases
+  // in WAL mode that may be accessed by multiple processes (are not EXCLUSIVE).
+  //
+  // Chrome will not only use WAL mode on EXCLUSIVE databases.
+  NOTREACHED() << "SQLite should not attempt to use shared memory";
+}
+
+void SandboxedVfsFileImpl::ShmBarrier() {
+  // https://www.sqlite.org/wal.html#use_of_wal_without_shared_memory states
+  // that SQLite only attempts to use shared memory "-shm" files for databases
+  // in WAL mode that may be accessed by multiple processes (are not EXCLUSIVE).
+  //
+  // Chrome will not only use WAL mode on EXCLUSIVE databases.
+  NOTREACHED() << "SQLite should not attempt to use shared memory";
+}
+
+int SandboxedVfsFileImpl::ShmUnmap(int also_delete_file) {
+  // https://www.sqlite.org/wal.html#use_of_wal_without_shared_memory states
+  // that SQLite only attempts to use shared memory "-shm" files for databases
+  // in WAL mode that may be accessed by multiple processes (are not EXCLUSIVE).
+  //
+  // Chrome will not only use WAL mode on EXCLUSIVE databases.
+  NOTREACHED() << "SQLite should not attempt to use shared memory";
+}
+
+int SandboxedVfsFileImpl::Fetch(sqlite3_int64 offset, int size, void** result) {
+  DCHECK_GE(offset, 0);
+  DCHECK_GE(size, 0);
+  DCHECK(result);
+
+  // NOTE: This would be needed for mmap()ed file support.
+  *result = nullptr;
+  return SQLITE_IOERR;
+}
+
+int SandboxedVfsFileImpl::Unfetch(sqlite3_int64 offset, void* fetch_result) {
+  DCHECK_GE(offset, 0);
+  DCHECK(fetch_result);
+
+  // NOTE: This would be needed for mmap()ed file support.
+  return SQLITE_IOERR;
+}
+
+}  // namespace sql
diff --git a/sql/sandboxed_vfs_file_impl.h b/sql/sandboxed_vfs_file_impl.h
new file mode 100644
index 0000000..26a33638
--- /dev/null
+++ b/sql/sandboxed_vfs_file_impl.h
@@ -0,0 +1,78 @@
+// 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 SQL_SANDBOXED_VFS_FILE_IMPL_H_
+#define SQL_SANDBOXED_VFS_FILE_IMPL_H_
+
+#include "base/component_export.h"
+#include "base/files/file.h"
+#include "base/files/file_path.h"
+#include "sql/sandboxed_vfs.h"
+#include "sql/sandboxed_vfs_file.h"
+
+namespace sql {
+
+// SQLite VFS file implementation that works in a sandboxed process.
+//
+// An instance is created when SQLite calls into SandboxedVfs::Open(). The
+// instance is deleted by a call to SandboxedVfsFileImpl::Close().
+//
+// The SQLite VFS API includes a complex locking strategy documented in
+// https://www.sqlite.org/lockingv3.html
+//
+// This implementation uses a simplified locking strategy, where we grab an
+// exclusive lock when entering any of the modes that prepare for a transition
+// to EXCLUSIVE. (These modes are RESERVED and PENDING). This approach is easy
+// to implement on top of base::File's locking primitives, at the cost of some
+// false contention, which makes us slower under high concurrency.
+//
+// SQLite's built-in VFSes use the OS support for locking a range of bytes in
+// the file, rather locking than the whole file.
+class COMPONENT_EXPORT(SQL) SandboxedVfsFileImpl : public SandboxedVfsFile {
+ public:
+  SandboxedVfsFileImpl(base::File file,
+                       base::FilePath file_path,
+                       sql::SandboxedVfsFileType file_type,
+                       SandboxedVfs* vfs);
+  ~SandboxedVfsFileImpl() override;
+
+  // sqlite3_file implementation.
+  int Close() override;
+  int Read(void* buffer, int size, sqlite3_int64 offset) override;
+  int Write(const void* buffer, int size, sqlite3_int64 offset) override;
+  int Truncate(sqlite3_int64 size) override;
+  int Sync(int flags) override;
+  int FileSize(sqlite3_int64* result_size) override;
+  int Lock(int mode) override;
+  int Unlock(int mode) override;
+  int CheckReservedLock(int* has_reserved_lock) override;
+  int FileControl(int opcode, void* data) override;
+  int SectorSize() override;
+  int DeviceCharacteristics() override;
+  int ShmMap(int page_index,
+             int page_size,
+             int extend_file_if_needed,
+             void volatile** result) override;
+  int ShmLock(int offset, int size, int flags) override;
+  void ShmBarrier() override;
+  int ShmUnmap(int also_delete_file) override;
+  int Fetch(sqlite3_int64 offset, int size, void** result) override;
+  int Unfetch(sqlite3_int64 offset, void* fetch_result) override;
+
+ private:
+  // Constructed from a file handle passed from the browser process.
+  base::File file_;
+  // One of the SQLite locking mode constants.
+  int sqlite_lock_mode_;
+  // The SandboxedVfs that created this instance.
+  const raw_ptr<SandboxedVfs> vfs_;
+  // Tracked to check assumptions about SQLite's locking protocol.
+  const SandboxedVfsFileType file_type_;
+  // Used to identify the file in IPCs to the browser process.
+  const base::FilePath file_path_;
+};
+
+}  // namespace sql
+
+#endif  // SQL_SANDBOXED_VFS_FILE_IMPL_H_
diff --git a/storage/browser/blob/blob_registry_impl.cc b/storage/browser/blob/blob_registry_impl.cc
index b23ed779..01267fc 100644
--- a/storage/browser/blob/blob_registry_impl.cc
+++ b/storage/browser/blob/blob_registry_impl.cc
@@ -11,7 +11,6 @@
 #include "base/functional/callback.h"
 #include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "storage/browser/blob/blob_builder_from_stream.h"
 #include "storage/browser/blob/blob_data_builder.h"
@@ -386,8 +385,7 @@
                            f->expected_modification_time.value_or(base::Time()),
                            base::NullCallback());
     } else if (element->is_blob()) {
-      CHECK(blob_uuid_it != referenced_blob_uuids_.end(),
-            base::NotFatalUntil::M130);
+      CHECK(blob_uuid_it != referenced_blob_uuids_.end());
       const std::string& blob_uuid = *blob_uuid_it++;
       builder_->AppendBlob(blob_uuid, element->get_blob()->offset,
                            element->get_blob()->length, context()->registry());
diff --git a/storage/browser/file_system/isolated_context.cc b/storage/browser/file_system/isolated_context.cc
index bace18e..4689bbfc 100644
--- a/storage/browser/file_system/isolated_context.cc
+++ b/storage/browser/file_system/isolated_context.cc
@@ -11,7 +11,6 @@
 
 #include "base/check_op.h"
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
@@ -507,7 +506,7 @@
   Instance* instance = found->second.get();
   if (instance->IsSinglePathInstance()) {
     auto ids_iter = path_to_id_map_.find(instance->file_info().path);
-    CHECK(ids_iter != path_to_id_map_.end(), base::NotFatalUntil::M130);
+    CHECK(ids_iter != path_to_id_map_.end());
     ids_iter->second.erase(filesystem_id);
     if (ids_iter->second.empty())
       path_to_id_map_.erase(ids_iter);
diff --git a/storage/browser/file_system/sandbox_origin_database.cc b/storage/browser/file_system/sandbox_origin_database.cc
index 238055ce..c31c19d 100644
--- a/storage/browser/file_system/sandbox_origin_database.cc
+++ b/storage/browser/file_system/sandbox_origin_database.cc
@@ -17,7 +17,6 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -131,7 +130,7 @@
 }
 
 bool SandboxOriginDatabase::RepairDatabase(const std::string& db_path) {
-  CHECK(!db_.get(), base::NotFatalUntil::M130);
+  CHECK(!db_.get());
   leveldb_env::Options options;
   options.reuse_logs = false;
   options.max_open_files = 0;  // Use minimum.
diff --git a/storage/browser/test/mock_quota_client.cc b/storage/browser/test/mock_quota_client.cc
index 4a0a1b8..d6e9548a 100644
--- a/storage/browser/test/mock_quota_client.cc
+++ b/storage/browser/test/mock_quota_client.cc
@@ -13,7 +13,6 @@
 #include "base/functional/bind.h"
 #include "base/location.h"
 #include "base/memory/singleton.h"
-#include "base/not_fatal_until.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "components/services/storage/public/cpp/buckets/bucket_locator.h"
@@ -46,7 +45,7 @@
 void MockQuotaClient::ModifyBucketAndNotify(const BucketLocator& bucket,
                                             int64_t delta) {
   auto it = bucket_data_.find(bucket);
-  CHECK(it != bucket_data_.end(), base::NotFatalUntil::M130);
+  CHECK(it != bucket_data_.end());
   it->second += delta;
   DCHECK_GE(it->second, 0);
   quota_manager_proxy_->NotifyBucketModified(
diff --git a/testing/buildbot/chromeos.preuprev.json b/testing/buildbot/chromeos.preuprev.json
index 5fd39197..415f9f0 100644
--- a/testing/buildbot/chromeos.preuprev.json
+++ b/testing/buildbot/chromeos.preuprev.json
@@ -109,7 +109,7 @@
         "cros_board": "jacuzzi",
         "name": "chrome_all_tast_tests RELEASE_LKGM",
         "shard_level_retries_on_ctp": 1,
-        "shards": 50,
+        "shards": 45,
         "tast_expr": "STUB_STRING_TO_RUN_TAST_TESTS",
         "test": "chrome_all_tast_tests",
         "test_id_prefix": "ninja://chromeos:chrome_all_tast_tests/",
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index 2b7f394..ce3381cd 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -771,9 +771,9 @@
       'shards': 30,
     },
   },
-  'skylab-shards-50': {
+  'skylab-shards-45': {
     'skylab': {
-      'shards': 50,
+      'shards': 45,
     },
   },
   'swarming_containment_auto': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 9310c544..093e6b54 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3023,7 +3023,10 @@
             ],
             "experiments": [
                 {
-                    "name": "Enabled_20250327",
+                    "name": "PrioritizeUnlessShouldClearAllAndNoEviction_20250520",
+                    "params": {
+                        "level": "prioritize-unless-should-clear-all-and-no-eviction"
+                    },
                     "enable_features": [
                         "BackForwardCachePrioritizedEntry"
                     ]
diff --git a/third_party/androidx/build.gradle b/third_party/androidx/build.gradle
index fda320f..176c855 100644
--- a/third_party/androidx/build.gradle
+++ b/third_party/androidx/build.gradle
@@ -305,7 +305,7 @@
     google()
     maven {
         // This URL is generated by the fetch_all_androidx.py script.
-        url 'https://androidx.dev/snapshots/builds/13550841/artifacts/repository'
+        url 'https://androidx.dev/snapshots/builds/13551662/artifacts/repository'
     }
     mavenCentral()
 }
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
index c7bb01b..a05c26d 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -4898,7 +4898,7 @@
   kClipboardChangeEventTypesAttribute = 5589,
   kSchedulerYieldNonTrivialInherit = 5590,
   kSchedulerYieldNonTrivialInheritCrossFrameIgnored = 5591,
-  kLocalNetworkAccessPrivateAliasUse = 5592,
+  kV8URLPattern_Generate_Method = 5593,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots. Also don't add extra
diff --git a/third_party/blink/renderer/controller/highest_pmf_reporter_test.cc b/third_party/blink/renderer/controller/highest_pmf_reporter_test.cc
index 3a97afa..19e8ea9 100644
--- a/third_party/blink/renderer/controller/highest_pmf_reporter_test.cc
+++ b/third_party/blink/renderer/controller/highest_pmf_reporter_test.cc
@@ -12,7 +12,6 @@
 #include <memory>
 
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/test/test_mock_time_task_runner.h"
 #include "base/time/time.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -118,7 +117,7 @@
 
     std::vector<Persistent<Page>>::iterator it = dummy_pages_.begin();
     while (Page::OrdinaryPages().size() < page_count) {
-      CHECK(it != dummy_pages_.end(), base::NotFatalUntil::M130);
+      CHECK(it != dummy_pages_.end());
       Page::OrdinaryPages().insert(it->Get());
       it++;
     }
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.cc b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
index 8f9e76f4..564a3e6 100644
--- a/third_party/blink/renderer/core/css/resolver/style_cascade.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
@@ -7,7 +7,6 @@
 #include <bit>
 #include <optional>
 
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "third_party/blink/renderer/core/animation/css/css_animations.h"
 #include "third_party/blink/renderer/core/animation/css_interpolation_environment.h"
@@ -924,7 +923,7 @@
   const ActiveInterpolationsMap& map = *interpolations_.GetEntries()[index].map;
   PropertyHandle handle = ToPropertyHandle(property, *priority);
   const auto& entry = map.find(handle);
-  CHECK_NE(entry, map.end(), base::NotFatalUntil::M130);
+  CHECK_NE(entry, map.end());
   ApplyInterpolation(property, *priority, *entry->value, resolver);
 }
 
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 90836cce3..763adf1 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -40,7 +40,6 @@
 #include "base/debug/dump_without_crashing.h"
 #include "base/i18n/time_formatting.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
@@ -8949,7 +8948,7 @@
   // afterwards, when the Document is no longer active. If `is_for_discard_` do
   // not instantiate a resource coordinator.
   if (!resource_coordinator_ && IsActive() && !is_for_discard_) {
-    CHECK(GetFrame(), base::NotFatalUntil::M135);
+    CHECK(GetFrame());
     if (auto* frame = GetFrame()) {
       resource_coordinator_ = DocumentResourceCoordinator::MaybeCreate(
           frame->GetBrowserInterfaceBroker());
diff --git a/third_party/blink/renderer/core/dom/live_node_list_registry.cc b/third_party/blink/renderer/core/dom/live_node_list_registry.cc
index 21ff3534a..7e947030 100644
--- a/third_party/blink/renderer/core/dom/live_node_list_registry.cc
+++ b/third_party/blink/renderer/core/dom/live_node_list_registry.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/live_node_list_base.h"
 
@@ -28,7 +27,7 @@
                                   NodeListInvalidationType type) {
   Entry entry = {list, MaskForInvalidationType(type)};
   auto it = std::ranges::find(data_, entry);
-  CHECK(it != data_.end(), base::NotFatalUntil::M130);
+  CHECK(it != data_.end());
   data_.erase(it);
   data_.ShrinkToReasonableCapacity();
   RecomputeMask();
diff --git a/third_party/blink/renderer/core/fetch/request.cc b/third_party/blink/renderer/core/fetch/request.cc
index 90b83db..64d5930 100644
--- a/third_party/blink/renderer/core/fetch/request.cc
+++ b/third_party/blink/renderer/core/fetch/request.cc
@@ -588,19 +588,9 @@
   // - "Let |targetAddressSpace| be |init|'s targetAddressSpace member if it is
   // present, and |unknown| otherwise."
   if (init->hasTargetAddressSpace()) {
-    // 'private' is kept as an alias to 'local'; the previous PNA spec had
-    // 'private' for what LNA considers to be 'local'.
-    //
-    // TODO(crbug.com/418737577): Public names don't match
-    // network::mojom::IPAddressSpace enum yet. Finish rename by changing the
-    // enum.
-    if (init->targetAddressSpace() == "loopback") {
+    if (init->targetAddressSpace() == "local") {
       request->SetTargetAddressSpace(network::mojom::IPAddressSpace::kLocal);
-    } else if (init->targetAddressSpace() == "local") {
-      request->SetTargetAddressSpace(network::mojom::IPAddressSpace::kPrivate);
     } else if (init->targetAddressSpace() == "private") {
-      UseCounter::Count(execution_context,
-                        WebFeature::kLocalNetworkAccessPrivateAliasUse);
       request->SetTargetAddressSpace(network::mojom::IPAddressSpace::kPrivate);
     } else if (init->targetAddressSpace() == "public") {
       request->SetTargetAddressSpace(network::mojom::IPAddressSpace::kPublic);
@@ -1191,9 +1181,9 @@
 V8IPAddressSpace Request::targetAddressSpace() const {
   switch (request_->TargetAddressSpace()) {
     case network::mojom::IPAddressSpace::kLocal:
-      return V8IPAddressSpace(V8IPAddressSpace::Enum::kLoopback);
-    case network::mojom::IPAddressSpace::kPrivate:
       return V8IPAddressSpace(V8IPAddressSpace::Enum::kLocal);
+    case network::mojom::IPAddressSpace::kPrivate:
+      return V8IPAddressSpace(V8IPAddressSpace::Enum::kPrivate);
     case network::mojom::IPAddressSpace::kPublic:
       return V8IPAddressSpace(V8IPAddressSpace::Enum::kPublic);
     case network::mojom::IPAddressSpace::kUnknown:
diff --git a/third_party/blink/renderer/core/fetch/request.idl b/third_party/blink/renderer/core/fetch/request.idl
index cbf6c54..c1dcdc968 100644
--- a/third_party/blink/renderer/core/fetch/request.idl
+++ b/third_party/blink/renderer/core/fetch/request.idl
@@ -36,7 +36,7 @@
                     "only-if-cached" };
 enum FetchPriority {"low", "auto", "high"};
 enum RequestDuplex {"half"};
-enum IPAddressSpace {"loopback", "local", "private", "public", "unknown"};
+enum IPAddressSpace {"local", "private", "public", "unknown"};
 
 // https://w3c.github.io/webappsec-referrer-policy/#referrer-policies
 
diff --git a/third_party/blink/renderer/core/highlight/highlight.cc b/third_party/blink/renderer/core/highlight/highlight.cc
index f2b7767682..783e154 100644
--- a/third_party/blink/renderer/core/highlight/highlight.cc
+++ b/third_party/blink/renderer/core/highlight/highlight.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/core/highlight/highlight.h"
 
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -106,8 +105,7 @@
 
 void Highlight::DeregisterFrom(HighlightRegistry* highlight_registry) {
   auto map_iterator = containing_highlight_registries_.find(highlight_registry);
-  CHECK_NE(map_iterator, containing_highlight_registries_.end(),
-           base::NotFatalUntil::M130);
+  CHECK_NE(map_iterator, containing_highlight_registries_.end());
   DCHECK_GT(map_iterator->value, 0u);
   if (--map_iterator->value == 0)
     containing_highlight_registries_.erase(map_iterator);
diff --git a/third_party/blink/renderer/core/html/anchor_element_metrics_sender.cc b/third_party/blink/renderer/core/html/anchor_element_metrics_sender.cc
index 35f8098d..bda2d65 100644
--- a/third_party/blink/renderer/core/html/anchor_element_metrics_sender.cc
+++ b/third_party/blink/renderer/core/html/anchor_element_metrics_sender.cc
@@ -6,7 +6,6 @@
 
 #include "base/functional/bind.h"
 #include "base/location.h"
-#include "base/not_fatal_until.h"
 #include "base/rand_util.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/input/web_pointer_properties.h"
@@ -379,7 +378,7 @@
     const HTMLAnchorElementBase& element) {
   const auto anchor_id = AnchorElementId(element);
   auto it = anchor_elements_timing_stats_.find(anchor_id);
-  CHECK(it != anchor_elements_timing_stats_.end(), base::NotFatalUntil::M130);
+  CHECK(it != anchor_elements_timing_stats_.end());
   AnchorElementTimingStats& timing_stats = it->value;
   timing_stats.entered_viewport_should_be_enqueued_ = true;
   std::optional<base::TimeTicks>& entered_viewport =
@@ -400,7 +399,7 @@
     const HTMLAnchorElementBase& element) {
   const auto anchor_id = AnchorElementId(element);
   auto it = anchor_elements_timing_stats_.find(anchor_id);
-  CHECK(it != anchor_elements_timing_stats_.end(), base::NotFatalUntil::M130);
+  CHECK(it != anchor_elements_timing_stats_.end());
   AnchorElementTimingStats& timing_stats = it->value;
   timing_stats.viewport_entry_time_ = clock_->NowTicks();
   if (!timing_stats.entered_viewport_should_be_enqueued_) {
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.cc b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.cc
index 91068922..85f72f24 100644
--- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.cc
+++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.cc
@@ -33,6 +33,7 @@
 #include "third_party/blink/renderer/core/html/canvas/canvas_context_creation_attributes_core.h"
 #include "third_party/blink/renderer/core/html/canvas/canvas_image_source.h"
 #include "third_party/blink/renderer/core/workers/worker_global_scope.h"
+#include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 
 namespace blink {
@@ -99,6 +100,20 @@
   Thread::Current()->AddTaskObserver(this);
 }
 
+scoped_refptr<StaticBitmapImage>
+CanvasRenderingContext::PaintRenderingResultsToSnapshot(
+    SourceDrawingBuffer source_buffer,
+    FlushReason reason,
+    bool* had_resource_provider /*=nullptr*/) {
+  CanvasResourceProvider* provider =
+      PaintRenderingResultsToCanvas(source_buffer);
+  if (had_resource_provider) {
+    *had_resource_provider = !!provider;
+  }
+
+  return provider ? provider->Snapshot(reason) : nullptr;
+}
+
 void CanvasRenderingContext::DidProcessTask(
     const base::PendingTask& /* pending_task */) {
   RenderTaskEnded();
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
index 64df2b7..4d76efd38 100644
--- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
+++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
@@ -207,15 +207,16 @@
   }
   void DidDraw(const SkIRect& dirty_rect, CanvasPerformanceMonitor::DrawType);
 
-  // Returns a CanvasResourceProvider containing the current content, or nullptr
-  // if it was not possible to obtain that content. Default implementation
-  // returns the host's CanvasResourceProvider, which is suitable for contexts
-  // that write directly to that resource provider. Other contexts will need to
-  // override this method as suitable.
-  virtual CanvasResourceProvider* PaintRenderingResultsToCanvas(
-      SourceDrawingBuffer) {
-    return Host()->ResourceProvider();
-  }
+  // Returns a StaticBitmapImage containing the current content, or nullptr if
+  // it was not possible to obtain that content. For historical reasons, some
+  // clients need to know whether in the case of failure the
+  // CanvasResourceProvider being used internally was present; such clients can
+  // pass in `had_canvas_resource_provider`.
+  // TODO(crbug.com/352263194): Remove `had_canvas_resource_provider`.
+  scoped_refptr<StaticBitmapImage> PaintRenderingResultsToSnapshot(
+      SourceDrawingBuffer source_buffer,
+      FlushReason reason,
+      bool* had_canvas_resource_provider = nullptr);
 
   // Copy the contents of the rendering context to a media::VideoFrame created
   // using `frame_pool`, with color space specified by `dst_color_space`. If
@@ -341,6 +342,16 @@
 
   virtual void Dispose();
 
+  // Returns a CanvasResourceProvider containing the current content, or nullptr
+  // if it was not possible to obtain that content. Default implementation
+  // returns the host's CanvasResourceProvider, which is suitable for contexts
+  // that write directly to that resource provider. Other contexts will need to
+  // override this method as suitable.
+  virtual CanvasResourceProvider* PaintRenderingResultsToCanvas(
+      SourceDrawingBuffer) {
+    return Host()->ResourceProvider();
+  }
+
  private:
   Member<CanvasRenderingContextHost> host_;
   CanvasContextCreationAttributesCore creation_attributes_;
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.cc b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.cc
index 814e71c..4dec591 100644
--- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.cc
+++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.cc
@@ -140,12 +140,6 @@
     if (!provider) {
       did_fail_to_create_resource_provider_ = true;
     }
-    if (provider->IsValid()) {
-      base::UmaHistogramBoolean("Blink.Canvas.ResourceProviderIsAccelerated",
-                                provider->IsAccelerated());
-      base::UmaHistogramEnumeration("Blink.Canvas.ResourceProviderType",
-                                    provider->GetType());
-    }
   }
   return provider;
 }
@@ -160,6 +154,12 @@
   }
   auto* raw_provider = provider.get();
   ReplaceResourceProvider(std::move(provider));
+  if (raw_provider && raw_provider->IsValid()) {
+    base::UmaHistogramBoolean("Blink.Canvas.ResourceProviderIsAccelerated",
+                              ResourceProvider()->IsAccelerated());
+    base::UmaHistogramEnumeration("Blink.Canvas.ResourceProviderType",
+                                  ResourceProvider()->GetType());
+  }
   return raw_provider;
 }
 
@@ -247,6 +247,12 @@
 
   auto* raw_provider = provider.get();
   ReplaceResourceProvider(std::move(provider));
+  if (raw_provider && raw_provider->IsValid()) {
+    base::UmaHistogramBoolean("Blink.Canvas.ResourceProviderIsAccelerated",
+                              ResourceProvider()->IsAccelerated());
+    base::UmaHistogramEnumeration("Blink.Canvas.ResourceProviderType",
+                                  ResourceProvider()->GetType());
+  }
   return raw_provider;
 }
 
@@ -350,6 +356,12 @@
   ReplaceResourceProvider(std::move(provider));
 
   if (raw_provider) {
+    if (raw_provider->IsValid()) {
+      base::UmaHistogramBoolean("Blink.Canvas.ResourceProviderIsAccelerated",
+                                ResourceProvider()->IsAccelerated());
+      base::UmaHistogramEnumeration("Blink.Canvas.ResourceProviderType",
+                                    ResourceProvider()->GetType());
+    }
     raw_provider->SetResourceRecyclingEnabled(true);
   }
   return raw_provider;
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
index 64348957..5d6e008 100644
--- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
+++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -981,7 +981,7 @@
 
   // If the size of an existing buffer matches, we can reuse that buffer.
   // This optimization is only done for 2D canvases for now.
-  if (IsRenderingContext2D() && ResourceProvider() != nullptr &&
+  if (IsRenderingContext2D() && GetResourceProviderForCanvas2D() != nullptr &&
       old_size == new_size) {
     return;
   }
@@ -1186,71 +1186,78 @@
 
 void HTMLCanvasElement::PaintInternal(GraphicsContext& context,
                                       const PhysicalRect& r) {
-  CanvasResourceProvider* provider =
-      context_->PaintRenderingResultsToCanvas(kFrontBuffer);
+  // For 2D Canvas, there are two ways of render Canvas for printing:
+  // display list or image snapshot. Display list allows better PDF printing
+  // and we prefer this method.
+  // Here are the requirements for display list to be used:
+  //    1. We must have had a full repaint of the Canvas after beforeprint
+  //       event has been fired. Otherwise, we don't have a PaintRecord.
+  //    2. CSS property 'image-rendering' must not be 'pixelated'.
 
-  if (provider != nullptr) {
-    // For 2D Canvas, there are two ways of render Canvas for printing:
-    // display list or image snapshot. Display list allows better PDF printing
-    // and we prefer this method.
-    // Here are the requirements for display list to be used:
-    //    1. We must have had a full repaint of the Canvas after beforeprint
-    //       event has been fired. Otherwise, we don't have a PaintRecord.
-    //    2. CSS property 'image-rendering' must not be 'pixelated'.
+  // display list rendering: we replay the last full PaintRecord, if Canvas
+  // has been redraw since beforeprint happened.
 
-    // display list rendering: we replay the last full PaintRecord, if Canvas
-    // has been redraw since beforeprint happened.
-
-    // Note: Test coverage for this is assured by manual (non-automated)
-    // web test printing/manual/canvas2d-vector-text.html
-    // That test should be run manually against CLs that touch this code.
-    if (IsPrinting() && IsRenderingContext2D()) {
-      FlushRecording(FlushReason::kPrinting);
-      // `FlushRecording` might be a no-op if a flush already happened before.
-      // Fortunately, the last flush recording was kept by the provider.
-      const std::optional<cc::PaintRecord>& last_recording =
-          provider->LastRecording();
-      if (last_recording.has_value() &&
-          filter_quality_ != cc::PaintFlags::FilterQuality::kNone) {
-        context.Canvas()->save();
-        context.Canvas()->translate(r.X(), r.Y());
-        context.Canvas()->scale(r.Width() / Size().width(),
-                                r.Height() / Size().height());
-        context.Canvas()->drawPicture(*last_recording);
-        context.Canvas()->restore();
-        UMA_HISTOGRAM_BOOLEAN("Blink.Canvas.2DPrintingAsVector", true);
-        return;
-      }
-      UMA_HISTOGRAM_ENUMERATION("Blink.Canvas.VectorPrintFallbackReason",
-                                provider->printing_fallback_reason());
-      UMA_HISTOGRAM_BOOLEAN("Blink.Canvas.2DPrintingAsVector", false);
+  // Note: Test coverage for this is assured by manual (non-automated)
+  // web test printing/manual/canvas2d-vector-text.html
+  // That test should be run manually against CLs that touch this code.
+  if (IsPrinting() && IsRenderingContext2D() &&
+      GetResourceProviderForCanvas2D()) {
+    auto* provider = GetResourceProviderForCanvas2D();
+    FlushRecording(FlushReason::kPrinting);
+    // `FlushRecording` might be a no-op if a flush already happened before.
+    // Fortunately, the last flush recording was kept by the provider.
+    const std::optional<cc::PaintRecord>& last_recording =
+        provider->LastRecording();
+    if (last_recording.has_value() &&
+        filter_quality_ != cc::PaintFlags::FilterQuality::kNone) {
+      context.Canvas()->save();
+      context.Canvas()->translate(r.X(), r.Y());
+      context.Canvas()->scale(r.Width() / Size().width(),
+                              r.Height() / Size().height());
+      context.Canvas()->drawPicture(*last_recording);
+      context.Canvas()->restore();
+      UMA_HISTOGRAM_BOOLEAN("Blink.Canvas.2DPrintingAsVector", true);
+      return;
     }
-    // or image snapshot rendering: grab a snapshot and raster it.
+    UMA_HISTOGRAM_ENUMERATION("Blink.Canvas.VectorPrintFallbackReason",
+                              provider->printing_fallback_reason());
+    UMA_HISTOGRAM_BOOLEAN("Blink.Canvas.2DPrintingAsVector", false);
+  }
+
+  // Grab a snapshot.
+  scoped_refptr<StaticBitmapImage> snapshot;
+
+  // For canvas 2D, get the snapshot from the context if there is a valid
+  // resource provider to ensure that the recording is properly flushed (note
+  // that the fact that the canvas has a valid resource provider means that it
+  // is not possible for the canvas to be in hibernation at this point as the
+  // canvas' resource provider is dropped when going into hibernation and
+  // hibernation is ended if the canvas' resource provider is recreated). For
+  // all contexts other than canvas 2D, get a snapshot directly from the
+  // context.
+  bool had_resource_provider = false;
+  if (IsRenderingContext2D()) {
+    if (ResourceProvider()) {
+      snapshot = context_->GetImage(FlushReason::kPaint);
+      had_resource_provider = true;
+    }
+  } else {
+    snapshot = context_->PaintRenderingResultsToSnapshot(
+        kFrontBuffer, FlushReason::kPaint, &had_resource_provider);
+  }
+
+  // To preserve historical behavior, the below code is conditioned on whether
+  // the CanvasResourceProvider was present rather than whether the snapshot
+  // is non-null.
+  // TODO(crbug.com/352263194): Check `snapshot` in the top-level `if` and
+  // eliminate `had_resource_provider` altogether.
+  if (had_resource_provider) {
     SkBlendMode composite_operator =
         !context_ || context_->CreationAttributes().alpha
             ? SkBlendMode::kSrcOver
             : SkBlendMode::kSrc;
     gfx::RectF src_rect((gfx::SizeF(Size())));
 
-    // For canvas 2D, get the snapshot from the context to ensure that the
-    // recording is properly flushed (note that the fact that the canvas has
-    // a valid resource provider means that it is not possible for the
-    // canvas to be in hibernation at this point as the canvas' resource
-    // provider is dropped when going into hibernation and hibernation is ended
-    // if the canvas' resource provider is recreated).
-    // For all contexts other than canvas 2D, get a snapshot directly from
-    // the CanvasResourceProvider as the above
-    // `PaintRenderingResultsToCanvas()` call has ensured that the CRP has the
-    // current canvas contents.
-    // TODO(crbug.com/40260472): Move this flow to get the snapshot from the
-    // context for all context types as part of moving CanvasResourceProvider
-    // ownership to the context and decoupling non-2D canvas context types from
-    // needing to shoehorn contents into CanvasResourceProvider instances. Each
-    // context type will then flush any content in whatever way it needs to
-    // internally before snapshotting.
-    scoped_refptr<StaticBitmapImage> snapshot =
-        IsRenderingContext2D() ? context_->GetImage(FlushReason::kPaint)
-                               : provider->Snapshot(FlushReason::kPaint);
     if (snapshot) {
       // GraphicsContext cannot handle gpu resource serialization.
       snapshot = snapshot->MakeUnaccelerated();
@@ -1270,8 +1277,9 @@
     }
   }
 
-  if (IsWebGL() && PaintsIntoCanvasBuffer())
+  if (IsWebGL() && PaintsIntoCanvasBuffer()) {
     context_->MarkLayerComposited();
+  }
 }
 
 bool HTMLCanvasElement::IsPrinting() const {
@@ -1312,11 +1320,8 @@
     image_bitmap = OffscreenCanvasFrame()->Bitmap();
   } else if (IsWebGL()) {
     if (context_->CreationAttributes().premultiplied_alpha) {
-      CanvasResourceProvider* provider =
-          context_->PaintRenderingResultsToCanvas(source_buffer);
-      if (provider) {
-        image_bitmap = provider->Snapshot(reason);
-      }
+      image_bitmap =
+          context_->PaintRenderingResultsToSnapshot(source_buffer, reason);
     } else {
       image_bitmap =
           context_->GetRGBAUnacceleratedStaticBitmapImage(source_buffer);
@@ -1974,13 +1979,10 @@
     if (IsWebGL() || IsWebGPU()) {
       // TODO(https://crbug.com/672299): Canvas should produce sRGB images.
       // Because WebGL/WebGPU sources always require copying the back buffer,
-      // we use PaintRenderingResultsToCanvas instead of GetImage in order to
+      // we use PaintRenderingResultsToSnapshot instead of GetImage in order to
       // keep a cached copy of the backing in the canvas's resource provider.
-      CanvasResourceProvider* provider =
-          RenderingContext()->PaintRenderingResultsToCanvas(kBackBuffer);
-      if (provider) {
-        image = provider->Snapshot(reason);
-      }
+      image = RenderingContext()->PaintRenderingResultsToSnapshot(kBackBuffer,
+                                                                  reason);
     } else if (RenderingContext()) {
       // This is either CanvasRenderingContext2D or ImageBitmapRenderingContext.
       image = RenderingContext()->GetImage(reason);
@@ -2255,7 +2257,8 @@
       }
     }
 
-    CanvasResourceProvider* resource_provider = ResourceProvider();
+    CanvasResourceProvider* resource_provider =
+        GetResourceProviderForCanvas2D();
     if (context_->isContextLost() && !context_->IsContextBeingRestored()) {
       DCHECK(!resource_provider);
       return nullptr;
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h
index 69c39fb..35c55698 100644
--- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h
+++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h
@@ -363,6 +363,12 @@
     kNotWebExposed,
   };
 
+  // Can be called only when the context is 2D.
+  CanvasResourceProvider* GetResourceProviderForCanvas2D() {
+    CHECK(IsRenderingContext2D());
+    return ResourceProvider();
+  }
+
   void Dispose();
 
   // Updates the preferred 2D raster mode based on the state of the context and
diff --git a/third_party/blink/renderer/core/html/forms/radio_button_group_scope.cc b/third_party/blink/renderer/core/html/forms/radio_button_group_scope.cc
index fa00efa..6455673 100644
--- a/third_party/blink/renderer/core/html/forms/radio_button_group_scope.cc
+++ b/third_party/blink/renderer/core/html/forms/radio_button_group_scope.cc
@@ -20,7 +20,6 @@
 
 #include "third_party/blink/renderer/core/html/forms/radio_button_group_scope.h"
 
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
 #include "third_party/blink/renderer/core/html/forms/html_input_element.h"
 #include "third_party/blink/renderer/core/input_type_names.h"
@@ -134,7 +133,7 @@
 void RadioButtonGroup::RequiredAttributeChanged(HTMLInputElement* button) {
   DCHECK_EQ(button->FormControlType(), FormControlType::kInputRadio);
   auto it = members_.find(button);
-  CHECK_NE(it, members_.end(), base::NotFatalUntil::M130);
+  CHECK_NE(it, members_.end());
   bool was_valid = IsValid();
   // Synchronize the 'required' flag for the button, along with
   // updating the overall count.
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc
index b98d99ae..43a11b8 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -36,7 +36,6 @@
 #include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/to_string.h"
 #include "base/synchronization/lock.h"
 #include "base/time/time.h"
@@ -235,7 +234,7 @@
                                   Document* document) {
   DocumentElementSetMap& map = DocumentToElementSetMap();
   auto it = map.find(document);
-  CHECK(it != map.end(), base::NotFatalUntil::M130);
+  CHECK(it != map.end());
   WeakMediaElementSet* set = it->value;
   set->erase(element);
   if (set->empty())
diff --git a/third_party/blink/renderer/core/inspector/inspector_media_context_impl.cc b/third_party/blink/renderer/core/inspector/inspector_media_context_impl.cc
index 88ed825..58a25576 100644
--- a/third_party/blink/renderer/core/inspector/inspector_media_context_impl.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_media_context_impl.cc
@@ -7,7 +7,6 @@
 #include <unordered_set>
 #include <utility>
 
-#include "base/not_fatal_until.h"
 #include "base/unguessable_token.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
@@ -60,7 +59,7 @@
 const MediaPlayer& MediaInspectorContextImpl::MediaPlayerFromId(
     const WebString& player_id) {
   const auto& player = players_.find(player_id);
-  CHECK_NE(player, players_.end(), base::NotFatalUntil::M130);
+  CHECK_NE(player, players_.end());
   return *player->value;
 }
 
diff --git a/third_party/blink/renderer/core/layout/column_layout_algorithm.cc b/third_party/blink/renderer/core/layout/column_layout_algorithm.cc
index 40c6a62..fccf393 100644
--- a/third_party/blink/renderer/core/layout/column_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/column_layout_algorithm.cc
@@ -6,7 +6,6 @@
 
 #include <algorithm>
 
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/dom/column_pseudo_element.h"
 #include "third_party/blink/renderer/core/layout/block_layout_algorithm.h"
 #include "third_party/blink/renderer/core/layout/block_layout_algorithm_utils.h"
@@ -1643,7 +1642,7 @@
           [](const ContentRun& run1, const ContentRun& run2) {
             return run1.ColumnBlockSize() < run2.ColumnBlockSize();
           });
-      CHECK(it != runs_.end(), base::NotFatalUntil::M130);
+      CHECK(it != runs_.end());
       return const_cast<ContentRun*>(&*it);
     }
 
diff --git a/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.cc
index fcf819e..d5e50ad2 100644
--- a/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/flex/flex_layout_algorithm.cc
@@ -7,7 +7,6 @@
 #include <memory>
 #include <optional>
 
-#include "base/not_fatal_until.h"
 #include "base/types/optional_util.h"
 #include "third_party/blink/renderer/core/frame/web_feature.h"
 #include "third_party/blink/renderer/core/layout/baseline_utils.h"
@@ -3125,8 +3124,7 @@
             AdjustOffsetForNextLine(flex_lines, flex_line_idx, item_expansion);
           } else {
             auto it = row_cross_size_updates_.find(flex_line_idx + 1);
-            CHECK_NE(it, row_cross_size_updates_.end(),
-                     base::NotFatalUntil::M130);
+            CHECK_NE(it, row_cross_size_updates_.end());
             if (item_expansion > it->value) {
               AdjustOffsetForNextLine(flex_lines, flex_line_idx,
                                       item_expansion - it->value);
diff --git a/third_party/blink/renderer/core/layout/inline/fragment_items_builder.cc b/third_party/blink/renderer/core/layout/inline/fragment_items_builder.cc
index 1a98e700..3fa232c 100644
--- a/third_party/blink/renderer/core/layout/inline/fragment_items_builder.cc
+++ b/third_party/blink/renderer/core/layout/inline/fragment_items_builder.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/core/layout/inline/fragment_items_builder.h"
 
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/layout/box_fragment_builder.h"
 #include "third_party/blink/renderer/core/layout/geometry/writing_mode_converter.h"
 #include "third_party/blink/renderer/core/layout/inline/fragment_items.h"
@@ -402,7 +401,7 @@
         line_converter.SetOuterSize(line_box_bounds.size);
         while (--descendants_count) {
           ++i;
-          CHECK_NE(i, items_.size(), base::NotFatalUntil::M130);
+          CHECK_NE(i, items_.size());
           ItemWithOffset& descendant_item_with_offset = items_[i];
           item = &descendant_item_with_offset.item;
           item->SetOffset(
diff --git a/third_party/blink/renderer/core/layout/inline/inline_cursor.cc b/third_party/blink/renderer/core/layout/inline/inline_cursor.cc
index 6caf3ac..7832484 100644
--- a/third_party/blink/renderer/core/layout/inline/inline_cursor.cc
+++ b/third_party/blink/renderer/core/layout/inline/inline_cursor.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 
 #include "base/containers/adapters.h"
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/editing/frame_selection.h"
 #include "third_party/blink/renderer/core/editing/position_with_affinity.h"
 #include "third_party/blink/renderer/core/html/html_br_element.h"
@@ -421,7 +420,7 @@
           return item.StartOffset() <= offset.start &&
                  item.EndOffset() >= offset.end;
         });
-    CHECK(item_it != items->end(), base::NotFatalUntil::M130) << this;
+    CHECK(item_it != items->end()) << this;
     return (*item_it)->BidiLevel();
   }
 
@@ -433,7 +432,7 @@
         block_flow.GetInlineNodeData()->ItemsData(UsesFirstLineStyle()).items;
     const auto item = std::ranges::find(items, GetLayoutObject(),
                                         &InlineItem::GetLayoutObject);
-    CHECK(item != items.end(), base::NotFatalUntil::M130) << this;
+    CHECK(item != items.end()) << this;
     return (*item)->BidiLevel();
   }
 
diff --git a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc
index 5b70064..e02219e 100644
--- a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc
+++ b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc
@@ -25,7 +25,6 @@
 
 #include "third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.h"
 
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/css/resolver/style_resolver.h"
 #include "third_party/blink/renderer/core/layout/fragmentation_utils.h"
 #include "third_party/blink/renderer/core/layout/geometry/writing_mode_converter.h"
@@ -697,7 +696,7 @@
           column_set->NextSiblingMultiColumnSet()) {
     LayoutMultiColumnSetList::iterator it =
         multi_column_set_list_.find(next_set);
-    CHECK(it != multi_column_set_list_.end(), base::NotFatalUntil::M130);
+    CHECK(it != multi_column_set_list_.end());
     multi_column_set_list_.InsertBefore(it, column_set);
   } else {
     multi_column_set_list_.insert(column_set);
diff --git a/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc
index 7a4563f9..fdc6255d 100644
--- a/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc
+++ b/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc
@@ -9,7 +9,6 @@
 #include <algorithm>
 
 #include "base/memory/values_equivalent.h"
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
 #include "third_party/blink/renderer/core/css/css_property_value_set.h"
 #include "third_party/blink/renderer/core/css/out_of_flow_data.h"
@@ -821,7 +820,7 @@
   if (candidate.inline_container.container) {
     const auto it =
         containing_blocks_map_.find(candidate.inline_container.container);
-    CHECK(it != containing_blocks_map_.end(), base::NotFatalUntil::M130);
+    CHECK(it != containing_blocks_map_.end());
     return it->value;
   }
 
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_script_loader_registry.cc b/third_party/blink/renderer/core/loader/modulescript/module_script_loader_registry.cc
index cac5c381..eee91a44 100644
--- a/third_party/blink/renderer/core/loader/modulescript/module_script_loader_registry.cc
+++ b/third_party/blink/renderer/core/loader/modulescript/module_script_loader_registry.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/core/loader/modulescript/module_script_loader_registry.h"
 
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/loader/modulescript/module_script_loader.h"
 
 namespace blink {
@@ -24,7 +23,7 @@
   DCHECK(loader->HasFinished());
 
   auto it = active_loaders_.find(loader);
-  CHECK_NE(it, active_loaders_.end(), base::NotFatalUntil::M130);
+  CHECK_NE(it, active_loaders_.end());
   active_loaders_.erase(it);
 }
 
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_tree_linker_registry.cc b/third_party/blink/renderer/core/loader/modulescript/module_tree_linker_registry.cc
index f773f04..2c083310 100644
--- a/third_party/blink/renderer/core/loader/modulescript/module_tree_linker_registry.cc
+++ b/third_party/blink/renderer/core/loader/modulescript/module_tree_linker_registry.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/core/loader/modulescript/module_tree_linker_registry.h"
 
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/loader/modulescript/module_tree_linker.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h"
 
@@ -64,7 +63,7 @@
   DCHECK(linker->HasFinished());
 
   auto it = active_tree_linkers_.find(linker);
-  CHECK_NE(it, active_tree_linkers_.end(), base::NotFatalUntil::M130);
+  CHECK_NE(it, active_tree_linkers_.end());
   active_tree_linkers_.erase(it);
 }
 
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
index 32063842..6485d853 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
+++ b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
@@ -8,7 +8,6 @@
 
 #include "base/auto_reset.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/time/time.h"
 #include "third_party/blink/public/common/features.h"
@@ -180,7 +179,7 @@
                                                finished_observers_.end();
   } else {
     it = finished_observers_.find(observer);
-    CHECK(it != finished_observers_.end(), base::NotFatalUntil::M130);
+    CHECK(it != finished_observers_.end());
     fully_erased = finished_observers_.erase(it);
   }
   DidRemoveObserver();
diff --git a/third_party/blink/renderer/core/paint/highlight_painter.cc b/third_party/blink/renderer/core/paint/highlight_painter.cc
index 6abbbee..57e50de 100644
--- a/third_party/blink/renderer/core/paint/highlight_painter.cc
+++ b/third_party/blink/renderer/core/paint/highlight_painter.cc
@@ -5,7 +5,6 @@
 #include "third_party/blink/renderer/core/paint/highlight_painter.h"
 
 #include "base/auto_reset.h"
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/dom/node.h"
 #include "third_party/blink/renderer/core/editing/editor.h"
 #include "third_party/blink/renderer/core/editing/frame_selection.h"
@@ -1048,8 +1047,8 @@
                        [](const HighlightEdgeInfo& info, unsigned offset) {
                          return info.offset < offset;
                        });
-  CHECK_NE(from_info, edges_info_.end(), base::NotFatalUntil::M130);
-  CHECK_NE(to_info, edges_info_.end(), base::NotFatalUntil::M130);
+  CHECK_NE(from_info, edges_info_.end());
+  CHECK_NE(to_info, edges_info_.end());
 
   // This rect is used for 2 purposes: To set the offset and width for
   // text decoration painting, and the set the clip. The former uses the
diff --git a/third_party/blink/renderer/core/scheduler/scripted_idle_task_controller.cc b/third_party/blink/renderer/core/scheduler/scripted_idle_task_controller.cc
index c28a95ef..93f3fad 100644
--- a/third_party/blink/renderer/core/scheduler/scripted_idle_task_controller.cc
+++ b/third_party/blink/renderer/core/scheduler/scripted_idle_task_controller.cc
@@ -115,7 +115,7 @@
 }
 
 ScriptedIdleTaskController::~ScriptedIdleTaskController() {
-  CHECK(idle_tasks_.empty(), base::NotFatalUntil::M135);
+  CHECK(idle_tasks_.empty());
 }
 
 void ScriptedIdleTaskController::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc b/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc
index 11c51ae4..b4c7331 100644
--- a/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc
+++ b/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc
@@ -8,7 +8,6 @@
 
 #include "base/containers/contains.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/state_transitions.h"
 #include "third_party/blink/public/common/features.h"
@@ -330,8 +329,7 @@
 
 void DocumentSpeculationRules::RemoveRuleSet(SpeculationRuleSet* rule_set) {
   auto removed = std::ranges::remove(rule_sets_, rule_set);
-  CHECK(!removed.empty(), base::NotFatalUntil::M130)
-      << "rule set was removed without existing";
+  CHECK(!removed.empty()) << "rule set was removed without existing";
   rule_sets_.erase(removed.begin(), removed.end());
   if (rule_set->has_document_rule()) {
     InvalidateAllLinks();
@@ -955,7 +953,7 @@
     return;
   }
   auto it = pending_links_.find(link);
-  CHECK(it != pending_links_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_links_.end());
   pending_links_.erase(it);
 }
 
diff --git a/third_party/blink/renderer/core/speculation_rules/speculation_rule_set.cc b/third_party/blink/renderer/core/speculation_rules/speculation_rule_set.cc
index 187caa44..bbc63959 100644
--- a/third_party/blink/renderer/core/speculation_rules/speculation_rule_set.cc
+++ b/third_party/blink/renderer/core/speculation_rules/speculation_rule_set.cc
@@ -5,7 +5,6 @@
 #include "third_party/blink/renderer/core/speculation_rules/speculation_rule_set.h"
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "services/network/public/mojom/no_vary_search.mojom-shared.h"
 #include "services/network/public/mojom/referrer_policy.mojom-shared.h"
 #include "third_party/blink/public/mojom/speculation_rules/speculation_rules.mojom-shared.h"
@@ -592,7 +591,7 @@
 // static
 SpeculationRuleSet* SpeculationRuleSet::Parse(Source* source,
                                               ExecutionContext* context) {
-  CHECK(context, base::NotFatalUntil::M131);
+  CHECK(context);
   // https://wicg.github.io/nav-speculation/speculation-rules.html#parse-speculation-rules
 
   const String& source_text = source->GetSourceText();
diff --git a/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.cc b/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.cc
index 7622f34d..2dbafca 100644
--- a/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.cc
+++ b/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.cc
@@ -28,7 +28,6 @@
 #include <algorithm>
 
 #include "base/compiler_specific.h"
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/svg/animation/smil_animation_value.h"
 #include "third_party/blink/renderer/core/svg/svg_animation_element.h"
 
@@ -56,7 +55,7 @@
 
 void SMILAnimationSandwich::Remove(SVGAnimationElement* animation) {
   auto position = std::ranges::find(sandwich_, animation);
-  CHECK(sandwich_.end() != position, base::NotFatalUntil::M130);
+  CHECK(sandwich_.end() != position);
   sandwich_.erase(position);
   // Clear the animated value when there are active animation elements but the
   // sandwich is empty.
diff --git a/third_party/blink/renderer/core/timing/event_counts.cc b/third_party/blink/renderer/core/timing/event_counts.cc
index b9b1fb9..bf98d764ec 100644
--- a/third_party/blink/renderer/core/timing/event_counts.cc
+++ b/third_party/blink/renderer/core/timing/event_counts.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/core/timing/event_counts.h"
 
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/event_type_names.h"
 #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
 #include "third_party/blink/renderer/platform/wtf/text/atomic_string_hash.h"
@@ -43,7 +42,7 @@
 
 void EventCounts::Add(const AtomicString& event_type) {
   auto iterator = event_count_map_.find(event_type);
-  CHECK_NE(iterator, event_count_map_.end(), base::NotFatalUntil::M130);
+  CHECK_NE(iterator, event_count_map_.end());
   iterator->value++;
 }
 
diff --git a/third_party/blink/renderer/core/url_pattern/url_pattern.cc b/third_party/blink/renderer/core/url_pattern/url_pattern.cc
index 22c3e12c..d06469c 100644
--- a/third_party/blink/renderer/core/url_pattern/url_pattern.cc
+++ b/third_party/blink/renderer/core/url_pattern/url_pattern.cc
@@ -6,6 +6,7 @@
 
 #include <algorithm>
 
+#include "base/notreached.h"
 #include "base/strings/string_util.h"
 #include "base/types/expected.h"
 #include "third_party/abseil-cpp/absl/status/status.h"
@@ -605,6 +606,23 @@
   return exec(script_state, input, /*base_url=*/String(), exception_state);
 }
 
+String URLPattern::generate(const V8URLPatternComponent& component,
+                            const VectorOfPairs<String, String>& groups,
+                            ExceptionState& exception_state) const {
+  for (auto&& [value, name] : ComponentsWithNames()) {
+    if (component == name) {
+      std::optional<String> result =
+          value->Generate(groups, ShouldTreatAsStandardURL(), exception_state);
+      if (!result) {
+        return g_empty_string;
+      } else {
+        return *result;
+      }
+    }
+  }
+  NOTREACHED();
+}
+
 String URLPattern::protocol() const {
   return protocol_->GeneratePatternString();
 }
@@ -677,14 +695,8 @@
 
 std::optional<SafeUrlPattern> URLPattern::ToSafeUrlPattern(
     ExceptionState& exception_state) const {
-  const std::pair<const url_pattern::Component*, const char*>
-      components_with_names[] = {
-          {protocol_, "protocol"}, {username_, "username"},
-          {password_, "password"}, {hostname_, "hostname"},
-          {port_, "port"},         {pathname_, "pathname"},
-          {search_, "search"},     {hash_, "hash"}};
   String components_with_regexp;
-  for (auto [component, name] : components_with_names) {
+  for (auto&& [component, name] : ComponentsWithNames()) {
     if (component->HasRegExpGroups()) {
       components_with_regexp = components_with_regexp +
                                (components_with_regexp.IsNull() ? "" : ", ") +
diff --git a/third_party/blink/renderer/core/url_pattern/url_pattern.h b/third_party/blink/renderer/core/url_pattern/url_pattern.h
index c2be7a1..e4221074 100644
--- a/third_party/blink/renderer/core/url_pattern/url_pattern.h
+++ b/third_party/blink/renderer/core/url_pattern/url_pattern.h
@@ -4,7 +4,11 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_URL_PATTERN_URL_PATTERN_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_URL_PATTERN_URL_PATTERN_H_
 
+#include <array>
+#include <utility>
+
 #include "base/types/pass_key.h"
+#include "third_party/blink/renderer/bindings/core/v8/idl_types.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_url_pattern_component.h"
 #include "third_party/blink/renderer/core/core_export.h"
@@ -91,6 +95,10 @@
                          const V8URLPatternInput* input,
                          ExceptionState& exception_state) const;
 
+  String generate(const V8URLPatternComponent& component,
+                  const VectorOfPairs<String, String>& groups,
+                  ExceptionState& exception_state) const;
+
   String protocol() const;
   String username() const;
   String password() const;
@@ -126,6 +134,23 @@
              URLPatternResult* result,
              ExceptionState& exception_state) const;
 
+  std::array<std::pair<const Member<Component>&, const char*>, 8>
+  ComponentsWithNames() const {
+    return {{{protocol_, "protocol"},
+             {username_, "username"},
+             {password_, "password"},
+             {hostname_, "hostname"},
+             {port_, "port"},
+             {pathname_, "pathname"},
+             {search_, "search"},
+             {hash_, "hash"}}};
+  }
+
+  bool ShouldTreatAsStandardURL() const {
+    CHECK(protocol_);
+    return protocol_->ShouldTreatAsStandardURL();
+  }
+
   // The compiled patterns for each URL component.
   Member<Component> protocol_;
   Member<Component> username_;
diff --git a/third_party/blink/renderer/core/url_pattern/url_pattern.idl b/third_party/blink/renderer/core/url_pattern/url_pattern.idl
index 437195f..a6dd54c 100644
--- a/third_party/blink/renderer/core/url_pattern/url_pattern.idl
+++ b/third_party/blink/renderer/core/url_pattern/url_pattern.idl
@@ -24,6 +24,9 @@
   [RaisesException, CallWith=ScriptState, Measure]
   URLPatternResult? exec(optional URLPatternInput input = {}, optional USVString baseURL);
 
+  [RuntimeEnabled=URLPatternGenerate, RaisesException, Measure]
+  USVString generate(URLPatternComponent component, record<USVString, USVString> groups);
+
   readonly attribute USVString protocol;
   readonly attribute USVString username;
   readonly attribute USVString password;
diff --git a/third_party/blink/renderer/core/url_pattern/url_pattern_component.cc b/third_party/blink/renderer/core/url_pattern/url_pattern_component.cc
index 9263273..3b2923a 100644
--- a/third_party/blink/renderer/core/url_pattern/url_pattern_component.cc
+++ b/third_party/blink/renderer/core/url_pattern/url_pattern_component.cc
@@ -5,18 +5,29 @@
 #include "third_party/blink/renderer/core/url_pattern/url_pattern_component.h"
 
 #include <algorithm>
+#include <optional>
+#include <string>
 #include <string_view>
+#include <tuple>
+#include <unordered_map>
+#include <utility>
+#include <vector>
 
 #include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_util.h"
+#include "base/types/expected.h"
 #include "components/url_pattern/url_pattern_util.h"
+#include "third_party/abseil-cpp/absl/status/status.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_url_pattern_options.h"
 #include "third_party/blink/renderer/core/url_pattern/url_pattern_canon.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_utf8_adaptor.h"
+#include "third_party/liburlpattern/part.h"
+#include "third_party/liburlpattern/pattern.h"
+#include "third_party/liburlpattern/utils.h"
 #include "url/url_util.h"
 
 namespace blink {
@@ -382,6 +393,34 @@
   return *should_treat_as_standard_url_;
 }
 
+std::optional<String> Component::Generate(
+    const WTF::Vector<std::pair<String, String>>& groups,
+    bool should_treat_as_standard_url,
+    ExceptionState& exception_state) const {
+  std::string pattern_string = pattern_.GeneratePatternString();
+  auto callback =
+      GetEncodeCallback(pattern_string, type_, should_treat_as_standard_url);
+
+  std::unordered_map<std::string, std::string> groups_map;
+  for (auto&& [key, value] : groups) {
+    StringUTF8Adaptor utf8_key(key);
+    StringUTF8Adaptor utf8_value(value);
+
+    auto [it, inserted] = groups_map.insert(
+        std::make_pair(utf8_key.AsStringView(), utf8_value.AsStringView()));
+    // Not `inserted` means key names are duplicated, which should not happen.
+    CHECK(inserted);
+  }
+
+  base::expected<std::string, absl::Status> result =
+      pattern_.Generate(groups_map, callback);
+  if (!result.has_value()) {
+    exception_state.ThrowTypeError(String::FromUTF8(result.error().message()));
+    return std::nullopt;
+  }
+  return String::FromUTF8(result.value());
+}
+
 const std::vector<liburlpattern::Part>& Component::PartList() const {
   return pattern_.PartList();
 }
diff --git a/third_party/blink/renderer/core/url_pattern/url_pattern_component.h b/third_party/blink/renderer/core/url_pattern/url_pattern_component.h
index 350bef5..3860f046 100644
--- a/third_party/blink/renderer/core/url_pattern/url_pattern_component.h
+++ b/third_party/blink/renderer/core/url_pattern/url_pattern_component.h
@@ -6,8 +6,11 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_URL_PATTERN_URL_PATTERN_COMPONENT_H_
 
 #include <optional>
+#include <unordered_map>
+#include <utility>
 
 #include "base/types/pass_key.h"
+#include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_regexp.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
@@ -98,6 +101,16 @@
   // regular expression.
   bool HasRegExpGroups() const { return pattern_.HasRegexGroups(); }
 
+  // Generates a valid component string by filling non-fixed-text parts using
+  // `groups` as a look-up table from names to substituting strings.  `groups`
+  // should not have overlaps in their names (first elements).
+  // `should_treat_as_standard_url` must be the result of calling
+  // `ShouldTreatAsStandardURL()` for the corresponding "protocol" object.
+  std::optional<String> Generate(
+      const WTF::Vector<std::pair<String, String>>& groups,
+      bool should_treat_as_standard_url,
+      ExceptionState& exception_state) const;
+
   const std::vector<liburlpattern::Part>& PartList() const;
 
   void Trace(Visitor* visitor) const;
diff --git a/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc b/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc
index 0ae3c43c..55eff63d 100644
--- a/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc
+++ b/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc
@@ -9,7 +9,6 @@
 
 #include "base/check.h"
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "cc/base/features.h"
 #include "components/viz/common/view_transition_element_resource_id.h"
 #include "third_party/blink/public/resources/grit/blink_resources.h"
@@ -656,7 +655,7 @@
       DCHECK(view_transition_name);
 
       auto it = element_data_map_.find(view_transition_name);
-      CHECK(it != element_data_map_.end(), base::NotFatalUntil::M130);
+      CHECK(it != element_data_map_.end());
       const auto& element_data = it->value;
       return !element_data->new_snapshot_id.IsValid();
     }
@@ -665,7 +664,7 @@
       DCHECK(view_transition_name);
 
       auto it = element_data_map_.find(view_transition_name);
-      CHECK(it != element_data_map_.end(), base::NotFatalUntil::M130);
+      CHECK(it != element_data_map_.end());
       const auto& element_data = it->value;
       return !element_data->old_snapshot_id.IsValid();
     }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index c9f3e506..22f7b1fe 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -1234,7 +1234,7 @@
     value_if_less_than_1 = 1;
   } else {
     // For now, try to get the illegal attribute, but catch the error.
-    NOTREACHED(base::NotFatalUntil::M133) << "Not an int attribute.";
+    NOTREACHED() << "Not an int attribute.";
   }
 
   if (out_value) {
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
index 1c63bff..a4b22eb 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
@@ -283,13 +283,12 @@
     host->FlushRecording(FlushReason::kWritePixels);
 
     // Short-circuit out if an error occurred while flushing the recording.
-    if (!host->ResourceProvider()->IsValid()) {
+    if (!provider->IsValid()) {
       return false;
     }
   }
 
-  return host->ResourceProvider()->WritePixels(orig_info, pixels, row_bytes, x,
-                                               y);
+  return provider->WritePixels(orig_info, pixels, row_bytes, x, y);
 }
 
 bool CanvasRenderingContext2D::ShouldAntialias() const {
@@ -661,11 +660,12 @@
   }
   // GetOrCreateResourceProvider needs to be called before FlushRecording, to
   // make sure "hint" is properly taken into account.
-  if (!Host()->GetOrCreateCanvasResourceProvider()) {
+  auto* provider = Host()->GetOrCreateCanvasResourceProvider();
+  if (!provider) {
     return nullptr;
   }
   Host()->FlushRecording(reason);
-  return Host()->ResourceProvider()->Snapshot(reason);
+  return provider->Snapshot(reason);
 }
 
 ImageData* CanvasRenderingContext2D::getImageDataInternal(
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc b/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
index fdb92c6..ccc67c6 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
@@ -33,7 +33,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
 #include "third_party/blink/public/platform/web_blob_info.h"
@@ -1147,9 +1146,7 @@
   db().RenameIndex(transaction_->Id(), Id(), index_id, new_name);
 
   auto metadata_iterator = metadata_->indexes.find(index_id);
-  CHECK_NE(metadata_iterator, metadata_->indexes.end(),
-           base::NotFatalUntil::M130)
-      << "Invalid index_id";
+  CHECK_NE(metadata_iterator, metadata_->indexes.end()) << "Invalid index_id";
   const String& old_name = metadata_iterator->value->name;
 
   DCHECK(index_map_.Contains(old_name))
diff --git a/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer.cc b/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer.cc
index 6bc8b42..d781845 100644
--- a/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer.cc
+++ b/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer.cc
@@ -8,7 +8,6 @@
 
 #include "base/check_op.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "media/base/audio_timestamp_helper.h"
@@ -89,7 +88,7 @@
     aggregate_converter_.RemoveInput(input);
   } else {
     auto converter = converters_.find(input_sample_rate);
-    CHECK(converter != converters_.end(), base::NotFatalUntil::M130);
+    CHECK(converter != converters_.end());
     converter->second->RemoveInput(input);
     if (converter->second->empty()) {
       // Remove converter when it's empty.
diff --git a/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager.cc b/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager.cc
index 27fe96d..d70f5e33e 100644
--- a/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager.cc
+++ b/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager.cc
@@ -15,7 +15,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/types/cxx23_to_underlying.h"
 #include "build/build_config.h"
 #include "media/audio/audio_device_description.h"
@@ -212,7 +211,7 @@
     dead_it = std::ranges::find(
         dead_mixers_, mixer,
         [](const AudioRendererMixerReference& val) { return val.mixer.get(); });
-    CHECK(dead_it != dead_mixers_.end(), base::NotFatalUntil::M130);
+    CHECK(dead_it != dead_mixers_.end());
   }
 
   auto& mixer_ref = it == mixers_.end() ? *dead_it : it->second;
diff --git a/third_party/blink/renderer/modules/mediastream/browser_capture_media_stream_track.cc b/third_party/blink/renderer/modules/mediastream/browser_capture_media_stream_track.cc
index 7caddbad..1b13ac5a 100644
--- a/third_party/blink/renderer/modules/mediastream/browser_capture_media_stream_track.cc
+++ b/third_party/blink/renderer/modules/mediastream/browser_capture_media_stream_track.cc
@@ -7,7 +7,6 @@
 #include <optional>
 
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/token.h"
 #include "base/types/expected.h"
 #include "base/uuid.h"
@@ -319,7 +318,7 @@
 void BrowserCaptureMediaStreamTrack::MaybeFinalizeCropPromise(
     BrowserCaptureMediaStreamTrack::PromiseMapIterator iter) {
   DCHECK(IsMainThread());
-  CHECK_NE(iter, pending_promises_.end(), base::NotFatalUntil::M130);
+  CHECK_NE(iter, pending_promises_.end());
 
   PromiseInfo* const info = iter->value;
 
diff --git a/third_party/blink/renderer/modules/mediastream/media_devices.cc b/third_party/blink/renderer/modules/mediastream/media_devices.cc
index 34f8c16..63b1a2384 100644
--- a/third_party/blink/renderer/modules/mediastream/media_devices.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_devices.cc
@@ -9,7 +9,6 @@
 
 #include "base/feature_list.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/strings/strcat.h"
 #include "base/uuid.h"
@@ -1491,7 +1490,7 @@
   CHECK(element);  // Persistent.
 
   const auto it = crop_target_resolvers_.find(element);
-  CHECK_NE(it, crop_target_resolvers_.end(), base::NotFatalUntil::M130);
+  CHECK_NE(it, crop_target_resolvers_.end());
   ScriptPromiseResolver<CropTarget>* const resolver = it->value;
   crop_target_resolvers_.erase(it);
 
@@ -1515,7 +1514,7 @@
   CHECK(element);  // Persistent.
 
   const auto it = restriction_target_resolvers_.find(element);
-  CHECK_NE(it, restriction_target_resolvers_.end(), base::NotFatalUntil::M130);
+  CHECK_NE(it, restriction_target_resolvers_.end());
   ScriptPromiseResolver<RestrictionTarget>* const resolver = it->value;
   restriction_target_resolvers_.erase(it);
 
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc
index 6c2c55e..2873c8f 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc
@@ -13,7 +13,6 @@
 #include "base/location.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/task/bind_post_task.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
@@ -952,7 +951,7 @@
 static void RemoveSinkInternal(Vector<WebMediaStreamSink*>* sinks,
                                WebMediaStreamSink* sink) {
   auto it = std::ranges::find(*sinks, sink);
-  CHECK(it != sinks->end(), base::NotFatalUntil::M130);
+  CHECK(it != sinks->end());
   sinks->erase(it);
 }
 
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
index 10d7526..85f95b7 100644
--- a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
+++ b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
@@ -15,7 +15,6 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/single_thread_task_runner.h"
@@ -598,7 +597,7 @@
     const blink::WebString& result_name) {
   SendLogMessage(GetOnTrackStartedLogString(source, result));
   auto it = std::ranges::find(sources_waiting_for_callback_, source);
-  CHECK(it != sources_waiting_for_callback_.end(), base::NotFatalUntil::M130);
+  CHECK(it != sources_waiting_for_callback_.end());
   sources_waiting_for_callback_.erase(it);
   // All tracks must be started successfully. Otherwise the request is a
   // failure.
diff --git a/third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.cc b/third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.cc
index d4cdde9..bb11918 100644
--- a/third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.cc
+++ b/third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.cc
@@ -7,7 +7,6 @@
 #include <stddef.h>
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "third_party/blink/renderer/modules/peerconnection/mock_peer_connection_impl.h"
 #include "third_party/blink/renderer/modules/peerconnection/mock_rtc_peer_connection_handler_platform.h"
@@ -136,7 +135,7 @@
 
 void MockMediaStream::UnregisterObserver(ObserverInterface* observer) {
   auto it = observers_.find(observer);
-  CHECK(it != observers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != observers_.end());
   observers_.erase(it);
 }
 
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
index bbf52e2..7c5915b 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -1338,6 +1338,10 @@
     exception_state.ThrowDOMException(
         DOMExceptionCode::kSyntaxError,
         "The given configuration has a syntax error.");
+  } else if (error == webrtc::RTCErrorType::INVALID_PARAMETER) {
+    exception_state.ThrowDOMException(
+        DOMExceptionCode::kInvalidAccessError,
+        "The given configuration has invalid parameters.");
   } else {
     exception_state.ThrowDOMException(
         DOMExceptionCode::kOperationError,
diff --git a/third_party/blink/renderer/modules/remote_objects/remote_object_gateway_impl.cc b/third_party/blink/renderer/modules/remote_objects/remote_object_gateway_impl.cc
index 014835e6..b8971da 100644
--- a/third_party/blink/renderer/modules/remote_objects/remote_object_gateway_impl.cc
+++ b/third_party/blink/renderer/modules/remote_objects/remote_object_gateway_impl.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/modules/remote_objects/remote_object_gateway_impl.h"
 
-#include "base/not_fatal_until.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
@@ -107,7 +106,7 @@
   // Removal becomes in effect on next reload. We simply remove the entry
   // from the map here.
   auto iter = named_objects_.find(name);
-  CHECK(iter != named_objects_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != named_objects_.end());
   named_objects_.erase(iter);
 }
 
@@ -120,7 +119,7 @@
 void RemoteObjectGatewayImpl::ReleaseObject(int32_t object_id,
                                             RemoteObject* remote_object) {
   auto iter = remote_objects_.find(object_id);
-  CHECK(iter != remote_objects_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != remote_objects_.end());
   if (iter->value == remote_object)
     remote_objects_.erase(iter);
   object_host_->ReleaseObject(object_id);
diff --git a/third_party/blink/renderer/modules/screen_details/screen_details.cc b/third_party/blink/renderer/modules/screen_details/screen_details.cc
index 12bdb5a9..8ae8810 100644
--- a/third_party/blink/renderer/modules/screen_details/screen_details.cc
+++ b/third_party/blink/renderer/modules/screen_details/screen_details.cc
@@ -5,7 +5,6 @@
 #include "third_party/blink/renderer/modules/screen_details/screen_details.h"
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -37,7 +36,7 @@
 
   auto it = std::ranges::find(screens_, current_display_id_,
                               &ScreenDetailed::DisplayId);
-  CHECK(it != screens_.end(), base::NotFatalUntil::M130);
+  CHECK(it != screens_.end());
   return it->Get();
 }
 
@@ -141,7 +140,7 @@
       auto id = screen->DisplayId();
       auto new_it = std::ranges::find(new_infos.screen_infos, id,
                                       &display::ScreenInfo::display_id);
-      CHECK(new_it != new_infos.screen_infos.end(), base::NotFatalUntil::M130);
+      CHECK(new_it != new_infos.screen_infos.end());
       auto old_it = std::ranges::find(prev_screen_infos_.screen_infos, id,
                                       &display::ScreenInfo::display_id);
       if (old_it != prev_screen_infos_.screen_infos.end() &&
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 caa93a2..a25d43a 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
@@ -40,7 +40,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/time/time.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -172,7 +171,7 @@
       [](MapType* map, Args&&... args, int event_id,
          mojom::blink::ServiceWorkerEventStatus status) {
         auto iter = map->find(event_id);
-        CHECK(iter != map->end(), base::NotFatalUntil::M130);
+        CHECK(iter != map->end());
         std::move(iter->value).Run(status, std::forward<Args>(args)...);
         map->erase(iter);
       },
@@ -636,7 +635,7 @@
     mojo::ScopedDataPipeConsumerHandle data_pipe) {
   DCHECK(IsContextThread());
   auto it = pending_preload_fetch_events_.find(fetch_event_id);
-  CHECK(it != pending_preload_fetch_events_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_preload_fetch_events_.end());
   FetchEvent* fetch_event = it->value.Get();
   DCHECK(fetch_event);
   fetch_event->OnNavigationPreloadResponse(ScriptController()->GetScriptState(),
@@ -1754,7 +1753,7 @@
     mojom::blink::ServiceWorkerEventStatus status) {
   DCHECK(IsContextThread());
   auto iter = install_event_callbacks_.find(event_id);
-  CHECK(iter != install_event_callbacks_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != install_event_callbacks_.end());
   GlobalFetch::ScopedFetcher* fetcher = GlobalFetch::ScopedFetcher::From(*this);
   std::move(iter->value).Run(status, fetcher->FetchCount());
   install_event_callbacks_.erase(iter);
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager.cc b/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager.cc
index e4b4ee5..b1754c89 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager.cc
@@ -9,7 +9,6 @@
 
 #include "base/barrier_closure.h"
 #include "base/containers/span.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_checker.h"
@@ -216,7 +215,7 @@
   void OnScriptReceived(mojom::blink::ServiceWorkerScriptInfoPtr script_info) {
     DCHECK_CALLED_ON_VALID_THREAD(io_thread_checker_);
     auto iter = running_receivers_.find(script_info->script_url);
-    CHECK(iter != running_receivers_.end(), base::NotFatalUntil::M130);
+    CHECK(iter != running_receivers_.end());
     std::unique_ptr<BundledReceivers> receivers = std::move(iter->value);
     DCHECK(receivers);
     if (!receivers->body()->HasReceivedAllData() ||
diff --git a/third_party/blink/renderer/modules/service_worker/thread_safe_script_container.cc b/third_party/blink/renderer/modules/service_worker/thread_safe_script_container.cc
index f90975b..1e76d7d 100644
--- a/third_party/blink/renderer/modules/service_worker/thread_safe_script_container.cc
+++ b/third_party/blink/renderer/modules/service_worker/thread_safe_script_container.cc
@@ -6,7 +6,6 @@
 
 #include "base/containers/contains.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 
 namespace blink {
 
@@ -78,7 +77,7 @@
 ThreadSafeScriptContainer::TakeOnWorkerThread(const KURL& url) {
   base::AutoLock locker(lock_);
   auto it = script_data_.find(url);
-  CHECK(it != script_data_.end(), base::NotFatalUntil::M130)
+  CHECK(it != script_data_.end())
       << "Script should have been received before calling Take";
   std::pair<ScriptStatus, std::unique_ptr<RawScriptData>>& pair = it->value;
   DCHECK_EQ(ScriptStatus::kReceived, pair.first);
diff --git a/third_party/blink/renderer/modules/storage/cached_storage_area.cc b/third_party/blink/renderer/modules/storage/cached_storage_area.cc
index 45da689..391150c 100644
--- a/third_party/blink/renderer/modules/storage/cached_storage_area.cc
+++ b/third_party/blink/renderer/modules/storage/cached_storage_area.cc
@@ -15,7 +15,6 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/rand_util.h"
 #include "base/time/time.h"
@@ -589,8 +588,7 @@
   const String key = mutation->key;
   if (!key.IsNull()) {
     auto key_queue_iter = pending_mutations_by_key_.find(key);
-    CHECK(key_queue_iter != pending_mutations_by_key_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(key_queue_iter != pending_mutations_by_key_.end());
     DCHECK_EQ(key_queue_iter->value.front(), mutation.get());
     key_queue_iter->value.pop_front();
     if (key_queue_iter->value.empty())
diff --git a/third_party/blink/renderer/modules/wake_lock/wake_lock_manager.cc b/third_party/blink/renderer/modules/wake_lock/wake_lock_manager.cc
index 7fa8eb2..58940371 100644
--- a/third_party/blink/renderer/modules/wake_lock/wake_lock_manager.cc
+++ b/third_party/blink/renderer/modules/wake_lock/wake_lock_manager.cc
@@ -5,7 +5,6 @@
 #include "third_party/blink/renderer/modules/wake_lock/wake_lock_manager.h"
 
 #include "base/check_op.h"
-#include "base/not_fatal_until.h"
 #include "third_party/blink/public/mojom/wake_lock/wake_lock.mojom-blink.h"
 #include "third_party/blink/public/platform/browser_interface_broker_proxy.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
@@ -59,7 +58,7 @@
   // 1. If document.[[ActiveLocks]][type] does not contain lock, abort these
   //    steps.
   auto iterator = wake_lock_sentinels_.find(sentinel);
-  CHECK(iterator != wake_lock_sentinels_.end(), base::NotFatalUntil::M130);
+  CHECK(iterator != wake_lock_sentinels_.end());
 
   // 2. Remove lock from document.[[ActiveLocks]][type].
   wake_lock_sentinels_.erase(iterator);
diff --git a/third_party/blink/renderer/modules/webcodecs/video_frame_monitor.cc b/third_party/blink/renderer/modules/webcodecs/video_frame_monitor.cc
index 9a2ac5e..ede3728 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_frame_monitor.cc
+++ b/third_party/blink/renderer/modules/webcodecs/video_frame_monitor.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/modules/webcodecs/video_frame_monitor.h"
 
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 
 namespace blink {
@@ -62,10 +61,10 @@
   DCHECK(!source_id.empty());
   lock_.AssertAcquired();
   auto it_source = map_.find(source_id);
-  CHECK(it_source != map_.end(), base::NotFatalUntil::M130);
+  CHECK(it_source != map_.end());
   FrameMap& frame_map = it_source->second;
   auto it_frame = frame_map.find(frame_id);
-  CHECK(it_frame != frame_map.end(), base::NotFatalUntil::M130);
+  CHECK(it_frame != frame_map.end());
   DCHECK_GT(it_frame->value, 0);
   if (--it_frame->value == 0) {
     frame_map.erase(it_frame);
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
index 3769282..4c25f00f12 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -34,7 +34,6 @@
 #include "base/feature_list.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/checked_math.h"
 #include "base/synchronization/lock.h"
 #include "base/task/single_thread_task_runner.h"
@@ -9108,8 +9107,7 @@
     DCHECK_GT(program_completion_query_list_.size(), 0u);
     WebGLProgram* program_to_remove = program_completion_query_list_[0];
     auto program_iter = program_completion_query_map_.find(program_to_remove);
-    CHECK_NE(program_iter, program_completion_query_map_.end(),
-             base::NotFatalUntil::M130);
+    CHECK_NE(program_iter, program_completion_query_map_.end());
     ContextGL()->DeleteQueriesEXT(1, &program_iter->value);
     program_completion_query_map_.erase(program_iter);
     program_completion_query_list_.EraseAt(0);
diff --git a/third_party/blink/renderer/modules/webusb/usb_device.cc b/third_party/blink/renderer/modules/webusb/usb_device.cc
index 8abe0dd..d46f5f2 100644
--- a/third_party/blink/renderer/modules/webusb/usb_device.cc
+++ b/third_party/blink/renderer/modules/webusb/usb_device.cc
@@ -9,7 +9,6 @@
 #include <utility>
 
 #include "base/containers/span.h"
-#include "base/not_fatal_until.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
@@ -1199,7 +1198,7 @@
   // Since all callbacks are wrapped with a check that the execution context is
   // still valid we can guarantee that `device_requests_` hasn't been cleared
   // yet if we are in this function.
-  CHECK(request_entry != device_requests_.end(), base::NotFatalUntil::M130);
+  CHECK(request_entry != device_requests_.end());
   device_requests_.erase(request_entry);
 }
 
diff --git a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
index b825e664..0c2b5d7 100644
--- a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
+++ b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "base/not_fatal_until.h"
 #include "build/build_config.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
@@ -448,7 +447,7 @@
   // The requesting_sessions_ entry for this session must have already
   // been created in |RequestFrame|.
   auto request = requesting_sessions_.find(session);
-  CHECK(request != requesting_sessions_.end(), base::NotFatalUntil::M130);
+  CHECK(request != requesting_sessions_.end());
 
   auto provider = non_immersive_data_providers_.find(session);
   if (provider == non_immersive_data_providers_.end()) {
diff --git a/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc b/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc
index f37e97a..268187e 100644
--- a/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc
+++ b/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.h"
 
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_xr_frame_request_callback.h"
 #include "third_party/blink/renderer/core/inspector/inspector_trace_events.h"
 #include "third_party/blink/renderer/core/probe/async_task_context.h"
@@ -85,8 +84,7 @@
     if (it_frame_request == current_callback_frame_requests_.end()) {
       continue;
     }
-    CHECK_NE(current_callback_async_tasks_.end(), it_async_task,
-             base::NotFatalUntil::M130);
+    CHECK_NE(current_callback_async_tasks_.end(), it_async_task);
 
     TRACE_EVENT_NESTABLE_ASYNC_END0("xr", "frameRequest",
                                     TRACE_ID_LOCAL(trace_id_base_ + id));
diff --git a/third_party/blink/renderer/modules/xr/xr_plane_manager.cc b/third_party/blink/renderer/modules/xr/xr_plane_manager.cc
index 9339dbed..c46da946 100644
--- a/third_party/blink/renderer/modules/xr/xr_plane_manager.cc
+++ b/third_party/blink/renderer/modules/xr/xr_plane_manager.cc
@@ -5,7 +5,6 @@
 #include "third_party/blink/renderer/modules/xr/xr_plane_manager.h"
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "base/trace_event/trace_event.h"
 #include "third_party/blink/renderer/modules/xr/xr_plane.h"
 #include "third_party/blink/renderer/modules/xr/xr_plane_set.h"
@@ -67,7 +66,7 @@
     // as-is.
     if (!base::Contains(updated_planes, plane_id)) {
       auto it = plane_ids_to_planes_.find(plane_id);
-      CHECK(it != plane_ids_to_planes_.end(), base::NotFatalUntil::M130);
+      CHECK(it != plane_ids_to_planes_.end());
       updated_planes.insert(plane_id, it->value);
     }
   }
diff --git a/third_party/blink/renderer/modules/xr/xr_session.cc b/third_party/blink/renderer/modules/xr/xr_session.cc
index 45c7525..650d421 100644
--- a/third_party/blink/renderer/modules/xr/xr_session.cc
+++ b/third_party/blink/renderer/modules/xr/xr_session.cc
@@ -13,7 +13,6 @@
 #include "base/containers/contains.h"
 #include "base/dcheck_is_on.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/trace_event/trace_event.h"
 #include "base/types/pass_key.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
@@ -1312,7 +1311,7 @@
     // already moved to |updated_anchors|. Otherwise just copy it over as-is.
     if (it_updated == updated_anchors.end()) {
       auto it = anchor_ids_to_anchors_.find(anchor_id);
-      CHECK(it != anchor_ids_to_anchors_.end(), base::NotFatalUntil::M130);
+      CHECK(it != anchor_ids_to_anchors_.end());
       updated_anchors.insert(anchor_id, it->value);
     }
   }
diff --git a/third_party/blink/renderer/platform/bindings/parkable_string_manager.cc b/third_party/blink/renderer/platform/bindings/parkable_string_manager.cc
index adf7306..2c3bcc71 100644
--- a/third_party/blink/renderer/platform/bindings/parkable_string_manager.cc
+++ b/third_party/blink/renderer/platform/bindings/parkable_string_manager.cc
@@ -12,7 +12,6 @@
 #include "base/memory/post_delayed_memory_reduction_task.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
 #include "base/trace_event/memory_allocator_dump.h"
@@ -75,7 +74,7 @@
                 ParkableStringManager::StringMap* from,
                 ParkableStringManager::StringMap* to) {
   auto it = from->find(string->digest());
-  CHECK(it != from->end(), base::NotFatalUntil::M130);
+  CHECK(it != from->end());
   DCHECK_EQ(it->value, string);
   from->erase(it);
   auto insert_result = to->insert(string->digest(), string);
@@ -265,7 +264,7 @@
     }
 
     auto it = map->find(string->digest());
-    CHECK(it != map->end(), base::NotFatalUntil::M130);
+    CHECK(it != map->end());
     map->erase(it);
   }
 
diff --git a/third_party/blink/renderer/platform/disk_data_allocator.cc b/third_party/blink/renderer/platform/disk_data_allocator.cc
index 7ee2c45..a9ab102 100644
--- a/third_party/blink/renderer/platform/disk_data_allocator.cc
+++ b/third_party/blink/renderer/platform/disk_data_allocator.cc
@@ -10,7 +10,6 @@
 #include "base/compiler_specific.h"
 #include "base/containers/contains.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/synchronization/lock.h"
 #include "base/threading/thread_restrictions.h"
 #include "third_party/blink/public/common/features.h"
@@ -170,7 +169,7 @@
   {
     base::AutoLock locker(lock_);
     auto it = allocated_chunks_.find(metadata.start_offset());
-    CHECK(it != allocated_chunks_.end(), base::NotFatalUntil::M130);
+    CHECK(it != allocated_chunks_.end());
     DCHECK_EQ(metadata.size(), it->second);
   }
 #endif
@@ -182,7 +181,7 @@
 
 #if DCHECK_IS_ON()
   auto it = allocated_chunks_.find(metadata->start_offset());
-  CHECK(it != allocated_chunks_.end(), base::NotFatalUntil::M130);
+  CHECK(it != allocated_chunks_.end());
   DCHECK_EQ(metadata->size(), it->second);
   allocated_chunks_.erase(it);
 #endif
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
index 3c4624bc..e170f58 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "base/debug/stack_trace.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/trace_event/trace_event.h"
 #include "components/viz/common/quads/compositor_frame.h"
@@ -453,7 +452,7 @@
   for (const auto& resource : resources) {
     auto it = exported_resources_.find(resource.id);
 
-    CHECK(it != exported_resources_.end(), base::NotFatalUntil::M130);
+    CHECK(it != exported_resources_.end());
     if (it == exported_resources_.end()) {
       continue;
     }
diff --git a/third_party/blink/renderer/platform/graphics/image_decoding_store.cc b/third_party/blink/renderer/platform/graphics/image_decoding_store.cc
index 9bf291e..d30fba9f 100644
--- a/third_party/blink/renderer/platform/graphics/image_decoding_store.cc
+++ b/third_party/blink/renderer/platform/graphics/image_decoding_store.cc
@@ -28,7 +28,6 @@
 #include <memory>
 
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/synchronization/lock.h"
 #include "third_party/blink/renderer/platform/graphics/image_frame_generator.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
@@ -280,7 +279,7 @@
 
   // Remove entry from identifier map.
   typename V::iterator iter = identifier_map->find(cache_entry->Generator());
-  CHECK(iter != identifier_map->end(), base::NotFatalUntil::M130);
+  CHECK(iter != identifier_map->end());
   iter->value.erase(cache_entry->CacheKey());
   if (!iter->value.size())
     identifier_map->erase(iter);
diff --git a/third_party/blink/renderer/platform/graphics/image_frame_generator.cc b/third_party/blink/renderer/platform/graphics/image_frame_generator.cc
index b029813..5f04c5f 100644
--- a/third_party/blink/renderer/platform/graphics/image_frame_generator.cc
+++ b/third_party/blink/renderer/platform/graphics/image_frame_generator.cc
@@ -29,7 +29,6 @@
 #include <memory>
 #include <utility>
 
-#include "base/not_fatal_until.h"
 #include "base/synchronization/lock.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/platform/graphics/image_decoder_wrapper.h"
@@ -354,7 +353,7 @@
 
   base::AutoLock lock(generator_->generator_lock_);
   auto it = generator_->lock_map_.find(client_id_);
-  CHECK(it != generator_->lock_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != generator_->lock_map_.end());
   it->value->ref_count--;
 
   if (it->value->ref_count == 0)
diff --git a/third_party/blink/renderer/platform/graphics/parkable_image_manager.cc b/third_party/blink/renderer/platform/graphics/parkable_image_manager.cc
index 706fddd..a5cdcc5 100644
--- a/third_party/blink/renderer/platform/graphics/parkable_image_manager.cc
+++ b/third_party/blink/renderer/platform/graphics/parkable_image_manager.cc
@@ -5,7 +5,6 @@
 #include "third_party/blink/renderer/platform/graphics/parkable_image_manager.h"
 
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/synchronization/lock.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
@@ -179,7 +178,7 @@
   // Image could be on disk or unparked. Remove it in either case.
   auto* map = image->is_on_disk() ? &on_disk_images_ : &unparked_images_;
   auto it = map->find(image);
-  CHECK(it != map->end(), base::NotFatalUntil::M130);
+  CHECK(it != map->end());
   map->erase(it);
 }
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc
index 12bc6e9..a634b90e5 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc
@@ -11,7 +11,6 @@
 #include "base/containers/contains.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/time/default_clock.h"
@@ -202,7 +201,7 @@
   auto it = throttle_option_queue.find(ClientIdWithPriority(
       client_id, client_it->value->priority, client_it->value->intra_priority));
 
-  CHECK(it != throttle_option_queue.end(), base::NotFatalUntil::M130);
+  CHECK(it != throttle_option_queue.end());
   throttle_option_queue.erase(it);
 
   client_it->value->priority = priority;
diff --git a/third_party/blink/renderer/platform/loader/fetch/shared_buffer_bytes_consumer.cc b/third_party/blink/renderer/platform/loader/fetch/shared_buffer_bytes_consumer.cc
index 591ff7e..24d71869 100644
--- a/third_party/blink/renderer/platform/loader/fetch/shared_buffer_bytes_consumer.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/shared_buffer_bytes_consumer.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "base/not_fatal_until.h"
 
 namespace blink {
 
@@ -24,7 +23,7 @@
 }
 
 BytesConsumer::Result SharedBufferBytesConsumer::EndRead(size_t read_size) {
-  CHECK(iterator_ != data_->end(), base::NotFatalUntil::M130);
+  CHECK(iterator_ != data_->end());
   DCHECK_LE(read_size + bytes_read_in_chunk_, iterator_->size());
   bytes_read_in_chunk_ += read_size;
   if (bytes_read_in_chunk_ == iterator_->size()) {
diff --git a/third_party/blink/renderer/platform/media/interval_map.h b/third_party/blink/renderer/platform/media/interval_map.h
index 620428b..0f0a388 100644
--- a/third_party/blink/renderer/platform/media/interval_map.h
+++ b/third_party/blink/renderer/platform/media/interval_map.h
@@ -11,7 +11,6 @@
 
 #include "base/check.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/platform/allow_discouraged_type.h"
 
 namespace blink {
@@ -99,13 +98,13 @@
 
   // Returns the beginning of the current interval.
   KeyType interval_begin() const {
-    CHECK(iter_ != map_->end(), base::NotFatalUntil::M130);
+    CHECK(iter_ != map_->end());
     return iter_->first;
   }
 
   // Returns the end of the current interval, non-inclusive.
   KeyType interval_end() const {
-    CHECK(iter_ != map_->end(), base::NotFatalUntil::M130);
+    CHECK(iter_ != map_->end());
     typename MapType::const_iterator next = iter_;
     ++next;
     if (next == map_->end()) {
@@ -122,7 +121,7 @@
 
   // Returns the value associated with the current interval.
   ValueType value() const {
-    CHECK(iter_ != map_->end(), base::NotFatalUntil::M130);
+    CHECK(iter_ != map_->end());
     return iter_->second;
   }
 
@@ -137,7 +136,7 @@
   // interval. (But should always have a different value.)
   // Not allowed if we're already at map_->end().
   void operator++() {
-    CHECK(iter_ != map_->end(), base::NotFatalUntil::M130);
+    CHECK(iter_ != map_->end());
     ++iter_;
   }
 
diff --git a/third_party/blink/renderer/platform/media/multi_buffer.cc b/third_party/blink/renderer/platform/media/multi_buffer.cc
index 9eb643c9..b7ae64a 100644
--- a/third_party/blink/renderer/platform/media/multi_buffer.cc
+++ b/third_party/blink/renderer/platform/media/multi_buffer.cc
@@ -11,7 +11,6 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "media/base/media_switches.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
@@ -344,7 +343,7 @@
     DataProvider* provider) {
   BlockId pos = provider->Tell();
   auto iter = writer_index_.find(pos);
-  CHECK(iter != writer_index_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != writer_index_.end());
   DCHECK_EQ(iter->second.get(), provider);
   std::unique_ptr<DataProvider> ret = std::move(iter->second);
   writer_index_.erase(iter);
diff --git a/third_party/blink/renderer/platform/peerconnection/two_keys_adapter_map.h b/third_party/blink/renderer/platform/peerconnection/two_keys_adapter_map.h
index ba5789c..f2c14f6 100644
--- a/third_party/blink/renderer/platform/peerconnection/two_keys_adapter_map.h
+++ b/third_party/blink/renderer/platform/peerconnection/two_keys_adapter_map.h
@@ -11,7 +11,6 @@
 
 #include "base/check.h"
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/platform/wtf/hash_map.h"
 
 namespace blink {
@@ -57,7 +56,7 @@
   // |FindByPrimary(primary) && !FindBySecondary(secondary)| must hold.
   void SetSecondaryKey(const PrimaryKey& primary, SecondaryKey secondary) {
     auto it = entries_by_primary_.find(primary);
-    CHECK(it != entries_by_primary_.end(), base::NotFatalUntil::M130);
+    CHECK(it != entries_by_primary_.end());
     DCHECK(entries_by_secondary_.find(secondary) ==
            entries_by_secondary_.end());
     Entry* entry = it->value.get();
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index a1ed4e1c..012dd02 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -4817,7 +4817,7 @@
     {
       // crbug.com/341564372
       name: "TextareaSplitText",
-      status: "experimental",
+      status: "stable",
     },
     {
       // killswitch for fix in M137
@@ -5088,6 +5088,10 @@
       status: "experimental",
     },
     {
+      name: "URLPatternGenerate",
+      status: "experimental",
+    },
+    {
       name: "URLSearchParamsHasAndDeleteMultipleArgs",
       status: "stable",
     },
diff --git a/third_party/blink/renderer/platform/scheduler/common/frame_or_worker_scheduler.cc b/third_party/blink/renderer/platform/scheduler/common/frame_or_worker_scheduler.cc
index ef121e0e..5eaed474 100644
--- a/third_party/blink/renderer/platform/scheduler/common/frame_or_worker_scheduler.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/frame_or_worker_scheduler.cc
@@ -9,7 +9,6 @@
 
 #include "base/feature_list.h"
 #include "base/functional/callback.h"
-#include "base/not_fatal_until.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/renderer/platform/bindings/source_location.h"
 #include "v8/include/v8-isolate.h"
@@ -126,7 +125,7 @@
     LifecycleObserverHandle* handle) {
   DCHECK(handle);
   const auto found = lifecycle_observers_.find(handle);
-  CHECK(lifecycle_observers_.end() != found, base::NotFatalUntil::M130);
+  CHECK(lifecycle_observers_.end() != found);
   lifecycle_observers_.erase(found);
 }
 
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc
index 4dd74859..517fcec 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc
@@ -11,7 +11,6 @@
 #include "base/check.h"
 #include "base/containers/contains.h"
 #include "base/functional/callback.h"
-#include "base/not_fatal_until.h"
 #include "base/trace_event/traced_value.h"
 #include "third_party/blink/renderer/platform/scheduler/common/tracing_helper.h"
 #include "third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h"
@@ -47,7 +46,7 @@
   if (!task_queues_.Contains(queue_traits.Key()))
     CreateTaskQueue(queue_traits);
   auto it = task_queues_.find(queue_traits.Key());
-  CHECK(it != task_queues_.end(), base::NotFatalUntil::M130);
+  CHECK(it != task_queues_.end());
   return it->value;
 }
 
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/pending_user_input.cc b/third_party/blink/renderer/platform/scheduler/main_thread/pending_user_input.cc
index a32d360..939e53ac 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/pending_user_input.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/pending_user_input.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/platform/scheduler/main_thread/pending_user_input.h"
 
-#include "base/not_fatal_until.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
@@ -40,7 +39,7 @@
     return;
 
   auto it = pending_events_.find(AttributionGroup(attribution));
-  CHECK_NE(it, pending_events_.end(), base::NotFatalUntil::M130);
+  CHECK_NE(it, pending_events_.end());
 
   auto& value = it->value;
   if (IsContinuousEventType(type)) {
diff --git a/third_party/blink/renderer/platform/text/east_asian_spacing_type.h b/third_party/blink/renderer/platform/text/east_asian_spacing_type.h
index 7fc55f59..1e4f054 100644
--- a/third_party/blink/renderer/platform/text/east_asian_spacing_type.h
+++ b/third_party/blink/renderer/platform/text/east_asian_spacing_type.h
@@ -11,7 +11,7 @@
 
 // Represents the East Asian Spacing property, as defined in
 // https://unicode.org/reports/tr59/.
-enum class EastAsianSpacingType : uint16_t {
+enum class EastAsianSpacingType : uint8_t {
   kOther = 0,
   kNarrow,
   kConditional,
diff --git a/third_party/blink/renderer/platform/wtf/text/code_point_iterator.h b/third_party/blink/renderer/platform/wtf/text/code_point_iterator.h
index 786fde7..ef36623 100644
--- a/third_party/blink/renderer/platform/wtf/text/code_point_iterator.h
+++ b/third_party/blink/renderer/platform/wtf/text/code_point_iterator.h
@@ -69,6 +69,11 @@
     // different from `operator+`, which advances by the number of code points.
     void AdvanceByCodeUnits(wtf_size_t by);
 
+    // Similar to `std::distance`, but in the code units, not code points.
+    wtf_size_t DistanceByCodeUnits(const Utf16& other) const {
+      return data_ - other.data_;
+    }
+
    private:
     friend class CodePointIterator;
 
diff --git a/third_party/blink/renderer/platform/wtf/text/code_point_iterator_test.cc b/third_party/blink/renderer/platform/wtf/text/code_point_iterator_test.cc
index e715519..3cdb169 100644
--- a/third_party/blink/renderer/platform/wtf/text/code_point_iterator_test.cc
+++ b/third_party/blink/renderer/platform/wtf/text/code_point_iterator_test.cc
@@ -76,6 +76,23 @@
   EXPECT_EQ(count, test.chars.size());
 }
 
+TEST_P(CodePointIteratorParamTest, DistanceByCodeUnits) {
+  const auto& test = GetParam();
+  const String string = test.ToString();
+  if (string.Is8Bit()) {
+    return;  // This test is only for UTF16.
+  }
+  const CodePointIterator::Utf16 begin{string.Span16()};
+  const auto end = begin.EndForThis();
+  wtf_size_t offset = 0;
+  for (auto iter = begin; iter != end;) {
+    const UChar32 ch = *iter;
+    ++iter;
+    offset += ch <= 0xFFFF ? 1 : 2;
+    EXPECT_EQ(offset, iter.DistanceByCodeUnits(begin));
+  }
+}
+
 TEST(CodePointIteratorTest, Equality) {
   StringView str1{"foo"};
   EXPECT_EQ(str1.begin(), str1.begin());
diff --git a/third_party/blink/renderer/platform/wtf/text/utf8.cc b/third_party/blink/renderer/platform/wtf/text/utf8.cc
index 2354b96..752ed90 100644
--- a/third_party/blink/renderer/platform/wtf/text/utf8.cc
+++ b/third_party/blink/renderer/platform/wtf/text/utf8.cc
@@ -34,7 +34,6 @@
 #include <unicode/utf16.h>
 
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "third_party/blink/renderer/platform/wtf/text/ascii_ctype.h"
 #include "third_party/blink/renderer/platform/wtf/text/character_names.h"
@@ -166,11 +165,9 @@
     } else if (ch < (UChar32)0x110000) {
       bytes_to_write = 4;
     } else {
-      // TODO(crbug.com/329702346): Surrogate pairs cannot represent codepoints
-      // higher than 0x10FFFF, so this should not be reachable.
-      NOTREACHED(base::NotFatalUntil::M134);
-      bytes_to_write = 3;
-      ch = kReplacementCharacter;
+      // Surrogate pairs cannot represent codepoints higher than 0x10FFFF, so
+      // this should not be reachable.
+      NOTREACHED();
     }
 
     target += bytes_to_write;
@@ -348,17 +345,10 @@
       *target++ = U16_LEAD(character);
       *target++ = U16_TRAIL(character);
     } else {
-      // TODO(crbug.com/329702346): This should never happen;
-      // InlineUTF8SequenceLength() can never return a value higher than 4, and
-      // a 4-byte UTF-8 sequence can never encode anything higher than 0x10FFFF.
-      NOTREACHED(base::NotFatalUntil::M134);
-      if (strict) {
-        source -= utf8_sequence_length;  // return to the start
-        status = kSourceIllegal;
-        break;  // Bail out; shouldn't continue
-      } else {
-        *target++ = kReplacementCharacter;
-      }
+      // This should never happen; InlineUTF8SequenceLength() can never return
+      // a value higher than 4, and a 4-byte UTF-8 sequence can never encode
+      // anything higher than 0x10FFFF.
+      NOTREACHED();
     }
   }
   *source_start = source;
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index b6c7737..bbb533b 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -6122,9 +6122,6 @@
 crbug.com/1339051 [ Linux ] virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces.html [ Failure ]
 
 
-# Temporarily disable test to land https://crrev.com/c/5046564
-crbug.com/40267668 http/tests/devtools/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe.js [ Failure Pass Timeout ]
-
 # Skip devtools test hitting an unexpected tracing infrastructure exception 2021-10-04
 crbug.com/40795056 http/tests/devtools/service-workers/service-workers-wasm-test.js [ Failure Pass Timeout ]
 
@@ -6235,7 +6232,6 @@
 
 # Sheriff 2022-01-17
 crbug.com/1233938 http/tests/notifications/click-shared-worker.html [ Pass Timeout ]
-crbug.com/40135418 [ Win ] http/tests/devtools/overrides/project-added-with-existing-files-bind.js [ Failure Timeout ]
 crbug.com/1256763 virtual/gpu-rasterization/images/color-profile-background-image-cover.html [ Failure Pass ]
 
 # Sheriff 2022-01-18
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window-expected.txt
new file mode 100644
index 0000000..5940c02
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window-expected.txt
@@ -0,0 +1,26 @@
+This is a testharness.js-based test.
+Found 11 FAIL, 0 TIMEOUT, 0 NOTRUN.
+[FAIL] https-private to http-local: success.
+  assert_equals: error expected (undefined) undefined but got (string) "TypeError: Failed to fetch"
+[FAIL] https-private to http-local: PUT success.
+  assert_equals: error expected (undefined) undefined but got (string) "TypeError: Failed to fetch"
+[FAIL] https-private to http-local: no-cors success.
+  assert_equals: error expected (undefined) undefined but got (string) "TypeError: Failed to fetch"
+[FAIL] https-public to http-local: success.
+  assert_equals: error expected (undefined) undefined but got (string) "TypeError: Failed to fetch"
+[FAIL] https-public to http-local: PUT success.
+  assert_equals: error expected (undefined) undefined but got (string) "TypeError: Failed to fetch"
+[FAIL] https-public to http-local: no-cors success.
+  assert_equals: error expected (undefined) undefined but got (string) "TypeError: Failed to fetch"
+[FAIL] https-public to http-private: success.
+  assert_equals: error expected (undefined) undefined but got (string) "TypeError: Failed to fetch"
+[FAIL] https-public to http-private: PUT success.
+  assert_equals: error expected (undefined) undefined but got (string) "TypeError: Failed to fetch"
+[FAIL] https-public to http-private: no-cors success.
+  assert_equals: error expected (undefined) undefined but got (string) "TypeError: Failed to fetch"
+[FAIL] https-treat-as-public to http-local: success.
+  assert_equals: error expected (undefined) undefined but got (string) "TypeError: Failed to fetch"
+[FAIL] https-treat-as-public to http-private: success.
+  assert_equals: error expected (undefined) undefined but got (string) "TypeError: Failed to fetch"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.js b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.js
new file mode 100644
index 0000000..dbae519
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.js
@@ -0,0 +1,278 @@
+// META: script=/common/utils.js
+// META: script=resources/support.sub.js
+// META: timeout=long
+//
+// Spec: https://wicg.github.io/private-network-access
+//
+// These tests verify that secure contexts can fetch non-secure subresources
+// from more private address spaces, avoiding mixed context checks, as long as
+// they specify a valid `targetAddressSpace` fetch option that matches the
+// target server's address space.
+
+setup(() => {
+  // Making sure we are in a secure context, as expected.
+  assert_true(window.isSecureContext);
+});
+
+// Given `addressSpace`, returns the other three possible IP address spaces.
+function otherAddressSpaces(addressSpace) {
+  switch (addressSpace) {
+    case "local": return ["unknown", "private", "public"];
+    case "private": return ["unknown", "local", "public"];
+    case "public": return ["unknown", "local", "private"];
+  }
+}
+
+// Generates tests of `targetAddressSpace` for the given (source, target)
+// address space pair, expecting fetches to succeed iff `targetAddressSpace` is
+// correct.
+//
+// Scenarios exercised:
+//
+//  - cors mode:
+//    - missing targetAddressSpace option
+//    - incorrect targetAddressSpace option (x3, see `otherAddressSpaces()`)
+//    - failed preflight
+//    - success
+//    - success with PUT method (non-"simple" request)
+//  - no-cors mode:
+//    - success
+//
+function makeTests({ source, target }) {
+  const sourceServer = Server.get("https", source);
+  const targetServer = Server.get("http", target);
+
+  const makeTest = ({
+    fetchOptions,
+    targetBehavior,
+    name,
+    expected
+  }) => {
+    promise_test_parallel(t => fetchTest(t, {
+      source: { server: sourceServer },
+      target: {
+        server: targetServer,
+        behavior: targetBehavior,
+      },
+      fetchOptions,
+      expected,
+    }), `${sourceServer.name} to ${targetServer.name}: ${name}.`);
+  };
+
+  makeTest({
+    name: "missing targetAddressSpace",
+    targetBehavior: {
+      preflight: PreflightBehavior.success(token()),
+      response: ResponseBehavior.allowCrossOrigin(),
+    },
+    expected: FetchTestResult.FAILURE,
+  });
+
+  const correctAddressSpace = targetServer.addressSpace;
+
+  for (const targetAddressSpace of otherAddressSpaces(correctAddressSpace)) {
+    makeTest({
+      name: `wrong targetAddressSpace "${targetAddressSpace}"`,
+      targetBehavior: {
+        preflight: PreflightBehavior.success(token()),
+        response: ResponseBehavior.allowCrossOrigin(),
+      },
+      fetchOptions: { targetAddressSpace },
+      expected: FetchTestResult.FAILURE,
+    });
+  }
+
+  makeTest({
+    name: "failed preflight",
+    targetBehavior: {
+      preflight: PreflightBehavior.failure(),
+      response: ResponseBehavior.allowCrossOrigin(),
+    },
+    fetchOptions: { targetAddressSpace: correctAddressSpace },
+    expected: FetchTestResult.FAILURE,
+  });
+
+  makeTest({
+    name: "success",
+    targetBehavior: {
+      preflight: PreflightBehavior.success(token()),
+      response: ResponseBehavior.allowCrossOrigin(),
+    },
+    fetchOptions: { targetAddressSpace: correctAddressSpace },
+    expected: FetchTestResult.SUCCESS,
+  });
+
+  makeTest({
+    name: "PUT success",
+    targetBehavior: {
+      preflight: PreflightBehavior.success(token()),
+      response: ResponseBehavior.allowCrossOrigin(),
+    },
+    fetchOptions: {
+      targetAddressSpace: correctAddressSpace,
+      method: "PUT",
+    },
+    expected: FetchTestResult.SUCCESS,
+  });
+
+  makeTest({
+    name: "no-cors success",
+    targetBehavior: {
+      preflight: PreflightBehavior.success(token()),
+      response: ResponseBehavior.allowCrossOrigin(),
+    },
+    fetchOptions: {
+      targetAddressSpace: correctAddressSpace,
+      mode: "no-cors",
+    },
+    expected: FetchTestResult.OPAQUE,
+  });
+}
+
+// Generates tests for the given (source, target) address space pair expecting
+// that `targetAddressSpace` cannot be used to bypass mixed content.
+//
+// Scenarios exercised:
+//
+// - wrong `targetAddressSpace` (x3, see `otherAddressSpaces()`)
+// - correct `targetAddressSpace`
+//
+function makeNoBypassTests({ source, target }) {
+  const sourceServer = Server.get("https", source);
+  const targetServer = Server.get("http", target);
+
+  const prefix = `${sourceServer.name} to ${targetServer.name}: `;
+
+  const correctAddressSpace = targetServer.addressSpace;
+  for (const targetAddressSpace of otherAddressSpaces(correctAddressSpace)) {
+    promise_test_parallel(t => fetchTest(t, {
+      source: { server: sourceServer },
+      target: {
+        server: targetServer,
+        behavior: {
+          preflight: PreflightBehavior.success(token()),
+          response: ResponseBehavior.allowCrossOrigin(),
+        },
+      },
+      fetchOptions: { targetAddressSpace },
+      expected: FetchTestResult.FAILURE,
+    }), prefix + `wrong targetAddressSpace "${targetAddressSpace}".`);
+  }
+
+  promise_test_parallel(t => fetchTest(t, {
+    source: { server: sourceServer },
+    target: {
+      server: targetServer,
+      behavior: {
+        preflight: PreflightBehavior.success(token()),
+        response: ResponseBehavior.allowCrossOrigin(),
+      },
+    },
+    fetchOptions: { targetAddressSpace: correctAddressSpace },
+    expected: FetchTestResult.FAILURE,
+  }), prefix + 'not a private network request.');
+}
+
+// Source: local secure context.
+//
+// Fetches to the local and private address spaces cannot use
+// `targetAddressSpace` to bypass mixed content, as they are not otherwise
+// blocked by Private Network Access.
+
+makeNoBypassTests({ source: "local", target: "local" });
+makeNoBypassTests({ source: "local", target: "private" });
+makeNoBypassTests({ source: "local", target: "public" });
+
+// Source: private secure context.
+//
+// Fetches to the local address space requires the right `targetAddressSpace`
+// option, as well as a successful preflight response carrying a PNA-specific
+// header.
+//
+// Fetches to the private address space cannot use `targetAddressSpace` to
+// bypass mixed content, as they are not otherwise blocked by Private Network
+// Access.
+
+makeTests({ source: "private", target: "local" });
+
+makeNoBypassTests({ source: "private", target: "private" });
+makeNoBypassTests({ source: "private", target: "public" });
+
+// Source: public secure context.
+//
+// Fetches to the local and private address spaces require the right
+// `targetAddressSpace` option, as well as a successful preflight response
+// carrying a PNA-specific header.
+
+makeTests({ source: "public", target: "local" });
+makeTests({ source: "public", target: "private" });
+
+makeNoBypassTests({ source: "public", target: "public" });
+
+// These tests verify that documents fetched from the `local` address space yet
+// carrying the `treat-as-public-address` CSP directive are treated as if they
+// had been fetched from the `public` address space.
+
+promise_test_parallel(t => fetchTest(t, {
+  source: {
+    server: Server.HTTPS_LOCAL,
+    treatAsPublic: true,
+  },
+  target: {
+    server: Server.HTTP_LOCAL,
+    behavior: {
+      preflight: PreflightBehavior.optionalSuccess(token()),
+      response: ResponseBehavior.allowCrossOrigin(),
+    },
+  },
+  fetchOptions: { targetAddressSpace: "private" },
+  expected: FetchTestResult.FAILURE,
+}), 'https-treat-as-public to http-local: wrong targetAddressSpace "private".');
+
+promise_test_parallel(t => fetchTest(t, {
+  source: {
+    server: Server.HTTPS_LOCAL,
+    treatAsPublic: true,
+  },
+  target: {
+    server: Server.HTTP_LOCAL,
+    behavior: {
+      preflight: PreflightBehavior.optionalSuccess(token()),
+      response: ResponseBehavior.allowCrossOrigin(),
+    },
+  },
+  fetchOptions: { targetAddressSpace: "local" },
+  expected: FetchTestResult.SUCCESS,
+}), "https-treat-as-public to http-local: success.");
+
+promise_test_parallel(t => fetchTest(t, {
+  source: {
+    server: Server.HTTPS_LOCAL,
+    treatAsPublic: true,
+  },
+  target: {
+    server: Server.HTTP_PRIVATE,
+    behavior: {
+      preflight: PreflightBehavior.success(token()),
+      response: ResponseBehavior.allowCrossOrigin(),
+    },
+  },
+  fetchOptions: { targetAddressSpace: "local" },
+  expected: FetchTestResult.FAILURE,
+}), 'https-treat-as-public to http-private: wrong targetAddressSpace "local".');
+
+promise_test_parallel(t => fetchTest(t, {
+  source: {
+    server: Server.HTTPS_LOCAL,
+    treatAsPublic: true,
+  },
+  target: {
+    server: Server.HTTP_PRIVATE,
+    behavior: {
+      preflight: PreflightBehavior.success(token()),
+      response: ResponseBehavior.allowCrossOrigin(),
+    },
+  },
+  fetchOptions: { targetAddressSpace: "private" },
+  expected: FetchTestResult.SUCCESS,
+}), "https-treat-as-public to http-private: success.");
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/no-prefetch-for-post.https.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/no-prefetch-for-post.https.html
new file mode 100644
index 0000000..7739f4f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/no-prefetch-for-post.https.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/utils.js"></script>
+<script src="../resources/utils.js"></script>
+<script src="resources/utils.sub.js"></script>
+<script>
+  setup(() => assertSpeculationRulesIsSupported());
+
+  promise_test(async t => {
+    let agent = await spawnWindow(t);
+    let nextUrl = agent.getExecutorURL({ executor: 'post-navigation-handler.py', protocol: 'https', page: 2 });
+    await agent.forceSinglePrefetch(nextUrl);
+
+  await agent.execute_script(async (nextUrl) => {
+    window.executor.suspend(() => {
+        navigate_by_form_generated_post(nextUrl);
+    });
+  }, [nextUrl]);
+
+    assert_not_prefetched(await agent.getRequestHeaders());
+  }, "post navigations should not use cached prefetch");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/resources/executor.sub.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/resources/executor.sub.html
index bb2d58d..b89c45e 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/resources/executor.sub.html
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/resources/executor.sub.html
@@ -82,6 +82,13 @@
   await new test_driver.Actions().addPointer("mouse").pointerMove(0, 0, {origin: target}).pointerDown().pointerMove(0, 0).pointerUp().send();
 }
 
+async function navigate_by_form_generated_post(url) {
+  let form = document.createElement('form');
+  form.method = 'POST';
+  form.action = url;
+  document.body.appendChild(form);
+  form.submit();
+}
 
 // The fetch request's URL sent to the server.
 window.requestUrl = reverse_html_escape(
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/resources/post-navigation-handler.py b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/resources/post-navigation-handler.py
new file mode 100644
index 0000000..1749517
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/resources/post-navigation-handler.py
@@ -0,0 +1,10 @@
+import os
+from wptserve.pipes import template
+
+# This is used only to accept POST navigations.
+def main(request, response):
+    response.headers.set(b"Content-Type", b"text/html")
+    response.headers.set(b"Cache-Control", b"no-store")
+    response.content = template(
+    request,
+    open(os.path.join(os.path.dirname(__file__), "executor.sub.html"), "rb").read())
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/urlpattern/resources/urlpattern-generate-test-data.json b/third_party/blink/web_tests/external/wpt/urlpattern/resources/urlpattern-generate-test-data.json
new file mode 100644
index 0000000..c118f0a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/urlpattern/resources/urlpattern-generate-test-data.json
@@ -0,0 +1,116 @@
+[
+  {
+    "pattern": { "pathname": "/foo" },
+    "component": "invalid",
+    "groups": {},
+    "expected": null
+  },
+  {
+    "pattern": { "pathname": "/foo" },
+    "component": "pathname",
+    "groups": {},
+    "expected": "/foo"
+  },
+  {
+    "pattern": { "pathname": "/:foo" },
+    "component": "pathname",
+    "groups": { "foo": "bar" },
+    "expected": "/bar"
+  },
+  {
+    "pattern": { "pathname": "/:foo" },
+    "component": "pathname",
+    "groups": { "foo": "🍅" },
+    "expected": "/%F0%9F%8D%85"
+  },
+  {
+    "pattern": { "hostname": "{:foo}.example.com" },
+    "component": "hostname",
+    "groups": { "foo": "🍅" },
+    "expected": "xn--fi8h.example.com"
+  },
+  {
+    "pattern": { "pathname": "/:foo" },
+    "component": "pathname",
+    "groups": {},
+    "expected": null
+  },
+  {
+    "pattern": { "pathname": "/foo/:bar" },
+    "component": "pathname",
+    "groups": { "bar": "baz" },
+    "expected": "/foo/baz"
+  },
+  {
+    "pattern": { "pathname": "/foo:bar" },
+    "component": "pathname",
+    "groups": { "bar": "baz" },
+    "expected": "/foobaz"
+  },
+  {
+    "pattern": { "pathname": "/:foo/:bar" },
+    "component": "pathname",
+    "groups": { "foo": "baz", "bar": "qux" },
+    "expected": "/baz/qux"
+  },
+  {
+    "pattern": "https://example.com/:foo",
+    "component": "pathname",
+    "groups": { "foo": " " },
+    "expected": "/%20"
+  },
+  {
+    "pattern": "original-scheme://example.com/:foo",
+    "component": "pathname",
+    "groups": { "foo": " " },
+    "expected": "/ "
+  },
+  {
+    "pattern": { "pathname": "/:foo" },
+    "component": "pathname",
+    "groups": { "foo": "bar/baz" },
+    "expected": null
+  },
+  {
+    "pattern": { "pathname": "*" },
+    "component": "pathname",
+    "groups": {},
+    "expected": null
+  },
+  {
+    "pattern": { "pathname": "/{foo}+" },
+    "component": "pathname",
+    "groups": {},
+    "expected": null
+  },
+  {
+    "pattern": { "pathname": "/{foo}?" },
+    "component": "pathname",
+    "groups": {},
+    "expected": null
+  },
+  {
+    "pattern": { "pathname": "/{foo}*" },
+    "component": "pathname",
+    "groups": {},
+    "expected": null
+  },
+  {
+    "pattern": { "pathname": "/(regexp)" },
+    "component": "pathname",
+    "groups": {},
+    "expected": null
+  },
+  {
+    "pattern": { "pathname": "/([^\\/]+?)" },
+    "component": "pathname",
+    "groups": {},
+    "expected": null
+  },
+  {
+    "pattern": { "port": "([^\\:]+?)" },
+    "component": "port",
+    "groups": {},
+    "expected": null
+  }
+]
diff --git a/third_party/blink/web_tests/external/wpt/urlpattern/urlpattern-generate.tentative.any.js b/third_party/blink/web_tests/external/wpt/urlpattern/urlpattern-generate.tentative.any.js
new file mode 100644
index 0000000..1f6962942
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/urlpattern/urlpattern-generate.tentative.any.js
@@ -0,0 +1,26 @@
+// META: global=window,worker
+
+function runTests(data) {
+  for (let entry of data) {
+    test(function () {
+      const pattern = new URLPattern(entry.pattern);
+
+      if (entry.expected === null) {
+        assert_throws_js(TypeError, _ => pattern.generate(entry.component, entry.groups),
+                         'generate() should fail with TypeError');
+        return;
+      }
+
+      const result = pattern.generate(entry.component, entry.groups);
+      assert_equals(result, entry.expected);
+    }, `Pattern: ${JSON.stringify(entry.pattern)} ` +
+    `Component: ${entry.component} ` +
+    `Groups: ${JSON.stringify(entry.groups)}`);
+  }
+}
+
+promise_test(async function () {
+  const response = await fetch('resources/urlpattern-generate-test-data.json');
+  const data = await response.json();
+  runTests(data);
+}, 'Loading data...');
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCConfiguration-iceServers-expected.txt b/third_party/blink/web_tests/external/wpt/webrtc/RTCConfiguration-iceServers-expected.txt
index 92a7672..be4b1ea 100644
--- a/third_party/blink/web_tests/external/wpt/webrtc/RTCConfiguration-iceServers-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCConfiguration-iceServers-expected.txt
@@ -3,10 +3,10 @@
 [FAIL] new RTCPeerConnection(config) - with turns server and empty string username, credential should succeed
   Failed to construct 'RTCPeerConnection': ICE server parsing failed: TURN server with empty username or password
 [FAIL] setConfiguration(config) - with turns server and empty string username, credential should succeed
-  Failed to execute 'setConfiguration' on 'RTCPeerConnection': Could not update the PeerConnection with the given configuration.
+  Failed to execute 'setConfiguration' on 'RTCPeerConnection': The given configuration has invalid parameters.
 [FAIL] new RTCPeerConnection(config) - with turn server and empty string username, credential should succeed
   Failed to construct 'RTCPeerConnection': ICE server parsing failed: TURN server with empty username or password
 [FAIL] setConfiguration(config) - with turn server and empty string username, credential should succeed
-  Failed to execute 'setConfiguration' on 'RTCPeerConnection': Could not update the PeerConnection with the given configuration.
+  Failed to execute 'setConfiguration' on 'RTCPeerConnection': The given configuration has invalid parameters.
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCConfiguration-iceServers.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCConfiguration-iceServers.html
index bc78313..65a6015 100644
--- a/third_party/blink/web_tests/external/wpt/webrtc/RTCConfiguration-iceServers.html
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCConfiguration-iceServers.html
@@ -34,11 +34,14 @@
                  DOMString                          credential;
       };
    */
+  // RFC 8489 limits the length of the TURN username to 509 bytes:
+  // https://datatracker.ietf.org/doc/html/rfc8489#section-14.3
+  const kUsernameOfMaxPermittedLength = 'a'.repeat(509);
 
   test(() => {
     const pc = new RTCPeerConnection();
     assert_array_equals(pc.getConfiguration().iceServers, []);
-  }, 'new RTCPeerConnection() should have default configuration.iceServers of undefined');
+  }, 'new RTCPeerConnection() should have default configuration.iceServers of []');
 
   config_test(makePc => {
     makePc({});
@@ -181,6 +184,15 @@
 
   }, `with one turns server, one turn server, username, credential should succeed`);
 
+  config_test(makePc => {
+    assert_equals(kUsernameOfMaxPermittedLength.length, 509);
+    const pc = makePc({ iceServers: [{
+      urls: 'turn:turn.example.net',
+      username: kUsernameOfMaxPermittedLength,
+      credential: 'cred'
+    }] });
+  }, `with a turn server and a username of 509 characters should succeed`);
+
   /*
     4.3.2.  To set a configuration
       11.4. If scheme name is turn or turns, and either of server.username or
@@ -232,6 +244,16 @@
       }] }));
   }, 'with turns server and only credential should throw InvalidAccessError');
 
+  config_test(makePc => {
+    assert_equals(kUsernameOfMaxPermittedLength.length, 509);
+    assert_throws_dom('InvalidAccessError', () =>
+      makePc({ iceServers: [{
+        urls: 'turns:turn.example.net',
+        username: kUsernameOfMaxPermittedLength + 'a',
+        credential: 'cred'
+      }] }));
+  }, `with a turn server and a username of 510 characters throw InvalidAccessError`);
+
   /*
     4.3.2.  To set a configuration
       11.3. For each url in server.urls parse url and obtain scheme name.
@@ -284,6 +306,8 @@
     assert_throws_dom("SyntaxError", () =>
       makePc({ iceServers: [{
         urls: 'turn://example.org/foo?x=y'
+        // `username` and `credential` are not passed because the invalid url
+        // should be rejected before the check for those arguments.
       }] }));
   }, 'with invalid turn url should throw SyntaxError');
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/overrides/project-added-with-existing-files-bind.js b/third_party/blink/web_tests/http/tests/devtools/overrides/project-added-with-existing-files-bind.js
index 79bc8e6..f815ed46 100644
--- a/third_party/blink/web_tests/http/tests/devtools/overrides/project-added-with-existing-files-bind.js
+++ b/third_party/blink/web_tests/http/tests/devtools/overrides/project-added-with-existing-files-bind.js
@@ -5,6 +5,7 @@
 import {TestRunner} from 'test_runner';
 import {BindingsTestRunner} from 'bindings_test_runner';
 
+import * as Host from 'devtools/core/host/host.js';
 import * as Persistence from 'devtools/models/persistence/persistence.js';
 
 (async function() {
@@ -15,13 +16,14 @@
   Persistence.Persistence.PersistenceImpl.instance().addEventListener(Persistence.Persistence.Events.BindingCreated, event => {
     const binding = event.data;
     TestRunner.addResult('Bound Files:');
-    TestRunner.addResult(binding.network.url() + ' <=> ' + binding.fileSystem.url());
+    TestRunner.addResult(binding.network.url() + ' <=> ' + binding.fileSystem.url().replace('%253A', ':'));  // Unify test output across platforms.
     TestRunner.addResult('');
     TestRunner.completeTest();
   });
 
   const { testFileSystem } = await BindingsTestRunner.createOverrideProject('file:///tmp');
-  testFileSystem.addFile('127.0.0.1:8000/devtools/network/resources/empty.html', 'New Content');
+  const baseDirectory = Host.Platform.isWin() ? '127.0.0.1%3A8000' : '127.0.0.1:8000';
+  testFileSystem.addFile(`${baseDirectory}/devtools/network/resources/empty.html`, 'New Content');
 
   BindingsTestRunner.setOverridesEnabled(true);
 })();
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 543484e..1c933a34 100644
--- a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -2093,6 +2093,7 @@
     getter username
     method constructor
     method exec
+    method generate
     method test
 interface URLSearchParams
     attribute @@toStringTag
diff --git a/third_party/blink/web_tests/http/tests/shadowrealm/webexposed/global-interface-listing-shadow-realm-expected.txt b/third_party/blink/web_tests/http/tests/shadowrealm/webexposed/global-interface-listing-shadow-realm-expected.txt
index 16cddb1..9e4c294 100644
--- a/third_party/blink/web_tests/http/tests/shadowrealm/webexposed/global-interface-listing-shadow-realm-expected.txt
+++ b/third_party/blink/web_tests/http/tests/shadowrealm/webexposed/global-interface-listing-shadow-realm-expected.txt
@@ -317,6 +317,7 @@
 CONSOLE MESSAGE:     getter username
 CONSOLE MESSAGE:     method constructor
 CONSOLE MESSAGE:     method exec
+CONSOLE MESSAGE:     method generate
 CONSOLE MESSAGE:     method test
 CONSOLE MESSAGE: interface URLSearchParams
 CONSOLE MESSAGE:     attribute @@toStringTag
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index f72219e..50be79c 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -2295,6 +2295,7 @@
 [Worker]     getter username
 [Worker]     method constructor
 [Worker]     method exec
+[Worker]     method generate
 [Worker]     method test
 [Worker] interface URLSearchParams
 [Worker]     attribute @@toStringTag
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index b739dbf..8bbd1956 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -10316,6 +10316,7 @@
     getter username
     method constructor
     method exec
+    method generate
     method test
 interface URLSearchParams
     attribute @@toStringTag
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
index 8203e086..04a0291 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -1997,6 +1997,7 @@
 [Worker]     getter username
 [Worker]     method constructor
 [Worker]     method exec
+[Worker]     method generate
 [Worker]     method test
 [Worker] interface URLSearchParams
 [Worker]     attribute @@toStringTag
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index acd68d2..79796ba 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit acd68d2f092a2e674894c9d389c96e39beec1aa2
+Subproject commit 79796ba22a06d1b7980b2a2ae98e69123628f80f
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index 705f487..fb3fcd24 100644
--- a/third_party/freetype/README.chromium
+++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType
 URL: http://www.freetype.org/
-Version: VER-2-13-3-230-ge07e56c7f
-Revision: e07e56c7f106b600262ab653d696b7b57f320127
+Version: VER-2-13-3-235-gf64c7db2f
+Revision: f64c7db2fee3f5304df1cd722df72699736118f3
 CPEPrefix: cpe:/a:freetype:freetype:2.13.3
 License: FTL
 License File: src/docs/FTL.TXT
diff --git a/third_party/freetype/src b/third_party/freetype/src
index e07e56c..f64c7db 160000
--- a/third_party/freetype/src
+++ b/third_party/freetype/src
@@ -1 +1 @@
-Subproject commit e07e56c7f106b600262ab653d696b7b57f320127
+Subproject commit f64c7db2fee3f5304df1cd722df72699736118f3
diff --git a/third_party/glslang/src b/third_party/glslang/src
index 9323100..be4ee7d 160000
--- a/third_party/glslang/src
+++ b/third_party/glslang/src
@@ -1 +1 @@
-Subproject commit 93231001597dad1149a5d035af30eda50b9e6b6c
+Subproject commit be4ee7d0e3bfd151bfda7b3a8e03f8c49c55ed7b
diff --git a/third_party/pthreadpool/chromium/jobs.cc b/third_party/pthreadpool/chromium/jobs.cc
index 3074b72..6fe6611 100644
--- a/third_party/pthreadpool/chromium/jobs.cc
+++ b/third_party/pthreadpool/chromium/jobs.cc
@@ -16,9 +16,17 @@
 // one). To resolve this, use the types/functions from the C++ header only and
 // block inclusion of the C header by defining its include guard. See
 // crbug.com/391750836.
+// This solution does not work with clang modules, as header guards are unused.
+// However, if we never attempt to include atomic in the first place, modules
+// correctly seperate them.
+// Note that we can't use #if !defined(__cpp_module) due to it not actually
+// being defined - see https://github.com/llvm/llvm-project/issues/71364 and
+// https://github.com/llvm/llvm-project/blob/b251c29af45d3440374f53bb4c1645e5968593f7/clang/lib/Frontend/InitPreprocessor.cpp#L747
+#ifndef USE_LIBCXX_MODULES
 #include <atomic>
 #define _LIBCPP_STDATOMIC_H
 using namespace std;
+#endif
 
 // Configuration header.
 #include "threadpool-common.h"
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index 5912cbd..d18d20e 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit 5912cbdd295c2bacb5798432a7b1cac9d20c0725
+Subproject commit d18d20e2f8cd216f11c565524791b0093d9082fa
diff --git a/third_party/vulkan-validation-layers/src b/third_party/vulkan-validation-layers/src
index f7ceb1d0..b75f27bc 160000
--- a/third_party/vulkan-validation-layers/src
+++ b/third_party/vulkan-validation-layers/src
@@ -1 +1 @@
-Subproject commit f7ceb1d01a292846db77ec87786be84d6fd568d9
+Subproject commit b75f27bc902ea48c1758d958222c742ecccf3aa2
diff --git a/third_party/webrtc b/third_party/webrtc
index 9909b30..e4445e4 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit 9909b30d5e3c104d4dce7d066fc8422eef1dcc59
+Subproject commit e4445e46a910eb407571ec0b0b8b7043562678cf
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 7a9d74e..f9ef8d9 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -9502,6 +9502,7 @@
   <int value="-1654344175" label="disable-extension-info-dialog"/>
   <int value="-1653991213" label="CrossOriginIsolated:disabled"/>
   <int value="-1653838003" label="PauseBackgroundTabs:enabled"/>
+  <int value="-1652906854" label="DsePreload2OnPress:disabled"/>
   <int value="-1652173255"
       label="OmniboxUIExperimentShowPlaceholderWhenCaretShowing:enabled"/>
   <int value="-1651341724"
@@ -11957,6 +11958,7 @@
       label="notification-scheduler-immediate-background-task"/>
   <int value="-733934949" label="SystemTransliterationPhysicalTyping:disabled"/>
   <int value="-733616934" label="ReduceUserAgentMinorVersion:enabled"/>
+  <int value="-733289110" label="DsePreload2OnPress:enabled"/>
   <int value="-733210914"
       label="AutofillEnableMerchantBoundVirtualCards:disabled"/>
   <int value="-733155387"
@@ -13821,6 +13823,7 @@
       label="EnablePasswordsAccountStorageForNonSyncingUsers:enabled"/>
   <int value="-27287076" label="DesktopPWAsTabStripSettings:disabled"/>
   <int value="-27213807" label="GlobalMediaControls:enabled"/>
+  <int value="-26261014" label="DsePreload2:enabled"/>
   <int value="-25726674" label="CompressionDictionaryTransport:enabled"/>
   <int value="-25537346" label="WebAuthenticationScreenReaderMode:disabled"/>
   <int value="-25303818" label="CCTResizableSideSheetForThirdParties:disabled"/>
@@ -17620,6 +17623,7 @@
   <int value="1406354320" label="MacViewsWebUIDialogs:enabled"/>
   <int value="1406806825"
       label="OmniboxFocusTriggersWebAndSRPZeroSuggest:enabled"/>
+  <int value="1407061319" label="DsePreload2:disabled"/>
   <int value="1407248208" label="LocationProviderManager:enabled"/>
   <int value="1407616323" label="OfflineIndicatorAlwaysHttpProbe:disabled"/>
   <int value="1407625309"
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml
index f9f7b40..44a528fa 100644
--- a/tools/metrics/histograms/metadata/autofill/histograms.xml
+++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -1286,7 +1286,7 @@
 
 <histogram
     name="Autofill.Autocomplete.NotOff.EditedAutofilledFieldAtSubmission2{AutofillFormType}"
-    enum="AutofilledFieldUserEditingStatus" expires_after="2025-10-12">
+    enum="AutofilledFieldUserEditingStatus" expires_after="2025-12-08">
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -1300,7 +1300,7 @@
 </histogram>
 
 <histogram name="Autofill.Autocomplete.NotOff.FillingAcceptance.{FormType}"
-    enum="BooleanAutofillFillingAcceptance" expires_after="2025-11-09">
+    enum="BooleanAutofillFillingAcceptance" expires_after="2025-12-08">
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -1315,7 +1315,7 @@
 
 <histogram
     name="Autofill.Autocomplete.Off.EditedAutofilledFieldAtSubmission2{AutofillFormType}"
-    enum="AutofilledFieldUserEditingStatus" expires_after="2025-06-08">
+    enum="AutofilledFieldUserEditingStatus" expires_after="2025-12-08">
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -1329,7 +1329,7 @@
 </histogram>
 
 <histogram name="Autofill.Autocomplete.Off.FillingAcceptance.{FormType}"
-    enum="BooleanAutofillFillingAcceptance" expires_after="2025-10-12">
+    enum="BooleanAutofillFillingAcceptance" expires_after="2025-12-08">
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/blink/enums.xml b/tools/metrics/histograms/metadata/blink/enums.xml
index 81f2273f..4602b20 100644
--- a/tools/metrics/histograms/metadata/blink/enums.xml
+++ b/tools/metrics/histograms/metadata/blink/enums.xml
@@ -6220,7 +6220,7 @@
   <int value="5589" label="ClipboardChangeEventTypesAttribute"/>
   <int value="5590" label="SchedulerYieldNonTrivialInherit"/>
   <int value="5591" label="SchedulerYieldNonTrivialInheritCrossFrameIgnored"/>
-  <int value="5592" label="LocalNetworkAccessPrivateAliasUse"/>
+  <int value="5593" label="V8URLPattern_Generate_Method"/>
 </enum>
 
 <!-- LINT.ThenChange(//third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom:WebFeature) -->
diff --git a/tools/metrics/histograms/metadata/magic_stack/enums.xml b/tools/metrics/histograms/metadata/magic_stack/enums.xml
index cd9f02c..faf129a 100644
--- a/tools/metrics/histograms/metadata/magic_stack/enums.xml
+++ b/tools/metrics/histograms/metadata/magic_stack/enums.xml
@@ -25,51 +25,6 @@
 
 <enums>
 
-<enum name="MagicStack.Clank.TabResumption.ClickInfo">
-  <int value="0"
-      label="Clicked on foreign first tile of config foreign (single tile)"/>
-  <int value="1"
-      label="Clicked on foreign first tile of config foreign+foreign (double
-             tiles)"/>
-  <int value="2"
-      label="Clicked on foreign second tile of config foreign+foreign (double
-             tiles)"/>
-  <int value="3"
-      label="Clicked on local first tile of config local (single tile)"/>
-  <int value="4"
-      label="Clicked on local first tile of config local+foreign (double
-             tiles)"/>
-  <int value="5"
-      label="Clicked on foreign second tile of config local+foreign (double
-             tiles)"/>
-  <int value="6"
-      label="Clicked on history tile of config history (single tile)"/>
-  <int value="7" label="Clicked on a foreign tile of config double tiles"/>
-  <int value="8" label="Clicked on a local tile of config double tiles"/>
-  <int value="9" label="Clicked on a history tile of config double tiles"/>
-</enum>
-
-<enum name="MagicStack.Clank.TabResumption.ModuleNotShownReason">
-  <int value="0" label="No suggestions"/>
-  <int value="1" label="Feature flag disabled"/>
-  <int value="2" label="User not sign in"/>
-  <int value="3" label="User disabled sync"/>
-</enum>
-
-<enum name="MagicStack.Clank.TabResumption.ModuleShowConfig">
-  <int value="0" label="Showing config foreign (single tile)"/>
-  <int value="1" label="Showing config foreign+foreign (double tiles)"/>
-  <int value="2" label="Showing config local (single tile)"/>
-  <int value="3" label="Showing config local+foreign (double tiles)"/>
-  <int value="4" label="Showing config foreign+history (double tiles)"/>
-  <int value="5" label="Showing config local+local (double tiles)"/>
-  <int value="6" label="Showing config local+history (double tiles)"/>
-  <int value="7" label="Showing config history (single tile)"/>
-  <int value="8" label="Showing config history+history (double tiles)"/>
-  <int value="9" label="Showing config a single tile without type finalized"/>
-  <int value="10" label="Showing config double tiles without type finalized"/>
-</enum>
-
 <enum name="ModulePosition">
   <int value="0" label="1st module"/>
   <int value="1" label="2nd module"/>
diff --git a/tools/metrics/histograms/metadata/magic_stack/histograms.xml b/tools/metrics/histograms/metadata/magic_stack/histograms.xml
index 5251975..ad6861f 100644
--- a/tools/metrics/histograms/metadata/magic_stack/histograms.xml
+++ b/tools/metrics/histograms/metadata/magic_stack/histograms.xml
@@ -51,7 +51,7 @@
 </variants>
 
 <histogram name="MagicStack.Clank.NewTabPage.ContextMenu.OpenCustomizeSettings"
-    enum="ModuleType" expires_after="2025-07-06">
+    enum="ModuleType" expires_after="2025-11-26">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
@@ -62,7 +62,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.NewTabPage.ContextMenu.RemoveModuleV2"
-    enum="ModuleType" expires_after="2025-10-26">
+    enum="ModuleType" expires_after="2025-11-26">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
@@ -72,7 +72,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.NewTabPage.ContextMenu.ShownV2"
-    enum="ModuleType" expires_after="2025-07-13">
+    enum="ModuleType" expires_after="2025-11-26">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
@@ -82,7 +82,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.NewTabPage.Module.Click" enum="ModuleType"
-    expires_after="2025-10-26">
+    expires_after="2025-11-26">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
@@ -94,7 +94,7 @@
 
 <histogram
     name="MagicStack.Clank.NewTabPage.Module.FetchDataDurationMs.{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>
@@ -107,7 +107,7 @@
 
 <histogram
     name="MagicStack.Clank.NewTabPage.Module.FetchDataFailedDurationMs.{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>
@@ -287,7 +287,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.SingleTab.SeeMoreLinkClicked" enum="Boolean"
-    expires_after="2025-06-16">
+    expires_after="2025-11-26">
   <owner>hanxi@google.com</owner>
   <owner>huangs@google.com</owner>
   <summary>
@@ -296,100 +296,6 @@
   </summary>
 </histogram>
 
-<histogram name="MagicStack.Clank.TabResumption.ClickInfo"
-    enum="MagicStack.Clank.TabResumption.ClickInfo" expires_after="2025-06-16">
-  <owner>huangs@google.com</owner>
-  <owner>hanxi@google.com</owner>
-  <summary>
-    Records the index and the configuration of a clicked tile on the Tab
-    Resumption Module. Android-only.
-  </summary>
-</histogram>
-
-<histogram name="MagicStack.Clank.TabResumption.IsSalientImageAvailable"
-    enum="Boolean" expires_after="2025-09-07">
-  <owner>hanxi@google.com</owner>
-  <owner>huangs@google.com</owner>
-  <summary>
-    Records whether a salient image is fetched successfully. The histogram is
-    logged when a tile is shown and a image is fetched for the tile.
-    Android-only.
-  </summary>
-</histogram>
-
-<histogram name="MagicStack.Clank.TabResumption.ModuleNotShownReason"
-    enum="MagicStack.Clank.TabResumption.ModuleNotShownReason"
-    expires_after="2025-11-16">
-  <owner>huangs@google.com</owner>
-  <owner>hanxi@google.com</owner>
-  <summary>
-    Records reasons as to why the Tab Resumption Module is not initially shown.
-    This is logged when the decision is made to not show the module, which can
-    happen early (rejected by Magic Stack based on settings) or late (module is
-    enabled by settings, but stable suggestions are empty). This is not logged
-    on subsequent events that causes the module to hide, e.g., user settings
-    change. Android-only.
-  </summary>
-</histogram>
-
-<histogram name="MagicStack.Clank.TabResumption.ModuleShowConfig"
-    enum="MagicStack.Clank.TabResumption.ModuleShowConfig"
-    expires_after="2025-11-16">
-  <owner>huangs@google.com</owner>
-  <owner>hanxi@google.com</owner>
-  <summary>
-    Records the configuration of the Tab Resumption Module if it is shown,
-    encoding data sources of each tile (e.g., Local or Foreign). This is logged
-    when the module is shown with non-empty suggestions that are deemed stable.
-    Android-only.
-  </summary>
-</histogram>
-
-<histogram name="MagicStack.Clank.TabResumption.SeeMoreLinkClicked"
-    enum="MagicStack.Clank.TabResumption.ModuleShowConfig"
-    expires_after="2025-09-28">
-  <owner>hanxi@google.com</owner>
-  <owner>huangs@google.com</owner>
-  <summary>
-    Records the configuration of the Tab Resumption Module when the &quot;See
-    more&quot; link is clicked, Android-only.
-  </summary>
-</histogram>
-
-<histogram name="MagicStack.Clank.TabResumption.StabilityDelay" units="ms"
-    expires_after="2025-09-14">
-  <owner>huangs@google.com</owner>
-  <owner>hanxi@google.com</owner>
-  <summary>
-    Records the duration between when Tab Resumption Module first loads and when
-    stable results are obtained and used (to compute suggestions, which is then
-    used to render tiles if non-empty, or trigger module hide if empty). The
-    duration incorporates network delay, computation, and rendering. The metric
-    excludes the case where the module quickly renders suggestions from cached
-    data. Android-only.
-  </summary>
-</histogram>
-
-<histogram name="MagicStack.Clank.TabResumption.TabRecency.Click" units="ms"
-    expires_after="2025-09-14">
-  <owner>huangs@google.com</owner>
-  <owner>hanxi@google.com</owner>
-  <summary>
-    Records each clicked tile's recency in the Tab Resumption Module.
-    Android-only.
-  </summary>
-</histogram>
-
-<histogram name="MagicStack.Clank.TabResumption.TabRecency.Show" units="ms"
-    expires_after="2025-09-14">
-  <owner>huangs@google.com</owner>
-  <owner>hanxi@google.com</owner>
-  <summary>
-    Records each shown tile's recency in the Tab Resumption Module.
-    Android-only.
-  </summary>
-</histogram>
-
 </histograms>
 
 </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml
index 54ce149..a8cf8a6 100644
--- a/tools/metrics/histograms/metadata/net/histograms.xml
+++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -3273,17 +3273,6 @@
   </token>
 </histogram>
 
-<histogram name="Net.HttpStreamPool.SwitchesToPoolPostTaskTime" units="ms"
-    expires_after="2025-11-09">
-  <owner>bashi@chromium.org</owner>
-  <owner>blink-network-stack@google.com</owner>
-  <summary>
-    Record the time between when a task to switch to the HttpStreamPool is
-    posted and when it is executed. Recorded when an HttpStreamRequest switched
-    to the HttpStreamPool.
-  </summary>
-</histogram>
-
 <histogram name="Net.HttpStreamPool.TcpBasedAttemptCancelCount.{Reason}"
     units="attempts" expires_after="2025-07-13">
   <owner>bashi@chromium.org</owner>
@@ -3435,6 +3424,25 @@
   </token>
 </histogram>
 
+<histogram name="Net.MultiThreadedCertVerifier.RequestDuration{HostType}"
+    units="ms" expires_after="2025-10-26">
+  <owner>nidhijaju@chromium.org</owner>
+  <owner>chrome-network-stack@google.com</owner>
+  <summary>
+    Records the time taken to post a task to the worker thread pool, verify a
+    certificate for connections to {HostType}, and post a task back to the
+    browser main thread in the MultiThreadedCertVerifier. Recorded after
+    verifying the certificate and returning back to the browser main thread in
+    the MultiThreadedCertVerifier.
+  </summary>
+  <token key="HostType">
+    <variant name="" summary="any server"/>
+    <variant name=".Google" summary="Google hosted servers"/>
+    <variant name=".GoogleWithAlpnH3"
+        summary="Google hosted servers with ALPN h3"/>
+  </token>
+</histogram>
+
 <histogram name="Net.NeedsHWCAP2Workaround" enum="BooleanBroken"
     expires_after="2024-06-30">
   <owner>davidben@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/omnibox/enums.xml b/tools/metrics/histograms/metadata/omnibox/enums.xml
index 1d8798d..7a6e9c2 100644
--- a/tools/metrics/histograms/metadata/omnibox/enums.xml
+++ b/tools/metrics/histograms/metadata/omnibox/enums.xml
@@ -85,6 +85,13 @@
   </int>
 </enum>
 
+<enum name="DuplicateNavigationServingResult">
+  <int value="0" label="Not served then not served"/>
+  <int value="1" label="Not served then served"/>
+  <int value="2" label="Served then not served"/>
+  <int value="3" label="Served then served"/>
+</enum>
+
 <enum name="GroupId">
   <summary>
     Suggestion group IDs toggled visible or hidden in the omnibox result list.
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml
index 550b877..db9a7a2 100644
--- a/tools/metrics/histograms/metadata/omnibox/histograms.xml
+++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -2223,6 +2223,21 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Omnibox.SearchPrefetch.Within1sDuplicateSearchTermsRelationship"
+    enum="DuplicateNavigationServingResult" expires_after="2025-09-14">
+  <owner>lingqi@chromium.org</owner>
+  <owner>nhiroki@chromium.org</owner>
+  <owner>chrome-prerendering@google.com</owner>
+  <summary>
+    Tracks the prefetch serving statuses of two search terms that are the same
+    and are visited within 1s.
+
+    Recorded at SearchPrefetchService::RecordInterceptionMetrics when the same
+    search terms are visited again within 1s.
+  </summary>
+</histogram>
+
 <histogram name="Omnibox.SearchPreload.ForwardingResult.NotServedToPrerender"
     enum="SearchPreloadForwardingResult" expires_after="2025-11-16">
   <owner>lingqi@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/prefetch/histograms.xml b/tools/metrics/histograms/metadata/prefetch/histograms.xml
index e2ac8a0..3ba5e3f 100644
--- a/tools/metrics/histograms/metadata/prefetch/histograms.xml
+++ b/tools/metrics/histograms/metadata/prefetch/histograms.xml
@@ -27,6 +27,11 @@
   <variant name="TLS" summary="TLS canary check"/>
 </variants>
 
+<variants name="PrerenderOrNonPrerender">
+  <variant name="NonPrerender" summary="the navigation is not prerender"/>
+  <variant name="Prerender" summary="the navigaiton is prerender"/>
+</variants>
+
 <!-- LINT.IfChange(TriggerTypeAndEagerness) -->
 
 <variants name="TriggerTypeAndEagerness">
@@ -63,6 +68,35 @@
 </variants>
 
 <histogram
+    name="Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.{PrerenderOrNonPrerender}.{WasServed}.{TriggerTypeAndEagerness}"
+    units="ms" expires_after="2025-10-18">
+  <owner>kenoss@chromium.org</owner>
+  <owner>taiyo@chromium.org</owner>
+  <owner>chrome-loading@chromium.org</owner>
+  <summary>
+    When a navigation started, `PrefetchMatchResolver` collects potentially
+    matching prefetches for it. Judging a prefetch actually matches or not needs
+    non-redirect header. If a prefetch has non-redirect header and actually
+    matched, then this process ends synchronously. If not, it waits non-redirect
+    headers until it finds a matched and servable one or there is no more
+    candidates.
+
+    This histogram records that duration navigation was blocked by the prefetch
+    matching, when the matching is settled. Zero is recorded when the navigation
+    is not blocked.
+
+    This histogram is recorded per potentially matching candidate, with its
+    TriggerType and Eagerness as {TriggerTypeAndEagerness}, and whether its
+    candidate was eventually served or not as {WasServed}.
+
+    Recorded iff {PrerenderOrNonPrerender}.
+  </summary>
+  <token key="PrerenderOrNonPrerender" variants="PrerenderOrNonPrerender"/>
+  <token key="WasServed" variants="WasServed"/>
+  <token key="TriggerTypeAndEagerness" variants="TriggerTypeAndEagerness"/>
+</histogram>
+
+<histogram
     name="Prefetch.BlockUntilHeadDuration.PerMatchingCandidate.{WasServed}.{TriggerTypeAndEagerness}"
     units="ms" expires_after="2025-10-18">
   <owner>kenoss@chromium.org</owner>
@@ -160,6 +194,33 @@
 </histogram>
 
 <histogram
+    name="Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate.{PrerenderOrNonPrerender}.{TriggerTypeAndEagerness}"
+    enum="Boolean" expires_after="2025-10-12">
+  <owner>kouhei@chromium.org</owner>
+  <owner>kenoss@chromium.org</owner>
+  <owner>taiyo@chromium.org</owner>
+  <owner>chrome-loading@chromium.org</owner>
+  <summary>
+    When a navigation started, `PrefetchMatchResolver` collects potentially
+    matching prefetches for it. Judging a prefetch actually matches or not needs
+    non-redirect header. If a prefetch has non-redirect header and actually
+    matched, then this process ends synchronously. If not, it waits non-redirect
+    headers until it finds a matched and servable one or there is no more
+    candidates.
+
+    This histogram records whether this process ends synchronously (i.e. whether
+    prefetch matching blocked the navigation), when the above prefetch matching
+    is settled.
+
+    This histogram is recorded per potentially matching candidates, with its
+    TriggerType and Eagerness as {TriggerTypeAndEagerness}. Recorded iff
+    {PrerenderOrNonPrerender}.
+  </summary>
+  <token key="PrerenderOrNonPrerender" variants="PrerenderOrNonPrerender"/>
+  <token key="TriggerTypeAndEagerness" variants="TriggerTypeAndEagerness"/>
+</histogram>
+
+<histogram
     name="Prefetch.PrefetchMatchingBlockedNavigation.PerMatchingCandidate.{TriggerTypeAndEagerness}"
     enum="Boolean" expires_after="2025-10-12">
   <owner>kouhei@chromium.org</owner>
diff --git a/tools/metrics/structured/OWNERS b/tools/metrics/structured/OWNERS
index 135f833..9df1690 100644
--- a/tools/metrics/structured/OWNERS
+++ b/tools/metrics/structured/OWNERS
@@ -1,5 +1,4 @@
 troywang@google.com
 
 # Last resort reviewers
-andrewbregger@google.com
 tby@chromium.org
diff --git a/ui/accessibility/ax_event_generator.cc b/ui/accessibility/ax_event_generator.cc
index 89cce12f..455856c 100644
--- a/ui/accessibility/ax_event_generator.cc
+++ b/ui/accessibility/ax_event_generator.cc
@@ -6,7 +6,6 @@
 
 #include "base/containers/contains.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_event.h"
 #include "ui/accessibility/ax_node.h"
@@ -134,7 +133,7 @@
   if (map_iter_ == map_end_iter_)
     return *this;
 
-  CHECK(set_iter_ != map_iter_->second.end(), base::NotFatalUntil::M130);
+  CHECK(set_iter_ != map_iter_->second.end());
   set_iter_++;
 
   // The map pointed to by |map_end_iter_| may contain empty sets of events in
@@ -160,7 +159,7 @@
 
 AXEventGenerator::TargetedEvent AXEventGenerator::Iterator::operator*() const {
   DCHECK(map_iter_ != map_end_iter_);
-  CHECK(set_iter_ != map_iter_->second.end(), base::NotFatalUntil::M130);
+  CHECK(set_iter_ != map_iter_->second.end());
   return AXEventGenerator::TargetedEvent(map_iter_->first, *set_iter_);
 }
 
diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc
index c92f3907..4d573a01 100644
--- a/ui/accessibility/ax_tree.cc
+++ b/ui/accessibility/ax_tree.cc
@@ -23,7 +23,6 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/observer_list.h"
 #include "base/strings/strcat.h"
@@ -2520,7 +2519,7 @@
   UpdateReverseRelations(node, *empty_data);
 
   auto iter = id_map_.find(id);
-  CHECK(iter != id_map_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != id_map_.end());
   std::unique_ptr<AXNode> node_to_delete = std::move(iter->second);
   id_map_.erase(iter);
   node = nullptr;
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc
index daa6cb5..e52ed94 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.cc
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -25,7 +25,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/sys_string_conversions.h"
@@ -4993,8 +4992,7 @@
       FindStartOfStyle(utf16_offset, ax::mojom::MoveDirection::kForward);
 
   auto iterator = offset_to_text_attributes_.find(style_start);
-  CHECK(iterator != offset_to_text_attributes_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(iterator != offset_to_text_attributes_.end());
 
   SetIntPointerValueIfNotNull(start_offset,
                               UTF16ToUnicodeOffsetInText(style_start));
diff --git a/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_registry.cc b/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_registry.cc
index 863518e..d740d80 100644
--- a/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_registry.cc
+++ b/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_registry.cc
@@ -5,7 +5,6 @@
 #include "ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_registry.h"
 
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 
 namespace ui {
 
@@ -43,7 +42,7 @@
 void AccessibilityBridgeFuchsiaRegistry::UnregisterAccessibilityBridge(
     aura::Window* window) {
   auto it = window_to_bridge_map_.find(window);
-  CHECK(it != window_to_bridge_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != window_to_bridge_map_.end());
 
   window_to_bridge_map_.erase(it);
 }
diff --git a/ui/android/view_android.cc b/ui/android/view_android.cc
index dc2e73d8..1c2c092 100644
--- a/ui/android/view_android.cc
+++ b/ui/android/view_android.cc
@@ -13,7 +13,6 @@
 #include "base/containers/adapters.h"
 #include "base/containers/contains.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "cc/slim/layer.h"
 #include "components/viz/common/frame_sinks/copy_output_request.h"
 #include "third_party/skia/include/core/SkBitmap.h"
@@ -187,7 +186,7 @@
 void ViewAndroid::MoveToFront(ViewAndroid* child) {
   DCHECK(child);
   auto it = std::ranges::find(children_, child);
-  CHECK(it != children_.end(), base::NotFatalUntil::M130);
+  CHECK(it != children_.end());
 
   // Top element is placed at the end of the list.
   if (*it != children_.back())
@@ -197,7 +196,7 @@
 void ViewAndroid::MoveToBack(ViewAndroid* child) {
   DCHECK(child);
   auto it = std::ranges::find(children_, child);
-  CHECK(it != children_.end(), base::NotFatalUntil::M130);
+  CHECK(it != children_.end());
 
   // Bottom element is placed at the beginning of the list.
   if (*it != children_.front())
@@ -293,7 +292,7 @@
     child->OnDetachedFromWindow();
   std::list<raw_ptr<ViewAndroid, CtnExperimental>>::iterator it =
       std::ranges::find(children_, child);
-  CHECK(it != children_.end(), base::NotFatalUntil::M130);
+  CHECK(it != children_.end());
   children_.erase(it);
   child->parent_ = nullptr;
 }
diff --git a/ui/aura/window.cc b/ui/aura/window.cc
index 144c29da10..300809a 100644
--- a/ui/aura/window.cc
+++ b/ui/aura/window.cc
@@ -24,7 +24,6 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -1150,7 +1149,7 @@
     layer()->Remove(child->layer());
   child->parent_ = nullptr;
   auto i = std::ranges::find(children_, child);
-  CHECK(i != children_.end(), base::NotFatalUntil::M130);
+  CHECK(i != children_.end());
   children_.erase(i);
   child->OnParentChanged();
   if (layout_manager_)
diff --git a/ui/aura/window_occlusion_tracker.cc b/ui/aura/window_occlusion_tracker.cc
index bbba926..f1425f8 100644
--- a/ui/aura/window_occlusion_tracker.cc
+++ b/ui/aura/window_occlusion_tracker.cc
@@ -7,7 +7,6 @@
 #include "base/auto_reset.h"
 #include "base/containers/adapters.h"
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "base/trace_event/trace_event.h"
 #include "third_party/skia/include/core/SkRect.h"
 #include "third_party/skia/include/core/SkRegion.h"
@@ -273,8 +272,7 @@
   // This doesn't update the occlusion states of any window, so we should only
   // require one pass.
   auto tracked_window_iter = tracked_windows_.find(window);
-  CHECK(tracked_window_iter != tracked_windows_.end(),
-        base::NotFatalUntil::M130);
+  CHECK(tracked_window_iter != tracked_windows_.end());
 
   base::AutoReset<OcclusionData> auto_reset_occlusion_data(
       &tracked_window_iter->second, OcclusionData());
@@ -764,7 +762,7 @@
   Window* const root_window = window->GetRootWindow();
   DCHECK(root_window);
   auto root_window_state_it = root_windows_.find(root_window);
-  CHECK(root_window_state_it != root_windows_.end(), base::NotFatalUntil::M130);
+  CHECK(root_window_state_it != root_windows_.end());
   --root_window_state_it->second.num_tracked_windows;
   if (root_window_state_it->second.num_tracked_windows == 0) {
     RemoveObserverFromWindowAndDescendants(root_window);
@@ -845,7 +843,7 @@
 
 void WindowOcclusionTracker::RemoveForceWindowVisible(Window* window) {
   auto iter = forced_visible_count_map_.find(window);
-  CHECK(iter != forced_visible_count_map_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != forced_visible_count_map_.end());
   if (--iter->second == 0u) {
     forced_visible_count_map_.erase(iter);
     Window* root_window = window->GetRootWindow();
diff --git a/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.cc b/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.cc
index cdf35a5..16b11c6 100644
--- a/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.cc
+++ b/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.cc
@@ -7,7 +7,6 @@
 #include <vector>
 
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 #include "ui/base/accelerators/accelerator.h"
 
 namespace ui {
@@ -54,7 +53,7 @@
 
   auto it = accelerator_map_.find(accelerator);
   // We should never get asked to unregister something that we didn't register.
-  CHECK(it != accelerator_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != accelerator_map_.end());
   // The caller should call this function with the right observer.
   DCHECK(it->second == observer);
 
diff --git a/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener_win.cc b/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener_win.cc
index 034ccea0..d383846 100644
--- a/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener_win.cc
+++ b/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener_win.cc
@@ -8,7 +8,6 @@
 
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
-#include "base/not_fatal_until.h"
 #include "base/win/win_util.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/media_keys_listener_manager.h"
@@ -117,7 +116,7 @@
 void GlobalAcceleratorListenerWin::StopListeningForAccelerator(
     const ui::Accelerator& accelerator) {
   HotKeyMap::iterator it = hotkeys_.find(accelerator);
-  CHECK(it != hotkeys_.end(), base::NotFatalUntil::M130);
+  CHECK(it != hotkeys_.end());
 
   // TODO(crbug.com/40622191): We should be using
   // `media_keys_listener_manager->StopWatchingMediaKey(...)` here.
diff --git a/ui/base/interaction/element_tracker.cc b/ui/base/interaction/element_tracker.cc
index b27d45f..7a250dc 100644
--- a/ui/base/interaction/element_tracker.cc
+++ b/ui/base/interaction/element_tracker.cc
@@ -16,7 +16,6 @@
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "ui/base/interaction/element_identifier.h"
 
 namespace ui {
@@ -102,7 +101,7 @@
   void NotifyElementHidden(TrackedElement* element) {
     if (context_) {
       const auto it = element_lookup_.find(element);
-      CHECK(it != element_lookup_.end(), base::NotFatalUntil::M130);
+      CHECK(it != element_lookup_.end());
       elements_.erase(it->second);
       element_lookup_.erase(it);
     }
@@ -411,7 +410,7 @@
   GarbageCollector::Frame gc_frame(gc_.get());
   const auto it =
       element_data_.find(LookupKey(element->identifier(), element->context()));
-  CHECK(it != element_data_.end(), base::NotFatalUntil::M130);
+  CHECK(it != element_data_.end());
   it->second.NotifyElementActivated(safe_element);
 
   // Do "all contexts" notification:
@@ -440,7 +439,7 @@
   // Call context-specific callbacks and erase entry.
   const auto it =
       element_data_.find(LookupKey(element->identifier(), element->context()));
-  CHECK(it != element_data_.end(), base::NotFatalUntil::M130);
+  CHECK(it != element_data_.end());
   ElementData* const data = &it->second;
   data->NotifyElementHidden(element);
   gc_frame.Add(data);
diff --git a/ui/base/interaction/interaction_sequence.cc b/ui/base/interaction/interaction_sequence.cc
index eda0bd25..2dd342b 100644
--- a/ui/base/interaction/interaction_sequence.cc
+++ b/ui/base/interaction/interaction_sequence.cc
@@ -21,7 +21,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/weak_auto_reset.h"
 #include "base/memory/weak_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/observer_list_internal.h"
 #include "base/run_loop.h"
@@ -758,7 +757,7 @@
     if (next_step()->uses_named_element()) {
       // Find the named element; if it still exists, it hasn't been hidden.
       const auto it = named_elements_.find(next_step()->element_name);
-      CHECK(it != named_elements_.end(), base::NotFatalUntil::M130);
+      CHECK(it != named_elements_.end());
       if (it->second.get()) {
         return;
       }
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc
index d770a26c..a63fea66 100644
--- a/ui/compositor/compositor.cc
+++ b/ui/compositor/compositor.cc
@@ -19,7 +19,6 @@
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/power_monitor/power_monitor.h"
 #include "base/strings/string_number_conversions.h"
@@ -948,7 +947,7 @@
 
 bool Compositor::StopMetricsTracker(TrackerId tracker_id) {
   auto it = compositor_metrics_tracker_map_.find(tracker_id);
-  CHECK(it != compositor_metrics_tracker_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != compositor_metrics_tracker_map_.end());
 
   // Clean up if report has happened since StopCompositorMetricsTracking would
   // not trigger report in this case.
@@ -964,7 +963,7 @@
 
 void Compositor::CancelMetricsTracker(TrackerId tracker_id) {
   auto it = compositor_metrics_tracker_map_.find(tracker_id);
-  CHECK(it != compositor_metrics_tracker_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != compositor_metrics_tracker_map_.end());
 
   const bool should_stop = !it->second.report_attempted;
 
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc
index ff334d9..f6058b2 100644
--- a/ui/compositor/layer.cc
+++ b/ui/compositor/layer.cc
@@ -18,7 +18,6 @@
 #include "base/json/json_writer.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "base/trace_event/trace_event.h"
 #include "cc/layers/mirror_layer.h"
@@ -434,7 +433,7 @@
     child->ResetCompositorForAnimatorsInTree(compositor);
 
   auto i = std::ranges::find(children_, child);
-  CHECK(i != children_.end(), base::NotFatalUntil::M130);
+  CHECK(i != children_.end());
   children_.erase(i);
   child->parent_ = nullptr;
   child->cc_layer_->RemoveFromParent();
@@ -1902,7 +1901,7 @@
   const auto it =
       std::ranges::find(mirrors_, mirror, &std::unique_ptr<LayerMirror>::get);
 
-  CHECK(it != mirrors_.end(), base::NotFatalUntil::M130);
+  CHECK(it != mirrors_.end());
   mirrors_.erase(it);
 }
 
diff --git a/ui/display/display_layout.cc b/ui/display/display_layout.cc
index 85b5833..b797ccb 100644
--- a/ui/display/display_layout.cc
+++ b/ui/display/display_layout.cc
@@ -16,7 +16,6 @@
 #include "base/check_op.h"
 #include "base/containers/contains.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
 #include "components/device_event_log/device_event_log.h"
@@ -160,8 +159,7 @@
 
     auto target_display_placement_itr = std::ranges::find(
         *placement_list, target_display->id(), &DisplayPlacement::display_id);
-    CHECK(target_display_placement_itr != placement_list->end(),
-          base::NotFatalUntil::M130);
+    CHECK(target_display_placement_itr != placement_list->end());
     target_display_placement = &(*target_display_placement_itr);
     if (AreDisplaysTouching(*target_display, *parent_display,
                             target_display_placement->position)) {
diff --git a/ui/display/display_list.cc b/ui/display/display_list.cc
index eae166d3..659df21 100644
--- a/ui/display/display_list.cc
+++ b/ui/display/display_list.cc
@@ -5,7 +5,6 @@
 #include "ui/display/display_list.h"
 
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "ui/display/display_observer.h"
 
@@ -48,7 +47,7 @@
 
 uint32_t DisplayList::UpdateDisplay(const Display& display, Type type) {
   auto iter = FindDisplayByIdInternal(display.id());
-  CHECK(iter != displays_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != displays_.end());
 
   Display* local_display = &(*iter);
   uint32_t changed_values = 0;
@@ -124,7 +123,7 @@
 
 void DisplayList::RemoveDisplay(int64_t id) {
   auto iter = FindDisplayByIdInternal(id);
-  CHECK(displays_.end() != iter, base::NotFatalUntil::M130);
+  CHECK(displays_.end() != iter);
   if (id == primary_id_) {
     // The primary display can only be removed if it is the last display.
     // Users must choose a new primary before removing an old primary display.
diff --git a/ui/display/manager/display_change_observer.cc b/ui/display/manager/display_change_observer.cc
index c586737..2550d20 100644
--- a/ui/display/manager/display_change_observer.cc
+++ b/ui/display/manager/display_change_observer.cc
@@ -22,7 +22,6 @@
 #include "base/check_op.h"
 #include "base/command_line.h"
 #include "base/json/json_reader.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/values.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -255,7 +254,7 @@
     const gfx::Size size = native_mode.size();
 
     auto it = display_mode_map.find(size);
-    CHECK(it != display_mode_map.end(), base::NotFatalUntil::M130)
+    CHECK(it != display_mode_map.end())
         << "Native mode must be part of the mode list.";
 
     // If the native mode was replaced (e.g. by a mode with similar size but
diff --git a/ui/display/unified_desktop_utils.cc b/ui/display/unified_desktop_utils.cc
index 9826b489a..5a173340 100644
--- a/ui/display/unified_desktop_utils.cc
+++ b/ui/display/unified_desktop_utils.cc
@@ -11,7 +11,6 @@
 #include "base/containers/contains.h"
 #include "base/containers/stack.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "ui/display/types/display_constants.h"
 
 namespace display {
@@ -88,8 +87,7 @@
       auto placement_iter =
           std::ranges::find(layout.placement_list, current_display_id,
                             &DisplayPlacement::display_id);
-      CHECK(placement_iter != layout.placement_list.end(),
-            base::NotFatalUntil::M130);
+      CHECK(placement_iter != layout.placement_list.end());
       unhandled_displays.emplace(*placement_iter);
       current_display_id = placement_iter->parent_display_id;
     }
diff --git a/ui/gfx/sequential_id_generator.cc b/ui/gfx/sequential_id_generator.cc
index f8bf376..91bbd9b 100644
--- a/ui/gfx/sequential_id_generator.cc
+++ b/ui/gfx/sequential_id_generator.cc
@@ -5,7 +5,6 @@
 #include "ui/gfx/sequential_id_generator.h"
 
 #include "base/check_op.h"
-#include "base/not_fatal_until.h"
 
 namespace {
 
@@ -20,7 +19,7 @@
   first->erase(iter);
 
   iter = second->find(second_key);
-  CHECK(iter != second->end(), base::NotFatalUntil::M130);
+  CHECK(iter != second->end());
   second->erase(iter);
 }
 
diff --git a/ui/gfx/system_fonts_win.cc b/ui/gfx/system_fonts_win.cc
index d959147..a47594d 100644
--- a/ui/gfx/system_fonts_win.cc
+++ b/ui/gfx/system_fonts_win.cc
@@ -10,7 +10,6 @@
 #include "base/containers/flat_map.h"
 #include "base/logging.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/trace_event/trace_event.h"
@@ -31,7 +30,7 @@
       Initialize();
 
     auto it = system_fonts_.find(system_font);
-    CHECK(it != system_fonts_.end(), base::NotFatalUntil::M130)
+    CHECK(it != system_fonts_.end())
         << "System font #" << static_cast<int>(system_font) << " not found!";
     return it->second;
   }
diff --git a/ui/gtk/nav_button_provider_gtk.cc b/ui/gtk/nav_button_provider_gtk.cc
index 239fbf4c..243d2b5 100644
--- a/ui/gtk/nav_button_provider_gtk.cc
+++ b/ui/gtk/nav_button_provider_gtk.cc
@@ -9,7 +9,6 @@
 
 #include "ui/gtk/nav_button_provider_gtk.h"
 
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "ui/base/glib/glib_cast.h"
 #include "ui/base/glib/scoped_gobject.h"
@@ -438,16 +437,16 @@
     ui::NavButtonProvider::FrameButtonDisplayType type,
     ui::NavButtonProvider::ButtonState state) const {
   auto it = button_images_.find(type);
-  CHECK(it != button_images_.end(), base::NotFatalUntil::M130);
+  CHECK(it != button_images_.end());
   auto it2 = it->second.find(state);
-  CHECK(it2 != it->second.end(), base::NotFatalUntil::M130);
+  CHECK(it2 != it->second.end());
   return it2->second;
 }
 
 gfx::Insets NavButtonProviderGtk::GetNavButtonMargin(
     ui::NavButtonProvider::FrameButtonDisplayType type) const {
   auto it = button_margins_.find(type);
-  CHECK(it != button_margins_.end(), base::NotFatalUntil::M130);
+  CHECK(it != button_margins_.end());
   return it->second;
 }
 
diff --git a/ui/message_center/message_center_stats_collector.cc b/ui/message_center/message_center_stats_collector.cc
index 45f35e7..4a961368 100644
--- a/ui/message_center/message_center_stats_collector.cc
+++ b/ui/message_center/message_center_stats_collector.cc
@@ -11,7 +11,6 @@
 
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
-#include "base/not_fatal_until.h"
 #include "ui/message_center/message_center.h"
 
 namespace message_center {
@@ -68,7 +67,7 @@
   stats_[notification_id] = NotificationStats(notification_id);
 
   auto iter = stats_.find(notification_id);
-  CHECK(iter != stats_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != stats_.end());
 
   stats_[notification_id].CollectAction(NOTIFICATION_ACTION_ADD);
 
diff --git a/ui/message_center/notification_list.cc b/ui/message_center/notification_list.cc
index c409f36de..ea4a3fa 100644
--- a/ui/message_center/notification_list.cc
+++ b/ui/message_center/notification_list.cc
@@ -10,7 +10,6 @@
 #include "base/check.h"
 #include "base/containers/adapters.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "ui/gfx/image/image.h"
@@ -351,7 +350,7 @@
 void NotificationList::MarkSinglePopupAsShown(const std::string& id,
                                               bool mark_notification_as_read) {
   auto iter = GetNotification(id);
-  CHECK(iter != notifications_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != notifications_.end());
 
   NotificationState* state = &iter->second;
   if (iter->second.shown_as_popup) {
@@ -384,7 +383,7 @@
 
 void NotificationList::ResetSinglePopup(const std::string& id) {
   auto iter = GetNotification(id);
-  CHECK(iter != notifications_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != notifications_.end());
 
   NotificationState* state = &iter->second;
   // `shown_as_popup` should be true if quiet mode is enabled.
diff --git a/ui/ozone/platform/drm/common/drm_util.cc b/ui/ozone/platform/drm/common/drm_util.cc
index a7f10e7..cba47e8b 100644
--- a/ui/ozone/platform/drm/common/drm_util.cc
+++ b/ui/ozone/platform/drm/common/drm_util.cc
@@ -29,7 +29,6 @@
 #include "base/containers/flat_map.h"
 #include "base/files/file_util.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
@@ -729,7 +728,7 @@
     ScopedDrmCrtcPtr crtc = drm.GetCrtc(best_crtc);
     auto connector_iter =
         std::ranges::find(connectors, c, &ScopedDrmConnectorPtr::get);
-    CHECK(connector_iter != connectors.end(), base::NotFatalUntil::M130);
+    CHECK(connector_iter != connectors.end());
     // |connectors.size()| <= 256, so |index| should be between 0-255.
     const uint8_t index = connector_iter - connectors.begin();
     DCHECK_LT(index, connectors.size());
diff --git a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
index b1d5bc5..62254cc 100644
--- a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
+++ b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
@@ -13,7 +13,6 @@
 #include "base/containers/contains.h"
 #include "base/files/file_path.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/threading/thread_restrictions.h"
@@ -284,7 +283,7 @@
     gfx::AcceleratedWidget widget) const {
   DCHECK(thread_checker_.CalledOnValidThread());
   auto it = widget_to_surface_map_.find(widget);
-  CHECK(it != widget_to_surface_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != widget_to_surface_map_.end());
   return it->second;
 }
 
diff --git a/ui/ozone/platform/drm/gpu/screen_manager.cc b/ui/ozone/platform/drm/gpu/screen_manager.cc
index c103270..901760c 100644
--- a/ui/ozone/platform/drm/gpu/screen_manager.cc
+++ b/ui/ozone/platform/drm/gpu/screen_manager.cc
@@ -15,7 +15,6 @@
 #include "base/json/json_writer.h"
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/not_fatal_until.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/trace_event/common/trace_event_common.h"
@@ -427,7 +426,7 @@
 
   for (const auto& params : controllers_params) {
     auto it = FindDisplayController(params.drm, params.crtc);
-    CHECK(controllers_.end() != it, base::NotFatalUntil::M130);
+    CHECK(controllers_.end() != it);
     HardwareDisplayController* controller = it->get();
 
     if (params.mode) {
@@ -479,7 +478,7 @@
 
   for (const auto& params : controllers_params) {
     auto it = FindDisplayController(params.drm, params.crtc);
-    CHECK(controllers_.end() != it, base::NotFatalUntil::M130);
+    CHECK(controllers_.end() != it);
     HardwareDisplayController* controller = it->get();
 
     uint32_t fourcc_format = GetFourCCFormatForOpaqueFramebuffer(
@@ -556,7 +555,7 @@
   auto drm = controllers_params[0].drm;
   for (const auto& params : controllers_params) {
     auto it = FindDisplayController(params.drm, params.crtc);
-    CHECK(controllers_.end() != it, base::NotFatalUntil::M130);
+    CHECK(controllers_.end() != it);
     HardwareDisplayController* controller = it->get();
 
     if (params.mode) {
@@ -603,7 +602,7 @@
   for (const auto& params : controllers_params) {
     if (params.mode) {
       auto it = FindDisplayController(params.drm, params.crtc);
-      CHECK(controllers_.end() != it, base::NotFatalUntil::M130);
+      CHECK(controllers_.end() != it);
       HardwareDisplayController* controller = it->get();
 
       uint32_t fourcc_format = GetFourCCFormatForOpaqueFramebuffer(
@@ -652,7 +651,7 @@
     const DrmOverlayPlaneList& modeset_planes,
     bool enable_vrr) {
   HardwareDisplayControllers::iterator it = FindDisplayController(drm, crtc);
-  CHECK(controllers_.end() != it, base::NotFatalUntil::M130)
+  CHECK(controllers_.end() != it)
       << "Display controller (crtc=" << crtc << ") doesn't exist.";
 
   HardwareDisplayController* controller = it->get();
diff --git a/ui/ozone/platform/flatland/flatland_surface.cc b/ui/ozone/platform/flatland/flatland_surface.cc
index 85587eb..7282f8ed3 100644
--- a/ui/ozone/platform/flatland/flatland_surface.cc
+++ b/ui/ozone/platform/flatland/flatland_surface.cc
@@ -14,7 +14,6 @@
 #include "base/fuchsia/fuchsia_logging.h"
 #include "base/fuchsia/process_context.h"
 #include "base/functional/bind.h"
-#include "base/not_fatal_until.h"
 #include "base/trace_event/trace_event.h"
 #include "ui/gfx/geometry/rect_conversions.h"
 #include "ui/gfx/geometry/rect_f.h"
@@ -333,7 +332,7 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   auto iter = pixmap_ids_to_flatland_ids_.find(ids);
-  CHECK(iter != pixmap_ids_to_flatland_ids_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != pixmap_ids_to_flatland_ids_.end());
   flatland_.flatland()->ReleaseImage(iter->second.image_id);
   if (iter->second.transform_id.value) {
     flatland_.flatland()->ReleaseTransform(iter->second.transform_id);
diff --git a/ui/ozone/platform/flatland/flatland_surface_factory.cc b/ui/ozone/platform/flatland/flatland_surface_factory.cc
index 92c22c2..cfbacd2 100644
--- a/ui/ozone/platform/flatland/flatland_surface_factory.cc
+++ b/ui/ozone/platform/flatland/flatland_surface_factory.cc
@@ -14,7 +14,6 @@
 #include "base/fuchsia/process_context.h"
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/task/single_thread_task_runner.h"
 #include "gpu/vulkan/vulkan_device_queue.h"
 #include "third_party/angle/src/common/fuchsia_egl/fuchsia_egl.h"
@@ -237,7 +236,7 @@
 void FlatlandSurfaceFactory::RemoveSurface(gfx::AcceleratedWidget widget) {
   base::AutoLock lock(surface_lock_);
   auto it = surface_map_.find(widget);
-  CHECK(it != surface_map_.end(), base::NotFatalUntil::M130);
+  CHECK(it != surface_map_.end());
   FlatlandSurface* surface = it->second;
   surface->AssertBelongsToCurrentThread();
   surface_map_.erase(it);
diff --git a/ui/ozone/platform/headless/headless_screen.cc b/ui/ozone/platform/headless/headless_screen.cc
index 20f8d99..c0ba078 100644
--- a/ui/ozone/platform/headless/headless_screen.cc
+++ b/ui/ozone/platform/headless/headless_screen.cc
@@ -149,7 +149,7 @@
 
 display::Display HeadlessScreen::GetPrimaryDisplay() const {
   auto iter = display_list_.GetPrimaryDisplayIterator();
-  CHECK(iter != display_list_.displays().end(), base::NotFatalUntil::M130);
+  CHECK(iter != display_list_.displays().end());
   return *iter;
 }
 
diff --git a/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.cc b/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.cc
index 698c55dd..92370e8 100644
--- a/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.cc
+++ b/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.cc
@@ -6,7 +6,6 @@
 
 #include <algorithm>
 
-#include "base/not_fatal_until.h"
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
 #include "ui/ozone/platform/wayland/host/wayland_shm_buffer.h"
 #include "ui/ozone/platform/wayland/host/wayland_window.h"
@@ -61,7 +60,7 @@
 
 void WaylandProxyImpl::DestroyShmForWlBuffer(wl_buffer* buffer) {
   auto it = std::ranges::find(shm_buffers_, buffer, &ui::WaylandShmBuffer::get);
-  CHECK(it != shm_buffers_.end(), base::NotFatalUntil::M130);
+  CHECK(it != shm_buffers_.end());
   shm_buffers_.erase(it);
 }
 
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc b/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc
index 60a4364..77c1bdb 100644
--- a/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc
+++ b/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc
@@ -6,7 +6,6 @@
 
 #include <ostream>
 
-#include "base/not_fatal_until.h"
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
 #include "ui/ozone/platform/wayland/host/wayland_syncobj_timeline.h"
 
@@ -44,7 +43,7 @@
 
 void WaylandBufferHandle::OnExplicitRelease(WaylandSurface* requestor) {
   auto it = released_callbacks_.find(requestor);
-  CHECK(it != released_callbacks_.end(), base::NotFatalUntil::M130);
+  CHECK(it != released_callbacks_.end());
   released_callbacks_.erase(it);
 }
 
diff --git a/ui/ozone/platform/wayland/host/wayland_surface.cc b/ui/ozone/platform/wayland/host/wayland_surface.cc
index c2b85ba..86d57e3 100644
--- a/ui/ozone/platform/wayland/host/wayland_surface.cc
+++ b/ui/ozone/platform/wayland/host/wayland_surface.cc
@@ -22,7 +22,6 @@
 #include "base/files/scoped_file.h"
 #include "base/functional/bind.h"
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "base/trace_event/trace_event.h"
 #include "ui/gfx/color_space.h"
 #include "ui/gfx/geometry/rect.h"
@@ -889,7 +888,7 @@
     zwp_linux_buffer_release_v1* linux_buffer_release,
     base::ScopedFD fence) {
   auto iter = linux_buffer_releases_legacy_.find(linux_buffer_release);
-  CHECK(iter != linux_buffer_releases_legacy_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != linux_buffer_releases_legacy_.end());
   DCHECK(iter->second.buffer);
   std::move(iter->second.explicit_release_callback)
       .Run(iter->second.buffer.get(), std::move(fence));
diff --git a/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc b/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc
index 39cb4fa9..7c1ad52 100644
--- a/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc
+++ b/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc
@@ -10,7 +10,6 @@
 #include <algorithm>
 
 #include "base/logging.h"
-#include "base/not_fatal_until.h"
 #include "ui/gfx/linux/drm_util_linux.h"
 #include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h"
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
@@ -146,7 +145,7 @@
   auto it = std::ranges::find(pending_params_, params, [](const auto& item) {
     return item.first.get();
   });
-  CHECK(it != pending_params_.end(), base::NotFatalUntil::M130);
+  CHECK(it != pending_params_.end());
   std::move(it->second).Run(wl::Object<wl_buffer>(new_buffer));
   pending_params_.erase(it);
   connection_->Flush();
diff --git a/ui/ozone/platform/wayland/host/xdg_foreign_wrapper.cc b/ui/ozone/platform/wayland/host/xdg_foreign_wrapper.cc
index 5548279b..8c5fe84 100644
--- a/ui/ozone/platform/wayland/host/xdg_foreign_wrapper.cc
+++ b/ui/ozone/platform/wayland/host/xdg_foreign_wrapper.cc
@@ -11,7 +11,6 @@
 
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
 #include "ui/ozone/platform/wayland/host/wayland_window.h"
 #include "ui/platform_window/platform_window_init_properties.h"
@@ -132,8 +131,7 @@
     auto exported_surface_it =
         std::ranges::find(self->exported_surfaces_, exported,
                           [](const auto& item) { return item.exported.get(); });
-    CHECK(exported_surface_it != self->exported_surfaces_.end(),
-          base::NotFatalUntil::M130);
+    CHECK(exported_surface_it != self->exported_surfaces_.end());
     exported_surface_it->exported_handle = handle;
 
     for (auto& cb : exported_surface_it->callbacks) {
diff --git a/ui/ozone/platform/wayland/test/mock_surface.cc b/ui/ozone/platform/wayland/test/mock_surface.cc
index ed174c3..09c273f3 100644
--- a/ui/ozone/platform/wayland/test/mock_surface.cc
+++ b/ui/ozone/platform/wayland/test/mock_surface.cc
@@ -6,7 +6,6 @@
 
 #include <linux-explicit-synchronization-unstable-v1-client-protocol.h>
 
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "ui/ozone/platform/wayland/test/test_region.h"
 #include "ui/ozone/platform/wayland/test/test_wayland_server_thread.h"
@@ -218,7 +217,7 @@
                                       gfx::GpuFenceHandle release_fence) {
   DCHECK(buffer);
   auto iter = linux_buffer_releases_.find(buffer);
-  CHECK(iter != linux_buffer_releases_.end(), base::NotFatalUntil::M130);
+  CHECK(iter != linux_buffer_releases_.end());
   auto* linux_buffer_release = iter->second.get();
   if (!release_fence.is_null()) {
     zwp_linux_buffer_release_v1_send_fenced_release(linux_buffer_release,
diff --git a/ui/ozone/platform/wayland/test/mock_wayland_zcr_color_manager.cc b/ui/ozone/platform/wayland/test/mock_wayland_zcr_color_manager.cc
index cfe8af3..335102c 100644
--- a/ui/ozone/platform/wayland/test/mock_wayland_zcr_color_manager.cc
+++ b/ui/ozone/platform/wayland/test/mock_wayland_zcr_color_manager.cc
@@ -10,7 +10,6 @@
 #include <cstdint>
 #include <iterator>
 
-#include "base/not_fatal_until.h"
 #include "ui/base/wayland/color_manager_util.h"
 #include "ui/gfx/color_space.h"
 #include "ui/ozone/platform/wayland/test/global_object.h"
@@ -184,21 +183,21 @@
 void MockZcrColorManagerV1::OnZcrColorManagementOutputDestroyed(
     TestZcrColorManagementOutputV1* params) {
   auto it = std::ranges::find(color_manager_outputs_, params);
-  CHECK(it != color_manager_outputs_.end(), base::NotFatalUntil::M130);
+  CHECK(it != color_manager_outputs_.end());
   color_manager_outputs_.erase(it);
 }
 
 void MockZcrColorManagerV1::OnZcrColorManagementSurfaceDestroyed(
     TestZcrColorManagementSurfaceV1* params) {
   auto it = std::ranges::find(color_manager_surfaces_, params);
-  CHECK(it != color_manager_surfaces_.end(), base::NotFatalUntil::M130);
+  CHECK(it != color_manager_surfaces_.end());
   color_manager_surfaces_.erase(it);
 }
 
 void MockZcrColorManagerV1::OnZcrColorSpaceDestroyed(
     TestZcrColorSpaceV1* params) {
   auto it = std::ranges::find(color_manager_color_spaces_, params);
-  CHECK(it != color_manager_color_spaces_.end(), base::NotFatalUntil::M130);
+  CHECK(it != color_manager_color_spaces_.end());
   color_manager_color_spaces_.erase(it);
 }
 
diff --git a/ui/ozone/platform/wayland/test/mock_zwp_linux_dmabuf.cc b/ui/ozone/platform/wayland/test/mock_zwp_linux_dmabuf.cc
index 9fb6f24b..bf81b61 100644
--- a/ui/ozone/platform/wayland/test/mock_zwp_linux_dmabuf.cc
+++ b/ui/ozone/platform/wayland/test/mock_zwp_linux_dmabuf.cc
@@ -9,7 +9,6 @@
 
 #include <algorithm>
 
-#include "base/not_fatal_until.h"
 #include "ui/ozone/platform/wayland/test/test_buffer.h"
 #include "ui/ozone/platform/wayland/test/test_zwp_linux_buffer_params.h"
 
@@ -60,7 +59,7 @@
 void MockZwpLinuxDmabufV1::OnBufferParamsDestroyed(
     TestZwpLinuxBufferParamsV1* params) {
   auto it = std::ranges::find(buffer_params_, params);
-  CHECK(it != buffer_params_.end(), base::NotFatalUntil::M130);
+  CHECK(it != buffer_params_.end());
   buffer_params_.erase(it);
 }
 
diff --git a/ui/ozone/platform/x11/x11_window_manager.cc b/ui/ozone/platform/x11/x11_window_manager.cc
index 8e89257..cd398a3 100644
--- a/ui/ozone/platform/x11/x11_window_manager.cc
+++ b/ui/ozone/platform/x11/x11_window_manager.cc
@@ -5,7 +5,6 @@
 #include "ui/ozone/platform/x11/x11_window_manager.h"
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "ui/ozone/platform/x11/x11_window.h"
 
 namespace ui {
@@ -80,7 +79,7 @@
   if (widget == gfx::kNullAcceleratedWidget) {
     DCHECK(it == windows_.end());
   } else {
-    CHECK(it != windows_.end(), base::NotFatalUntil::M130);
+    CHECK(it != windows_.end());
     if (window_mouse_currently_on_ == it->second)
       window_mouse_currently_on_ = nullptr;
     windows_.erase(it);
diff --git a/ui/views/animation/bounds_animator.cc b/ui/views/animation/bounds_animator.cc
index 4e6e84ec..dc8a207 100644
--- a/ui/views/animation/bounds_animator.cc
+++ b/ui/views/animation/bounds_animator.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "base/containers/contains.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "ui/gfx/animation/animation_container.h"
 #include "ui/gfx/animation/slide_animation.h"
@@ -143,7 +142,7 @@
     View* view,
     std::unique_ptr<AnimationDelegate> delegate) {
   const auto i = data_.find(view);
-  CHECK(i != data_.end(), base::NotFatalUntil::M130);
+  CHECK(i != data_.end());
 
   i->second.delegate = std::move(delegate);
 }
@@ -216,7 +215,7 @@
 
 BoundsAnimator::Data BoundsAnimator::RemoveFromMaps(View* view) {
   const auto i = data_.find(view);
-  CHECK(i != data_.end(), base::NotFatalUntil::M130);
+  CHECK(i != data_.end());
   DCHECK_GT(animation_to_view_.count(i->second.animation.get()), 0u);
 
   Data old_data = std::move(i->second);
diff --git a/ui/views/interaction/element_tracker_views.cc b/ui/views/interaction/element_tracker_views.cc
index 7c58dba..080b217 100644
--- a/ui/views/interaction/element_tracker_views.cc
+++ b/ui/views/interaction/element_tracker_views.cc
@@ -15,7 +15,6 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/no_destructor.h"
-#include "base/not_fatal_until.h"
 #include "base/scoped_multi_source_observation.h"
 #include "base/scoped_observation.h"
 #include "ui/base/interaction/element_identifier.h"
@@ -90,13 +89,13 @@
 
   TrackedElementViews* GetElementForView(View* view) {
     const auto it = view_data_lookup_.find(view);
-    CHECK(it != view_data_lookup_.end(), base::NotFatalUntil::M130);
+    CHECK(it != view_data_lookup_.end());
     return it->second->element.get();
   }
 
   void NotifyViewActivated(View* view) {
     const auto it = view_data_lookup_.find(view);
-    CHECK(it != view_data_lookup_.end(), base::NotFatalUntil::M130);
+    CHECK(it != view_data_lookup_.end());
     if (it->second->visible()) {
       ui::ElementTracker::GetFrameworkDelegate()->NotifyElementActivated(
           it->second->element.get());
@@ -199,7 +198,7 @@
   void UpdateVisible(View* view,
                      UpdateReason update_reason = UpdateReason::kGeneral) {
     const auto it = view_data_lookup_.find(view);
-    CHECK(it != view_data_lookup_.end(), base::NotFatalUntil::M130);
+    CHECK(it != view_data_lookup_.end());
     ViewData& data = *it->second;
     const ui::ElementContext old_context = data.context;
     data.context = (update_reason == UpdateReason::kRemoveFromWidget)
@@ -434,7 +433,7 @@
                                          View* view) {
   DCHECK(view);
   const auto it = element_data_.find(element_id);
-  CHECK(it != element_data_.end(), base::NotFatalUntil::M130);
+  CHECK(it != element_data_.end());
   it->second.RemoveView(view);
 }
 
@@ -442,7 +441,7 @@
                                               View* view) {
   DCHECK(view);
   const auto it = element_data_.find(element_id);
-  CHECK(it != element_data_.end(), base::NotFatalUntil::M130);
+  CHECK(it != element_data_.end());
   it->second.NotifyViewActivated(view);
 }
 
diff --git a/ui/views/layout/flex_layout.cc b/ui/views/layout/flex_layout.cc
index 2186cfa..d35b7ba9 100644
--- a/ui/views/layout/flex_layout.cc
+++ b/ui/views/layout/flex_layout.cc
@@ -16,7 +16,6 @@
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "ui/base/class_property.h"
@@ -186,7 +185,7 @@
 
 int FlexLayout::ChildViewSpacing::GetLeadingSpace(size_t view_index) const {
   auto it = leading_spacings_.find(view_index);
-  CHECK(it != leading_spacings_.end(), base::NotFatalUntil::M130);
+  CHECK(it != leading_spacings_.end());
   return it->second;
 }
 
diff --git a/ui/views/layout/layout_manager_base.cc b/ui/views/layout/layout_manager_base.cc
index 672138f..64ef4df 100644
--- a/ui/views/layout/layout_manager_base.cc
+++ b/ui/views/layout/layout_manager_base.cc
@@ -11,7 +11,6 @@
 #include "base/containers/contains.h"
 #include "base/dcheck_is_on.h"
 #include "base/memory/raw_ptr.h"
-#include "base/not_fatal_until.h"
 #include "base/trace_event/trace_event.h"
 #include "ui/views/view.h"
 #include "ui/views/view_class_properties.h"
@@ -334,7 +333,7 @@
   DCHECK_EQ(GetRootLayoutManager(), this);
 
   auto it = child_infos_.find(view);
-  CHECK(it != child_infos_.end(), base::NotFatalUntil::M130);
+  CHECK(it != child_infos_.end());
   const bool removed_visible =
       it->second.can_be_visible && it->second.included_in_layout;
 
@@ -353,7 +352,7 @@
                                           bool new_visibility) {
   DCHECK_EQ(host_view_, host);
   auto it = child_infos_.find(view);
-  CHECK(it != child_infos_.end(), base::NotFatalUntil::M130);
+  CHECK(it != child_infos_.end());
   if (it->second.can_be_visible == new_visibility) {
     return;
   }
diff --git a/ui/views/view.cc b/ui/views/view.cc
index 8764194b..d285a5d 100644
--- a/ui/views/view.cc
+++ b/ui/views/view.cc
@@ -31,7 +31,6 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/scoped_observation.h"
@@ -3291,7 +3290,7 @@
   DCHECK(view);
   DCHECK(descendants_to_notify_);
   auto i = std::ranges::find(*descendants_to_notify_, view);
-  CHECK(i != descendants_to_notify_->end(), base::NotFatalUntil::M130);
+  CHECK(i != descendants_to_notify_->end());
   descendants_to_notify_->erase(i);
   if (descendants_to_notify_->empty()) {
     descendants_to_notify_.reset();
diff --git a/ui/views/win/scoped_fullscreen_visibility.cc b/ui/views/win/scoped_fullscreen_visibility.cc
index ee3a1d4..479a809 100644
--- a/ui/views/win/scoped_fullscreen_visibility.cc
+++ b/ui/views/win/scoped_fullscreen_visibility.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "base/check.h"
-#include "base/not_fatal_until.h"
 
 namespace views {
 
@@ -36,7 +35,7 @@
 
 ScopedFullscreenVisibility::~ScopedFullscreenVisibility() {
   FullscreenHWNDs::iterator it = full_screen_windows_->find(hwnd_);
-  CHECK(it != full_screen_windows_->end(), base::NotFatalUntil::M130);
+  CHECK(it != full_screen_windows_->end());
   if (--it->second == 0) {
     full_screen_windows_->erase(it);
     ShowWindow(hwnd_, SW_SHOW);
diff --git a/ui/wm/core/transient_window_manager.cc b/ui/wm/core/transient_window_manager.cc
index f820f18..fac1ea6 100644
--- a/ui/wm/core/transient_window_manager.cc
+++ b/ui/wm/core/transient_window_manager.cc
@@ -10,7 +10,6 @@
 #include "base/auto_reset.h"
 #include "base/containers/contains.h"
 #include "base/memory/ptr_util.h"
-#include "base/not_fatal_until.h"
 #include "base/observer_list.h"
 #include "ui/aura/client/transient_window_client.h"
 #include "ui/aura/client/transient_window_client_observer.h"
@@ -114,7 +113,7 @@
 
 void TransientWindowManager::RemoveTransientChild(Window* child) {
   auto i = std::ranges::find(transient_children_, child);
-  CHECK(i != transient_children_.end(), base::NotFatalUntil::M130);
+  CHECK(i != transient_children_.end());
   transient_children_.erase(i);
   TransientWindowManager* child_manager = GetOrCreate(child);
   DCHECK_EQ(window_, child_manager->transient_parent_);
diff --git a/ui/wm/core/window_animations.cc b/ui/wm/core/window_animations.cc
index 52b342e..cee4add0 100644
--- a/ui/wm/core/window_animations.cc
+++ b/ui/wm/core/window_animations.cc
@@ -16,7 +16,6 @@
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/not_fatal_until.h"
 #include "base/notreached.h"
 #include "base/time/time.h"
 #include "ui/aura/client/aura_constants.h"
@@ -104,8 +103,7 @@
       const aura::Window::Windows& transient_children =
           GetTransientChildren(window_);
       auto iter = std::ranges::find(window_->parent()->children(), window_);
-      CHECK(iter != window_->parent()->children().end(),
-            base::NotFatalUntil::M130);
+      CHECK(iter != window_->parent()->children().end());
       aura::Window* topmost_transient_child = nullptr;
       for (++iter; iter != window_->parent()->children().end(); ++iter) {
         if (base::Contains(transient_children, *iter))