diff --git a/tools/android/android_studio/ChromiumStyle.xml b/tools/android/android_studio/ChromiumStyle.xml
index 5b5a808..3d53d9b 100644
--- a/tools/android/android_studio/ChromiumStyle.xml
+++ b/tools/android/android_studio/ChromiumStyle.xml
@@ -1,77 +1,5 @@
-<code_scheme name="ChromiumStyle">
-  <option name="JAVA_INDENT_OPTIONS">
-    <value>
-      <option name="INDENT_SIZE" value="4" />
-      <option name="CONTINUATION_INDENT_SIZE" value="8" />
-      <option name="TAB_SIZE" value="8" />
-      <option name="USE_TAB_CHARACTER" value="false" />
-      <option name="SMART_TABS" value="false" />
-      <option name="LABEL_INDENT_SIZE" value="0" />
-      <option name="LABEL_INDENT_ABSOLUTE" value="false" />
-      <option name="USE_RELATIVE_INDENTS" value="false" />
-    </value>
-  </option>
-  <option name="FIELD_NAME_PREFIX" value="m" />
-  <option name="STATIC_FIELD_NAME_PREFIX" value="s" />
-  <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="9999" />
-  <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="9999" />
-  <option name="IMPORT_LAYOUT_TABLE">
-    <value>
-      <package name="android" withSubpackages="true" static="true" />
-      <emptyLine />
-      <package name="androidx" withSubpackages="true" static="true" />
-      <emptyLine />
-      <package name="com" withSubpackages="true" static="true" />
-      <emptyLine />
-      <package name="dalvik" withSubpackages="true" static="true" />
-      <emptyLine />
-      <package name="junit" withSubpackages="true" static="true" />
-      <emptyLine />
-      <package name="org" withSubpackages="true" static="true" />
-      <emptyLine />
-      <package name="com.google.android.apps.chrome" withSubpackages="true" static="true" />
-      <emptyLine />
-      <package name="org.chromium" withSubpackages="true" static="true" />
-      <emptyLine />
-      <package name="java" withSubpackages="true" static="true" />
-      <emptyLine />
-      <package name="javax" withSubpackages="true" static="true" />
-      <emptyLine />
-      <package name="" withSubpackages="true" static="true" />
-      <emptyLine />
-      <package name="android" withSubpackages="true" static="false" />
-      <emptyLine />
-      <package name="androidx" withSubpackages="true" static="false" />
-      <emptyLine />
-      <package name="com" withSubpackages="true" static="false" />
-      <emptyLine />
-      <package name="dalvik" withSubpackages="true" static="false" />
-      <emptyLine />
-      <package name="junit" withSubpackages="true" static="false" />
-      <emptyLine />
-      <package name="org" withSubpackages="true" static="false" />
-      <emptyLine />
-      <package name="com.google.android.apps.chrome" withSubpackages="true" static="false" />
-      <emptyLine />
-      <package name="org.chromium" withSubpackages="true" static="false" />
-      <emptyLine />
-      <package name="java" withSubpackages="true" static="false" />
-      <emptyLine />
-      <package name="javax" withSubpackages="true" static="false" />
-      <emptyLine />
-      <package name="" withSubpackages="true" static="false" />
-    </value>
-  </option>
-  <option name="RIGHT_MARGIN" value="100" />
-  <option name="JD_ALIGN_PARAM_COMMENTS" value="false" />
-  <option name="JD_P_AT_EMPTY_LINES" value="false" />
-  <option name="JD_DO_NOT_WRAP_ONE_LINE_COMMENTS" value="true" />
-  <option name="JD_KEEP_EMPTY_PARAMETER" value="false" />
-  <option name="JD_KEEP_EMPTY_EXCEPTION" value="false" />
-  <option name="JD_KEEP_EMPTY_RETURN" value="false" />
-  <option name="JD_PRESERVE_LINE_FEEDS" value="true" />
+<code_scheme name="ChromiumStyle" version="173">
   <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
-  <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
   <option name="BLANK_LINES_AROUND_FIELD" value="1" />
   <option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" />
   <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
@@ -97,8 +25,79 @@
   <option name="DOWHILE_BRACE_FORCE" value="3" />
   <option name="WHILE_BRACE_FORCE" value="3" />
   <option name="FOR_BRACE_FORCE" value="3" />
+  <AndroidXmlCodeStyleSettings>
+    <option name="LAYOUT_SETTINGS">
+      <value>
+        <option name="INSERT_BLANK_LINE_BEFORE_TAG" value="false" />
+      </value>
+    </option>
+    <option name="VALUE_RESOURCE_FILE_SETTINGS">
+      <value>
+        <option name="INSERT_LINE_BREAKS_AROUND_STYLE" value="false" />
+      </value>
+    </option>
+  </AndroidXmlCodeStyleSettings>
+  <JavaCodeStyleSettings>
+    <option name="FIELD_NAME_PREFIX" value="m" />
+    <option name="STATIC_FIELD_NAME_PREFIX" value="s" />
+    <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="9999" />
+    <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="9999" />
+    <option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
+      <value>
+        <package name="java.awt" withSubpackages="false" static="false" />
+        <package name="javax.swing" withSubpackages="false" static="false" />
+      </value>
+    </option>
+    <option name="IMPORT_LAYOUT_TABLE">
+      <value>
+        <package name="android" withSubpackages="true" static="true" />
+        <emptyLine />
+        <package name="androidx" withSubpackages="true" static="true" />
+        <emptyLine />
+        <package name="com" withSubpackages="true" static="true" />
+        <emptyLine />
+        <package name="dalvik" withSubpackages="true" static="true" />
+        <emptyLine />
+        <package name="junit" withSubpackages="true" static="true" />
+        <emptyLine />
+        <package name="org" withSubpackages="true" static="true" />
+        <emptyLine />
+        <package name="com.google.android.apps.chrome" withSubpackages="true" static="true" />
+        <emptyLine />
+        <package name="org.chromium" withSubpackages="true" static="true" />
+        <emptyLine />
+        <package name="java" withSubpackages="true" static="true" />
+        <emptyLine />
+        <package name="javax" withSubpackages="true" static="true" />
+        <emptyLine />
+        <package name="" withSubpackages="true" static="true" />
+        <emptyLine />
+        <package name="android" withSubpackages="true" static="false" />
+        <emptyLine />
+        <package name="androidx" withSubpackages="true" static="false" />
+        <emptyLine />
+        <package name="com" withSubpackages="true" static="false" />
+        <emptyLine />
+        <package name="dalvik" withSubpackages="true" static="false" />
+        <emptyLine />
+        <package name="junit" withSubpackages="true" static="false" />
+        <emptyLine />
+        <package name="org" withSubpackages="true" static="false" />
+        <emptyLine />
+        <package name="com.google.android.apps.chrome" withSubpackages="true" static="false" />
+        <emptyLine />
+        <package name="org.chromium" withSubpackages="true" static="false" />
+        <emptyLine />
+        <package name="java" withSubpackages="true" static="false" />
+        <emptyLine />
+        <package name="javax" withSubpackages="true" static="false" />
+        <emptyLine />
+        <package name="" withSubpackages="true" static="false" />
+      </value>
+    </option>
+  </JavaCodeStyleSettings>
   <XML>
-    <option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
+    <option name="XML_KEEP_LINE_BREAKS" value="true" />
   </XML>
   <ADDITIONAL_INDENT_OPTIONS fileType="java">
     <option name="TAB_SIZE" value="8" />
@@ -315,4 +314,4 @@
       </rules>
     </arrangement>
   </codeStyleSettings>
-</code_scheme>
+</code_scheme>
\ No newline at end of file
diff --git a/tools/android/checkstyle/chromium-style-5.0.xml b/tools/android/checkstyle/chromium-style-5.0.xml
index 50b877c..c5d6d808 100644
--- a/tools/android/checkstyle/chromium-style-5.0.xml
+++ b/tools/android/checkstyle/chromium-style-5.0.xml
@@ -220,6 +220,12 @@
       <property name="format" value="([dD]ummy)|([sS]anity)|([bB]lind)"/>
       <property name="message" value="&#xA;&#xA;Please use inclusive language where possible.&#xA;&#xA;Instead of 'dummy', use a term such as placeholder or empty (e.g. PlaceholderImpl, not DummyImpl).&#xA;Instead of 'sanity', use a term such as 'confidence' (e.g. confidence check, not sanity check).&#xA;Instead of 'blind', use a term such as unaware (e.g. being unaware of, not being blind to. unconfirmed change, not blind change).&#xA;&#xA;For more info see: https://developers.google.com/style/word-list&#xA;"/>
     </module>
+    <module name="RegexpSinglelineJava">
+      <property name="id" value="SettingsFragmentCheck"/>
+      <property name="severity" value="warning"/>
+      <property name="format" value="PreferenceFragment.*\ extends\ (PreferenceFragment|ChromeBaseSettingsFragment)"/>
+      <property name="message" value="Top level settings fragment should be named with suffix 'SettingsFragment' or 'Settings'. See //components/browser_ui/settings/README."/>
+    </module>
   </module>
   <module name="RegexpMultiline">
     <property name="id" value="VisibleForTestingForTesting"/>
diff --git a/tools/android/modularization/owners/owners_git.py b/tools/android/modularization/owners/owners_git.py
index 678c664..ab313413 100644
--- a/tools/android/modularization/owners/owners_git.py
+++ b/tools/android/modularization/owners/owners_git.py
@@ -44,7 +44,19 @@
   command = _build_ls_files_command(subdirectory)
   filepath_str = run_command(command, cwd=git_src)
   result = []
-  for relative_filepath in filepath_str.split('\n'):
+  for l in filepath_str.split('\n'):
+    # git ls-files -s produces output in the format:
+    #
+    # [mode bits] [hash]            [merge stage] [file path]
+    # 100644      0123456789abcdef  0             chrome/browser/Foo.java
+    #
+    # The first three octal numbers of |mode bits| are '100' for files, and
+    # checking that allows skipping gitlinks ('160') and symlinks ('120').
+    if not l.startswith('100'):
+      # ls-files returns all git files, such as files and gitlinks. Return only
+      # files, which start with 100.
+      continue
+    relative_filepath = l.split(maxsplit=3)[-1]
     if relative_filepath:
       absolute_filepath = os.path.join(git_src, relative_filepath)
       result.append(absolute_filepath)
@@ -53,9 +65,9 @@
 
 def _build_ls_files_command(subdirectory: Optional[str]) -> List[str]:
   if subdirectory:
-    return ['git', 'ls-files', '--', subdirectory]
+    return ['git', 'ls-files', '-s', '--', subdirectory]
   else:
-    return ['git', 'ls-files']
+    return ['git', 'ls-files', '-s']
 
 
 def _get_last_commit_in_dir(git_src: str, subdirectory: str,
diff --git a/tools/autotest.py b/tools/autotest.py
index 557994d0..4ac9b463 100755
--- a/tools/autotest.py
+++ b/tools/autotest.py
@@ -244,7 +244,18 @@
       print('Found possible matching file(s):')
       print('\n'.join(close))
 
-  test_files = exact if len(exact) > 0 else close
+  if len(exact) >= 1:
+    # Given "Foo", don't ask to disambiguate ModFoo.java vs Foo.java.
+    more_exact = [
+        p for p in exact if os.path.basename(p) in (target, f'{target}.java')
+    ]
+    if len(more_exact) == 1:
+      test_files = more_exact
+    else:
+      test_files = exact
+  else:
+    test_files = close
+
   if len(test_files) > 1:
     if len(test_files) < 10:
       test_files = [HaveUserPickFile(test_files)]
@@ -372,6 +383,7 @@
         f' one of the following targets to _TEST_TARGET_ALLOWLIST within '
         f'{__file__}: \n' + '\n'.join(targets))
 
+  test_targets.sort()
   target_cache.Store(paths, test_targets)
   target_cache.Save()
 
@@ -385,7 +397,8 @@
     else:
       test_targets = [HaveUserPickTarget(paths, test_targets)]
 
-  test_targets = list(set([t.split(':')[-1] for t in test_targets]))
+  # Remove the // prefix to turn GN label into ninja target.
+  test_targets = [t[2:] for t in test_targets]
 
   return (test_targets, used_cache)
 
@@ -394,13 +407,14 @@
                    no_try_android_wrappers, no_fast_local_dev):
 
   for target in targets:
+    target_binary = target.split(':')[1]
 
     # Look for the Android wrapper script first.
-    path = os.path.join(out_dir, 'bin', f'run_{target}')
+    path = os.path.join(out_dir, 'bin', f'run_{target_binary}')
     if no_try_android_wrappers or not os.path.isfile(path):
       # If the wrapper is not found or disabled use the Desktop target
       # which is an executable.
-      path = os.path.join(out_dir, target)
+      path = os.path.join(out_dir, target_binary)
     elif not no_fast_local_dev:
       # Usually want this flag when developing locally.
       extra_args = extra_args + ['--fast-local-dev']
diff --git a/tools/binary_size/generate_milestone_reports.py b/tools/binary_size/generate_milestone_reports.py
index 7d571da..2f4ca781 100755
--- a/tools/binary_size/generate_milestone_reports.py
+++ b/tools/binary_size/generate_milestone_reports.py
@@ -102,6 +102,7 @@
     '114.0.5735.4',
     '115.0.5790.5',
     '116.0.5845.20',
+    '117.0.5938.5',
 ]
 
 
diff --git a/tools/binary_size/libsupersize/viewer/caspian/caspian_web.cc b/tools/binary_size/libsupersize/viewer/caspian/caspian_web.cc
index aa1b867..dc6b833d 100644
--- a/tools/binary_size/libsupersize/viewer/caspian/caspian_web.cc
+++ b/tools/binary_size/libsupersize/viewer/caspian/caspian_web.cc
@@ -12,6 +12,7 @@
 #include <memory>
 #include <sstream>
 #include <string>
+#include <string_view>
 
 #include "third_party/jsoncpp/source/include/json/json.h"
 #include "third_party/re2/src/re2/re2.h"
@@ -32,7 +33,7 @@
 
   size_t remaining() { return kFilterBufferSize - (cursor_ - data_); }
   void Reset() { cursor_ = data_; }
-  re2::StringPiece Get() { return re2::StringPiece(data_, cursor_ - data_); }
+  std::string_view Get() { return std::string_view(data_, cursor_ - data_); }
 
   void Append(char c) {
     if (remaining() > 0) {
diff --git a/tools/clang/blink_gc_plugin/JsonWriter.h b/tools/clang/blink_gc_plugin/JsonWriter.h
index dd904e4f..d4737f63 100644
--- a/tools/clang/blink_gc_plugin/JsonWriter.h
+++ b/tools/clang/blink_gc_plugin/JsonWriter.h
@@ -42,15 +42,15 @@
   }
   void Write(const std::string& val) {
     Separator();
-    *os_ << "\"" << val << "\"";
+    *os_ << "\"" << Escape(val) << "\"";
   }
   void Write(const std::string& key, const size_t val) {
     Separator();
-    *os_ << "\"" << key << "\":" << val;
+    *os_ << "\"" << Escape(key) << "\":" << val;
   }
   void Write(const std::string& key, const std::string& val) {
     Separator();
-    *os_ << "\"" << key << "\":\"" << val << "\"";
+    *os_ << "\"" << Escape(key) << "\":\"" << Escape(val) << "\"";
   }
  private:
   JsonWriter(std::unique_ptr<llvm::raw_ostream> os) : os_(std::move(os)) {}
@@ -63,6 +63,15 @@
     }
     state_.top() = true;
   }
+  std::string Escape(const std::string& s) {
+    std::string copy = s;
+    size_t i = 0;
+    while ((i = copy.find('\\', i)) != std::string::npos) {
+      copy.replace(i, 1, "\\\\");
+      i += 2;
+    }
+    return copy;
+  }
   std::unique_ptr<llvm::raw_ostream> os_;
   std::stack<bool> state_;
 };
diff --git a/tools/clang/plugins/FindBadConstructsAction.cpp b/tools/clang/plugins/FindBadConstructsAction.cpp
index 472fb8b..8d5c67a7 100644
--- a/tools/clang/plugins/FindBadConstructsAction.cpp
+++ b/tools/clang/plugins/FindBadConstructsAction.cpp
@@ -25,6 +25,14 @@
 // that matches paths that should be excluded from the raw_ptr checks.
 const char kRawPtrExcludePathArgPrefix[] = "raw-ptr-exclude-path=";
 
+// Name of a cmdline parameter that can be used to add a regular expressions
+// that matches function names that should be excluded from the bad raw_ptr cast
+// checks. All implicit casts in CallExpr to the specified functions are
+// excluded from the check. Use if you know that function does not break a
+// reference count.
+const char kCheckBadRawPtrCastExcludeFuncArgPrefix[] =
+    "check-bad-raw-ptr-cast-exclude-func=";
+
 }  // namespace
 
 namespace chrome_checker {
@@ -64,6 +72,9 @@
     } else if (arg.startswith(kRawPtrExcludePathArgPrefix)) {
       options_.raw_ptr_paths_to_exclude_lines.push_back(
           arg.substr(strlen(kRawPtrExcludePathArgPrefix)).str());
+    } else if (arg.startswith(kCheckBadRawPtrCastExcludeFuncArgPrefix)) {
+      options_.check_bad_raw_ptr_cast_exclude_funcs.push_back(
+          arg.substr(strlen(kCheckBadRawPtrCastExcludeFuncArgPrefix)).str());
     } else if (arg == "check-base-classes") {
       // TODO(rsleevi): Remove this once http://crbug.com/123295 is fixed.
       options_.check_base_classes = true;
@@ -86,7 +97,7 @@
     } else if (arg == "check-raw-ref-fields") {
       options_.check_raw_ref_fields = true;
     } else if (arg == "raw-ptr-fix-crbug-1449812") {
-      options_.raw_ptr_fix_crbug_1449812 = true;
+      // TODO(mikt): Now enabled by default. Remove this path.
     } else {
       llvm::errs() << "Unknown clang plugin argument: " << arg << "\n";
       return false;
diff --git a/tools/clang/plugins/FindBadRawPtrPatterns.cpp b/tools/clang/plugins/FindBadRawPtrPatterns.cpp
index ffbad54..c6742383 100644
--- a/tools/clang/plugins/FindBadRawPtrPatterns.cpp
+++ b/tools/clang/plugins/FindBadRawPtrPatterns.cpp
@@ -35,8 +35,12 @@
 
 class BadCastMatcher : public MatchFinder::MatchCallback {
  public:
-  explicit BadCastMatcher(clang::CompilerInstance& compiler)
-      : compiler_(compiler) {
+  explicit BadCastMatcher(clang::CompilerInstance& compiler,
+                          const FilterFile& exclude_files,
+                          const FilterFile& exclude_functions)
+      : compiler_(compiler),
+        exclude_files_(exclude_files),
+        exclude_functions_(exclude_functions) {
     error_bad_cast_signature_ = compiler_.getDiagnostics().getCustomDiagID(
         clang::DiagnosticsEngine::Error, kBadCastDiagnostic);
     note_bad_cast_signature_explanation_ =
@@ -47,7 +51,8 @@
   }
 
   void Register(MatchFinder& match_finder) {
-    auto cast_matcher = BadRawPtrCastExpr(casting_unsafe_predicate_);
+    auto cast_matcher = BadRawPtrCastExpr(casting_unsafe_predicate_,
+                                          exclude_files_, exclude_functions_);
     match_finder.addMatcher(cast_matcher, this);
   }
 
@@ -101,6 +106,8 @@
 
  private:
   clang::CompilerInstance& compiler_;
+  const FilterFile& exclude_files_;
+  const FilterFile& exclude_functions_;
   CastingUnsafePredicate casting_unsafe_predicate_;
   unsigned error_bad_cast_signature_;
   unsigned note_bad_cast_signature_explanation_;
@@ -233,16 +240,14 @@
                            clang::CompilerInstance& compiler) {
   MatchFinder match_finder;
 
-  BadCastMatcher bad_cast_matcher(compiler);
-  if (options.check_bad_raw_ptr_cast)
-    bad_cast_matcher.Register(match_finder);
-
   std::vector<std::string> paths_to_exclude_lines;
+  std::vector<std::string> separate_repository_paths;
   for (auto* const line : kRawPtrManualPathsToIgnore) {
     paths_to_exclude_lines.push_back(line);
   }
   for (auto* const line : kSeparateRepositoryPaths) {
     paths_to_exclude_lines.push_back(line);
+    separate_repository_paths.push_back(line);
   }
   paths_to_exclude_lines.insert(paths_to_exclude_lines.end(),
                                 options.raw_ptr_paths_to_exclude_lines.begin(),
@@ -250,10 +255,19 @@
 
   FilterFile exclude_fields(options.exclude_fields_file, "exclude-fields");
   FilterFile exclude_lines(paths_to_exclude_lines);
+  FilterFile exclude_separate_repositories(separate_repository_paths);
+  FilterFile check_bad_raw_ptr_cast_exclude_funcs(
+      options.check_bad_raw_ptr_cast_exclude_funcs);
   StackAllocatedPredicate stack_allocated_predicate;
   RawPtrAndRefExclusionsOptions exclusion_options{
       &exclude_fields, &exclude_lines, options.check_raw_ptr_to_stack_allocated,
-      &stack_allocated_predicate, options.raw_ptr_fix_crbug_1449812};
+      &stack_allocated_predicate};
+
+  BadCastMatcher bad_cast_matcher(compiler, exclude_separate_repositories,
+                                  check_bad_raw_ptr_cast_exclude_funcs);
+  if (options.check_bad_raw_ptr_cast) {
+    bad_cast_matcher.Register(match_finder);
+  }
 
   RawPtrFieldMatcher field_matcher(compiler, exclusion_options);
   if (options.check_raw_ptr_fields) {
diff --git a/tools/clang/plugins/Options.h b/tools/clang/plugins/Options.h
index 46fb07fd..e7efe86 100644
--- a/tools/clang/plugins/Options.h
+++ b/tools/clang/plugins/Options.h
@@ -21,9 +21,9 @@
   bool check_stack_allocated = false;
   bool check_raw_ref_fields = false;
   bool check_raw_ptr_to_stack_allocated = false;
-  bool raw_ptr_fix_crbug_1449812 = false;
   std::string exclude_fields_file;
   std::vector<std::string> raw_ptr_paths_to_exclude_lines;
+  std::vector<std::string> check_bad_raw_ptr_cast_exclude_funcs;
 };
 
 }  // namespace chrome_checker
diff --git a/tools/clang/plugins/RawPtrHelpers.cpp b/tools/clang/plugins/RawPtrHelpers.cpp
index 0e41198d..585862f 100644
--- a/tools/clang/plugins/RawPtrHelpers.cpp
+++ b/tools/clang/plugins/RawPtrHelpers.cpp
@@ -123,55 +123,24 @@
 //    }
 clang::ast_matchers::internal::Matcher<clang::NamedDecl> PtrAndRefExclusions(
     const RawPtrAndRefExclusionsOptions& options) {
-  if (!options.fix_crbug_1449812) {
-    // Before fix for crbug.com/1449812
-    // - File exclusion is performed based on the `SourceLocation` obtained
-    //   via `getBeginLoc()`.
-    // - System header check is based on expansion location.
-    if (!options.should_exclude_stack_allocated_records) {
-      return anyOf(
-          isExpansionInSystemHeader(), isInExternCContext(),
-          isRawPtrExclusionAnnotated(), isBeginInThirdPartyLocation(),
-          isBeginInGeneratedLocation(),
-          isBeginInLocationListedInFilterFile(options.paths_to_exclude),
-          isFieldDeclListedInFilterFile(options.fields_to_exclude),
-          ImplicitFieldDeclaration(), isObjCSynthesize());
-    } else {
-      return anyOf(
-          isExpansionInSystemHeader(), isInExternCContext(),
-          isRawPtrExclusionAnnotated(), isBeginInThirdPartyLocation(),
-          isBeginInGeneratedLocation(),
-          isBeginInLocationListedInFilterFile(options.paths_to_exclude),
-          isFieldDeclListedInFilterFile(options.fields_to_exclude),
-          ImplicitFieldDeclaration(), isObjCSynthesize(),
-          hasDescendant(
-              StackAllocatedQualType(options.stack_allocated_predicate)),
-          isDeclaredInStackAllocated(*options.stack_allocated_predicate));
-    }
+  if (!options.should_exclude_stack_allocated_records) {
+    return anyOf(isSpellingInSystemHeader(), isInExternCContext(),
+                 isRawPtrExclusionAnnotated(), isInThirdPartyLocation(),
+                 isInGeneratedLocation(), isNotSpelledInSource(),
+                 isInLocationListedInFilterFile(options.paths_to_exclude),
+                 isFieldDeclListedInFilterFile(options.fields_to_exclude),
+                 ImplicitFieldDeclaration(), isObjCSynthesize());
   } else {
-    // After fix for crbug.com/1449812
-    // - File exclusion is performed based on the `SourceLocation` obtained
-    //   via `getLocation()`.
-    // - System header check is based on spelling location.
-    if (!options.should_exclude_stack_allocated_records) {
-      return anyOf(isSpellingInSystemHeader(), isInExternCContext(),
-                   isRawPtrExclusionAnnotated(), isInThirdPartyLocation(),
-                   isInGeneratedLocation(), isNotSpelledInSource(),
-                   isInLocationListedInFilterFile(options.paths_to_exclude),
-                   isFieldDeclListedInFilterFile(options.fields_to_exclude),
-                   ImplicitFieldDeclaration(), isObjCSynthesize());
-    } else {
-      return anyOf(
-          isSpellingInSystemHeader(), isInExternCContext(),
-          isRawPtrExclusionAnnotated(), isInThirdPartyLocation(),
-          isInGeneratedLocation(), isNotSpelledInSource(),
-          isInLocationListedInFilterFile(options.paths_to_exclude),
-          isFieldDeclListedInFilterFile(options.fields_to_exclude),
-          ImplicitFieldDeclaration(), isObjCSynthesize(),
-          hasDescendant(
-              StackAllocatedQualType(options.stack_allocated_predicate)),
-          isDeclaredInStackAllocated(*options.stack_allocated_predicate));
-    }
+    return anyOf(
+        isSpellingInSystemHeader(), isInExternCContext(),
+        isRawPtrExclusionAnnotated(), isInThirdPartyLocation(),
+        isInGeneratedLocation(), isNotSpelledInSource(),
+        isInLocationListedInFilterFile(options.paths_to_exclude),
+        isFieldDeclListedInFilterFile(options.fields_to_exclude),
+        ImplicitFieldDeclaration(), isObjCSynthesize(),
+        hasDescendant(
+            StackAllocatedQualType(options.stack_allocated_predicate)),
+        isDeclaredInStackAllocated(*options.stack_allocated_predicate));
   }
 }
 
@@ -211,23 +180,12 @@
       fieldDecl(hasType(pointerType(pointee(qualType(allOf(
           isConstQualified(), hasUnqualifiedDesugaredType(anyCharType())))))));
 
-  if (!options.fix_crbug_1449812) {
-    auto field_decl_matcher =
-        fieldDecl(allOf(hasType(supported_pointer_types_matcher),
-                        unless(anyOf(const_char_pointer_matcher,
-                                     isBeginInScratchSpace(),
-                                     PtrAndRefExclusions(options)))))
-            .bind("affectedFieldDecl");
-    return field_decl_matcher;
-  } else {
-    // `isBeginInScratchSpace()` check is done inside `PtrAndRefExclusions`.
     auto field_decl_matcher =
         fieldDecl(allOf(hasType(supported_pointer_types_matcher),
                         unless(anyOf(const_char_pointer_matcher,
                                      PtrAndRefExclusions(options)))))
             .bind("affectedFieldDecl");
     return field_decl_matcher;
-  }
 }
 
 clang::ast_matchers::internal::Matcher<clang::Decl> AffectedRawRefFieldDecl(
@@ -318,7 +276,9 @@
 }
 
 clang::ast_matchers::internal::Matcher<clang::Stmt> BadRawPtrCastExpr(
-    const CastingUnsafePredicate& casting_unsafe_predicate) {
+    const CastingUnsafePredicate& casting_unsafe_predicate,
+    const FilterFile& exclude_files,
+    const FilterFile& exclude_functions) {
   // Matches anything contains |raw_ptr<T>| / |raw_ref<T>|.
   auto src_type =
       type(isCastingUnsafe(casting_unsafe_predicate)).bind("srcType");
@@ -332,13 +292,76 @@
                                   hasCastKind(clang::CK_PointerToIntegral),
                                   hasCastKind(clang::CK_IntegralToPointer)));
 
-  // |__bit/bit_cast.h| header is excluded to perform checking on
-  // |std::bit_cast<T>|.
-  auto exclusions = anyOf(isSpellingInSystemHeader(), isInRawPtrCastHeader());
+  // Matches implicit casts happening in invocation inside template context.
+  //   void f(int v);
+  //   void f(void* p);
+  //   template <typename T>
+  //   void call_f(T t) { f(t); }
+  //                        ^ implicit cast here if |T| = |int*|
+  // We exclude this cast from check because we cannot apply
+  // |base::unsafe_raw_ptr_*_cast<void*>(t)| here.
+  auto in_template_invocation_ctx = implicitCastExpr(
+      allOf(isInTemplateInstantiation(), hasParent(invocation())));
+
+  // Matches implicit casts happening in comparison.
+  //   int* x;
+  //   void* y;
+  //   if (x < y) f();
+  //       ^~~~~ |x| is implicit casted into |void*| here
+  // This cast is guaranteed to be safe because it cannot break ref count.
+  auto in_comparison_ctx =
+      implicitCastExpr(hasParent(binaryOperator(isComparisonOperator())));
+
+  // Matches implicit casts happening in invocation to allow-listed
+  // declarations.
+  auto in_allowlisted_invocation_ctx =
+      implicitCastExpr(hasParent(invocation(hasDeclaration(
+          namedDecl(isFieldDeclListedInFilterFile(&exclude_functions))))));
+
+  // Matches casts to const pointer types pointing to built-in types.
+  // e.g. matches |const char*| and |const void*| but neither |const int**| nor
+  // |int* const*|.
+  // They are safe as long as const qualifier is kept because const means we
+  // shouldn't be writing to the memory and won't mutate the value in a way that
+  // causes BRP's refcount inconsistency.
+  auto const_builtin_pointer_type =
+      type(hasUnqualifiedDesugaredType(pointerType(
+          pointee(qualType(allOf(isConstQualified(), builtinType()))))));
+  auto cast_expr_to_const_pointer = anyOf(
+      implicitCastExpr(hasImplicitDestinationType(const_builtin_pointer_type)),
+      explicitCastExpr(hasDestinationType(const_builtin_pointer_type)));
+
+  // Unsafe castings are allowed if:
+  // - In locations developers have no control
+  //   - In system headers
+  //   - In third party libraries
+  //   - In non-source locations (e.g. <scratch space>)
+  //   - In separate repository locations (e.g. //internal)
+  // - In locations that are likely to be safe
+  //   - In pointer comparison context
+  //   - In allowlisted function/constructor invocations
+  //   - To const-qualified void/char pointers
+  // - In cases that the cast is indispensable and developers can guarantee it
+  //   will not break BRP's refcount
+  //   - In |base::unsafe_raw_ptr_static_cast<T>(...)|
+  //   - In |base::unsafe_raw_ptr_reinterpret_cast<T>(...)|
+  //   - In |base::unsafe_raw_ptr_bit_cast<T>(...)|
+  // - In cases that the cast is indispensable but developers cannot use the
+  //   cast exclusion listed above
+  //   - Implicit casts inside template context as there can be multiple
+  //     destination types depending on how template is instantiated
+  auto exclusions =
+      anyOf(isSpellingInSystemHeader(), isInThirdPartyLocation(),
+            isNotSpelledInSource(),
+            isInLocationListedInFilterFile(&exclude_files), in_comparison_ctx,
+            in_allowlisted_invocation_ctx, cast_expr_to_const_pointer,
+            isInRawPtrCastHeader(), in_template_invocation_ctx);
 
   // Implicit/explicit casting from/to |raw_ptr<T>| matches.
   // Both casting direction is unsafe.
   //   https://godbolt.org/z/zqKMzcKfo
+  // |__bit/bit_cast.h| header is configured to bypass exclusions to perform
+  // checking on |std::bit_cast<T>|.
   auto cast_matcher =
       castExpr(
           allOf(anyOf(hasSourceExpression(hasType(src_type)),
diff --git a/tools/clang/plugins/RawPtrHelpers.h b/tools/clang/plugins/RawPtrHelpers.h
index 62b924a..0ceb5bd 100644
--- a/tools/clang/plugins/RawPtrHelpers.h
+++ b/tools/clang/plugins/RawPtrHelpers.h
@@ -70,8 +70,6 @@
   FilterFile* paths_to_exclude;
   bool should_exclude_stack_allocated_records;
   chrome_checker::StackAllocatedPredicate* stack_allocated_predicate;
-  // Enable a fix for https://crbug.com/1449812 when true.
-  bool fix_crbug_1449812;
 };
 
 AST_MATCHER(clang::Type, anyCharType) {
@@ -95,19 +93,6 @@
          source_manager.isWrittenInScratchSpace(loc);
 }
 
-// TODO(mikt): Remove after option `raw-ptr-fix-crbug-1449812` is fully enabled.
-AST_MATCHER(clang::Decl, isBeginInScratchSpace) {
-  const clang::SourceManager& source_manager =
-      Finder->getASTContext().getSourceManager();
-  clang::SourceLocation location = Node.getSourceRange().getBegin();
-  if (location.isInvalid()) {
-    return false;
-  }
-  clang::SourceLocation spelling_location =
-      source_manager.getSpellingLoc(location);
-  return source_manager.isWrittenInScratchSpace(spelling_location);
-}
-
 AST_POLYMORPHIC_MATCHER(isInThirdPartyLocation,
                         AST_POLYMORPHIC_SUPPORTED_TYPES(clang::Decl,
                                                         clang::Stmt,
@@ -126,22 +111,6 @@
   return filename.find("/third_party/") != std::string::npos;
 }
 
-// TODO(mikt): Remove after option `raw-ptr-fix-crbug-1449812` is fully enabled.
-AST_MATCHER(clang::Decl, isBeginInThirdPartyLocation) {
-  std::string filename = GetFilename(Finder->getASTContext().getSourceManager(),
-                                     Node.getSourceRange().getBegin());
-
-  // Blink is part of the Chromium git repo, even though it contains
-  // "third_party" in its path.
-  if (filename.find("/third_party/blink/") != std::string::npos) {
-    return false;
-  }
-  // Otherwise, just check if the paths contains the "third_party" substring.
-  // We don't want to rewrite content of such paths even if they are in the main
-  // Chromium git repository.
-  return filename.find("/third_party/") != std::string::npos;
-}
-
 AST_MATCHER(clang::Stmt, isInStdBitCastHeader) {
   std::string filename = GetFilename(Finder->getASTContext().getSourceManager(),
                                      Node.getSourceRange().getBegin());
@@ -167,15 +136,6 @@
          filename.rfind("gen/", 0) == 0;
 }
 
-// TODO(mikt): Remove after option `raw-ptr-fix-crbug-1449812` is fully enabled.
-AST_MATCHER(clang::Decl, isBeginInGeneratedLocation) {
-  std::string filename = GetFilename(Finder->getASTContext().getSourceManager(),
-                                     Node.getSourceRange().getBegin());
-
-  return filename.find("/gen/") != std::string::npos ||
-         filename.rfind("gen/", 0) == 0;
-}
-
 AST_MATCHER_P(clang::NamedDecl,
               isFieldDeclListedInFilterFile,
               const FilterFile*,
@@ -183,10 +143,12 @@
   return Filter->ContainsLine(Node.getQualifiedNameAsString());
 }
 
-AST_MATCHER_P(clang::Decl,
-              isInLocationListedInFilterFile,
-              const FilterFile*,
-              Filter) {
+AST_POLYMORPHIC_MATCHER_P(isInLocationListedInFilterFile,
+                          AST_POLYMORPHIC_SUPPORTED_TYPES(clang::Decl,
+                                                          clang::Stmt,
+                                                          clang::TypeLoc),
+                          const FilterFile*,
+                          Filter) {
   clang::SourceLocation loc = getRepresentativeLocation(Node);
   if (loc.isInvalid()) {
     return false;
@@ -196,20 +158,6 @@
   return Filter->ContainsSubstringOf(file_path);
 }
 
-// TODO(mikt): Remove after option `raw-ptr-fix-crbug-1449812` is fully enabled.
-AST_MATCHER_P(clang::Decl,
-              isBeginInLocationListedInFilterFile,
-              const FilterFile*,
-              Filter) {
-  clang::SourceLocation loc = Node.getSourceRange().getBegin();
-  if (loc.isInvalid()) {
-    return false;
-  }
-  std::string file_path =
-      GetFilename(Finder->getASTContext().getSourceManager(), loc);
-  return Filter->ContainsSubstringOf(file_path);
-}
-
 AST_MATCHER(clang::Decl, isInExternCContext) {
   return Node.getLexicalDeclContext()->isExternCContext();
 }
@@ -311,7 +259,9 @@
     const chrome_checker::StackAllocatedPredicate* predicate);
 
 clang::ast_matchers::internal::Matcher<clang::Stmt> BadRawPtrCastExpr(
-    const CastingUnsafePredicate& casting_unsafe_predicate);
+    const CastingUnsafePredicate& casting_unsafe_predicate,
+    const FilterFile& exclude_files,
+    const FilterFile& exclude_functions);
 
 // If `field_decl` declares a field in an implicit template specialization, then
 // finds and returns the corresponding FieldDecl from the template definition.
diff --git a/tools/clang/plugins/Util.h b/tools/clang/plugins/Util.h
index 9fa14352..7da2c7bd 100644
--- a/tools/clang/plugins/Util.h
+++ b/tools/clang/plugins/Util.h
@@ -33,8 +33,20 @@
 inline clang::SourceLocation getRepresentativeLocation(
     const clang::Stmt& node) {
   // clang::Stmt has T::getBeginLoc() and T::getEndLoc().
-  // As the former may refer to modifiers, we use the latter one.
-  return node.getEndLoc();
+  // Usually the former one does better represent the location.
+  //
+  // e.g. clang::IfStmt
+  // if (foo) {} else {}
+  // ^                 ^
+  // |                 getEndLoc()
+  // getBeginLoc()
+  //
+  // e.g. clang::CastExpr
+  // int x = static_cast<int>(123ll);
+  //         ^                     ^
+  //         |                     getEndLoc()
+  //         getBeginLoc()
+  return node.getBeginLoc();
 }
 inline clang::SourceLocation getRepresentativeLocation(
     const clang::TypeLoc& node) {
diff --git a/tools/clang/plugins/tests/bad_raw_ptr_cast_implicit_exclusion.cpp b/tools/clang/plugins/tests/bad_raw_ptr_cast_implicit_exclusion.cpp
new file mode 100644
index 0000000..6454aabc
--- /dev/null
+++ b/tools/clang/plugins/tests/bad_raw_ptr_cast_implicit_exclusion.cpp
@@ -0,0 +1,65 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/memory/raw_ptr.h"
+
+struct RawPtrWrapper {
+  raw_ptr<int> ptr;
+};
+
+void OverloadedFunction(void* p) {}
+void OverloadedFunction(int v) {}
+
+namespace test {
+void NormalFunc(void* p) {}
+void AllowlistedFunc(void* p) {}
+struct AllowlistedConstructor {
+  explicit AllowlistedConstructor(void* p) {}
+};
+struct NormalConstructor {
+  explicit NormalConstructor(void* p) {}
+};
+}  // namespace test
+
+// 'unsafe_raw_ptr_*_cast' should not emit errors.
+void CastToCastingUnsafeExclusion() {
+  void* p = nullptr;
+  RawPtrWrapper* q = nullptr;
+
+  // Base case: should error.
+  (void)reinterpret_cast<RawPtrWrapper*>(p);
+  (void)reinterpret_cast<void*>(q);
+
+  // Casts to const built-in typed pointers should be excluded.
+  (void)reinterpret_cast<const void*>(q);
+  (void)reinterpret_cast<const char*>(q);
+
+  // Casts in allowlisted invocation context should be excluded.
+  test::NormalFunc(q);                    // Not allowlisted
+  test::AllowlistedFunc(q);               // Allowlisted
+  (void)test::NormalConstructor(q);       // Not allowlisted
+  (void)test::AllowlistedConstructor(q);  // Allowlisted
+
+  // Casts in comparison context should be excluded.
+  (void)(p == q);
+  //          ^ implicit cast from |RawPtrWrapper*| to |void*| here.
+
+  // Implicit casts in invocation inside template context should be excluded.
+  auto f = [](auto* x) { OverloadedFunction(x); };
+  f(p);
+  f(q);
+
+  // Casts that |isNotSpelledInSource()| should be excluded.
+#define ANY_CAST(type) type##_cast
+  (void)ANY_CAST(reinterpret)<RawPtrWrapper*>(p);
+  //    ^~~~~~~~ token "reinterpret_cast" is in <scratch space>.
+
+  // Casts that |isInThirdPartyLocation()| should be excluded.
+#line 1 "../../third_party/fake_loc/bad_raw_ptr_cast_implicit_exclusion.cpp"
+  (void)reinterpret_cast<RawPtrWrapper*>(p);
+
+  // Casts that |isInLocationListedInFilterFile(...)| should be excluded.
+#line 1 "../../internal/fake_loc/bad_raw_ptr_cast_implicit_exclusion.cpp"
+  (void)reinterpret_cast<RawPtrWrapper*>(p);
+}
diff --git a/tools/clang/plugins/tests/bad_raw_ptr_cast_implicit_exclusion.flags b/tools/clang/plugins/tests/bad_raw_ptr_cast_implicit_exclusion.flags
new file mode 100644
index 0000000..cf4bfa4
--- /dev/null
+++ b/tools/clang/plugins/tests/bad_raw_ptr_cast_implicit_exclusion.flags
@@ -0,0 +1 @@
+-Xclang -plugin-arg-find-bad-constructs -Xclang check-bad-raw-ptr-cast -Xclang -plugin-arg-find-bad-constructs -Xclang check-bad-raw-ptr-cast-exclude-func=test::AllowlistedFunc -Xclang -plugin-arg-find-bad-constructs -Xclang check-bad-raw-ptr-cast-exclude-func=test::AllowlistedConstructor::AllowlistedConstructor
diff --git a/tools/clang/plugins/tests/bad_raw_ptr_cast_implicit_exclusion.txt b/tools/clang/plugins/tests/bad_raw_ptr_cast_implicit_exclusion.txt
new file mode 100644
index 0000000..e469507
--- /dev/null
+++ b/tools/clang/plugins/tests/bad_raw_ptr_cast_implicit_exclusion.txt
@@ -0,0 +1,29 @@
+bad_raw_ptr_cast_implicit_exclusion.cpp:31:43: error: [chromium-style] casting 'void *' to 'RawPtrWrapper * is not allowed.
+  (void)reinterpret_cast<RawPtrWrapper*>(p);
+                                          ^
+bad_raw_ptr_cast_implicit_exclusion.cpp:31:43: note: [chromium-style] 'RawPtrWrapper *' manages BackupRefPtr refcounts; bypassing its C++ interface or treating it as a POD will lead to memory safety errors.
+bad_raw_ptr_cast_implicit_exclusion.cpp:8:3: note: [chromium-style] 'RawPtrWrapper' manages BackupRefPtr or its container here.
+  raw_ptr<int> ptr;
+  ^
+bad_raw_ptr_cast_implicit_exclusion.cpp:32:34: error: [chromium-style] casting 'RawPtrWrapper *' to 'void * is not allowed.
+  (void)reinterpret_cast<void*>(q);
+                                 ^
+bad_raw_ptr_cast_implicit_exclusion.cpp:32:34: note: [chromium-style] 'RawPtrWrapper *' manages BackupRefPtr refcounts; bypassing its C++ interface or treating it as a POD will lead to memory safety errors.
+bad_raw_ptr_cast_implicit_exclusion.cpp:8:3: note: [chromium-style] 'RawPtrWrapper' manages BackupRefPtr or its container here.
+  raw_ptr<int> ptr;
+  ^
+bad_raw_ptr_cast_implicit_exclusion.cpp:39:20: error: [chromium-style] casting 'RawPtrWrapper *' to 'void * is not allowed.
+  test::NormalFunc(q);                    // Not allowlisted
+                   ^
+bad_raw_ptr_cast_implicit_exclusion.cpp:39:20: note: [chromium-style] 'RawPtrWrapper *' manages BackupRefPtr refcounts; bypassing its C++ interface or treating it as a POD will lead to memory safety errors.
+bad_raw_ptr_cast_implicit_exclusion.cpp:8:3: note: [chromium-style] 'RawPtrWrapper' manages BackupRefPtr or its container here.
+  raw_ptr<int> ptr;
+  ^
+bad_raw_ptr_cast_implicit_exclusion.cpp:41:33: error: [chromium-style] casting 'RawPtrWrapper *' to 'void * is not allowed.
+  (void)test::NormalConstructor(q);       // Not allowlisted
+                                ^
+bad_raw_ptr_cast_implicit_exclusion.cpp:41:33: note: [chromium-style] 'RawPtrWrapper *' manages BackupRefPtr refcounts; bypassing its C++ interface or treating it as a POD will lead to memory safety errors.
+bad_raw_ptr_cast_implicit_exclusion.cpp:8:3: note: [chromium-style] 'RawPtrWrapper' manages BackupRefPtr or its container here.
+  raw_ptr<int> ptr;
+  ^
+4 errors generated.
diff --git a/tools/clang/plugins/tests/raw_ptr_fields_macro.flags b/tools/clang/plugins/tests/raw_ptr_fields_macro.flags
index 6f010e60..9883af5 100644
--- a/tools/clang/plugins/tests/raw_ptr_fields_macro.flags
+++ b/tools/clang/plugins/tests/raw_ptr_fields_macro.flags
@@ -1 +1 @@
--Xclang -plugin-arg-find-bad-constructs -Xclang check-raw-ptr-fields -Xclang -plugin-arg-find-bad-constructs -Xclang raw-ptr-fix-crbug-1449812 -Wno-unknown-attributes -ferror-limit=0 -DCMD_INT=int -DCMD_INTP=int* -DCMD_CONST=const -DCMD_ATTR=[[fake_attribute]] -DCMD_INTP_FIELD()=int*macro_ptr -DCMD_TYPE_WITH_SUFFIX(TYP)=TYP##Suffix -DCMD_SYMBOL(SYM)=SYM -DCMD_SYMBOL_WITH_SUFFIX(SYM)=SYM##_suffix -DCMD_EQ== -DCMD_NULLPTR=nullptr
+-Xclang -plugin-arg-find-bad-constructs -Xclang check-raw-ptr-fields -Wno-unknown-attributes -ferror-limit=0 -DCMD_INT=int -DCMD_INTP=int* -DCMD_CONST=const -DCMD_ATTR=[[fake_attribute]] -DCMD_INTP_FIELD()=int*macro_ptr -DCMD_TYPE_WITH_SUFFIX(TYP)=TYP##Suffix -DCMD_SYMBOL(SYM)=SYM -DCMD_SYMBOL_WITH_SUFFIX(SYM)=SYM##_suffix -DCMD_EQ== -DCMD_NULLPTR=nullptr
diff --git a/tools/clang/plugins/tests/raw_ptr_fields_scratch_space.cpp b/tools/clang/plugins/tests/raw_ptr_fields_scratch_space.cpp
deleted file mode 100644
index 47957f6..0000000
--- a/tools/clang/plugins/tests/raw_ptr_fields_scratch_space.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// // Based on third_party/brotli/enc/metablock_inc.h
-
-class HistogramLiteral;
-
-#define FN(X) X##Literal
-#include "raw_ptr_fields_scratch_space_inc.h" /* NOLINT(build/include) */
-#undef FN
diff --git a/tools/clang/plugins/tests/raw_ptr_fields_scratch_space.flags b/tools/clang/plugins/tests/raw_ptr_fields_scratch_space.flags
deleted file mode 100644
index cb3c8b65..0000000
--- a/tools/clang/plugins/tests/raw_ptr_fields_scratch_space.flags
+++ /dev/null
@@ -1 +0,0 @@
--Xclang -plugin-arg-find-bad-constructs -Xclang check-raw-ptr-fields
diff --git a/tools/clang/plugins/tests/raw_ptr_fields_scratch_space.txt b/tools/clang/plugins/tests/raw_ptr_fields_scratch_space.txt
deleted file mode 100644
index e69de29..0000000
--- a/tools/clang/plugins/tests/raw_ptr_fields_scratch_space.txt
+++ /dev/null
diff --git a/tools/clang/plugins/tests/raw_ptr_fields_scratch_space_inc.h b/tools/clang/plugins/tests/raw_ptr_fields_scratch_space_inc.h
deleted file mode 100644
index f9dc447..0000000
--- a/tools/clang/plugins/tests/raw_ptr_fields_scratch_space_inc.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// NOLINT(build/header_guard)
-// no-include-guard-because-multiply-included
-
-// FN is a macro that appends a suffix to a given name. In the real code (in
-// metablock.c), FN is redefined, then this file is included reapeatedly to
-// generate the same code for names with different suffixes.
-
-// For this test, HistogramType will expand to HistogramLiteral.
-#define HistogramType FN(Histogram)
-
-// For this test, FN(BlockSplitter) will expand to BlockSplitterLiteral.
-struct FN(BlockSplitter) {
-  // No error expected, as the source location for this field declaration will
-  // be "<scratch space>" and the real file path cannot be detected.
-  HistogramType* histograms_;
-};
diff --git a/tools/clang/rewrite_raw_ptr_fields/RewriteRawPtrFields.cpp b/tools/clang/rewrite_raw_ptr_fields/RewriteRawPtrFields.cpp
index f431e7c6..701e1ed 100644
--- a/tools/clang/rewrite_raw_ptr_fields/RewriteRawPtrFields.cpp
+++ b/tools/clang/rewrite_raw_ptr_fields/RewriteRawPtrFields.cpp
@@ -34,6 +34,7 @@
 
 #include "RawPtrHelpers.h"
 #include "RawPtrManualPathsToIgnore.h"
+#include "SeparateRepositoryPaths.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/ASTMatchers/ASTMatchers.h"
@@ -1213,10 +1214,6 @@
       llvm::cl::desc("Exclude pointers/references to `STACK_ALLOCATED` objects "
                      "from the rewrite"));
 
-  llvm::cl::opt<bool> raw_ptr_fix_crbug_1449812(
-      "raw_ptr_fix_crbug_1449812", llvm::cl::init(true),
-      llvm::cl::desc("Apply a fix for crbug.com/1449812"));
-
   llvm::Expected<clang::tooling::CommonOptionsParser> options =
       clang::tooling::CommonOptionsParser::create(argc, argv, category);
   assert(static_cast<bool>(options));  // Should not return an error.
@@ -1238,6 +1235,9 @@
     for (auto* const line : kRawPtrManualPathsToIgnore) {
       paths_to_exclude_lines.push_back(line);
     }
+    for (auto* const line : kSeparateRepositoryPaths) {
+      paths_to_exclude_lines.push_back(line);
+    }
     paths_to_exclude = std::make_unique<FilterFile>(paths_to_exclude_lines);
   } else {
     paths_to_exclude =
@@ -1248,7 +1248,7 @@
   chrome_checker::StackAllocatedPredicate stack_allocated_checker;
   RawPtrAndRefExclusionsOptions exclusion_options{
       &fields_to_exclude, paths_to_exclude.get(), exclude_stack_allocated,
-      &stack_allocated_checker, raw_ptr_fix_crbug_1449812};
+      &stack_allocated_checker};
 
   RawPtrRewriter raw_ptr_rewriter(&output_helper, match_finder,
                                   exclusion_options);
diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py
index 2e84b050..e931b3d 100755
--- a/tools/clang/scripts/build.py
+++ b/tools/clang/scripts/build.py
@@ -721,11 +721,6 @@
 
   global CLANG_REVISION, PACKAGE_VERSION, LLVM_BUILD_DIR
 
-  # TODO(crbug.com/1467585): Remove in next Clang roll.
-  if args.llvm_force_head_revision:
-    global RELEASE_VERSION
-    RELEASE_VERSION = '18'
-
   if (args.pgo or args.thinlto) and not args.bootstrap:
     print('--pgo/--thinlto requires --bootstrap')
     return 1
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 82f9c4f..20c4147 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -35,11 +35,11 @@
 # https://chromium.googlesource.com/chromium/src/+/main/docs/updating_clang.md
 # Reverting problematic clang rolls is safe, though.
 # This is the output of `git describe` and is usable as a commit-ish.
-CLANG_REVISION = 'llvmorg-17-init-16420-g0c545a44'
-CLANG_SUB_REVISION = 8
+CLANG_REVISION = 'llvmorg-18-init-4631-gd50b56d1'
+CLANG_SUB_REVISION = 1
 
 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION)
-RELEASE_VERSION = '17'
+RELEASE_VERSION = '18'
 # TODO(crbug.com/1467585): Bump to 18 in next Clang roll.
 
 CDS_URL = os.environ.get('CDS_CLANG_BUCKET_OVERRIDE',
diff --git a/tools/clang/scripts/upload_revision.py b/tools/clang/scripts/upload_revision.py
index 83080f0..b48e63e 100755
--- a/tools/clang/scripts/upload_revision.py
+++ b/tools/clang/scripts/upload_revision.py
@@ -72,7 +72,7 @@
 Cq-Include-Trybots: chromium/try:win-official,win32-official
 Cq-Include-Trybots: chromium/try:linux-swangle-try-x64,win-swangle-try-x86
 Cq-Include-Trybots: chrome/try:iphone-device,ipad-device
-Cq-Include-Trybots: chrome/try:linux-chromeos-chrome
+Cq-Include-Trybots: chrome/try:linux-chromeos-chrome,win-arm64-rel
 Cq-Include-Trybots: chrome/try:win-chrome,win64-chrome,linux-chrome,mac-chrome
 Cq-Include-Trybots: chrome/try:linux-pgo,mac-pgo,win32-pgo,win64-pgo'''
 
diff --git a/tools/crates/gnrt/gen.rs b/tools/crates/gnrt/gen.rs
index 2513c50..5ae5f92 100644
--- a/tools/crates/gnrt/gen.rs
+++ b/tools/crates/gnrt/gen.rs
@@ -204,6 +204,10 @@
 
     ensure!(!has_error, "Generated build rules don't match input dependencies");
 
+    if args.get_flag("dump-template-input") {
+        todo!("option is currently unsupported for third-party output")
+    }
+
     // Wipe all previous BUILD.gn files. If we fail, we don't want to leave a
     // mix of old and new build files.
     for build_file in present_crates.iter().map(|(crate_id, _)| build_file_path(crate_id, paths)) {
@@ -413,7 +417,10 @@
     let crate_inputs: HashMap<VendoredCrate, CrateFiles> = dependencies
         .iter()
         .filter(|p| p.lib_target.is_some())
-        .map(|p| crates::collect_std_crate_files(p, &config).unwrap())
+        .map(|p| {
+            crates::collect_std_crate_files(p, &config)
+                .expect("missing a stdlib input file, did you gclient sync?")
+        })
         .collect();
 
     let build_file =
@@ -421,6 +428,14 @@
             crate_inputs.get(crate_id).unwrap()
         });
 
+    if args.get_flag("dump-template-input") {
+        return serde_json::to_writer_pretty(
+            std::fs::File::create("gnrt-template-input.json").context("opening dump file")?,
+            &build_file,
+        )
+        .context("dumping gn information");
+    }
+
     let gn_str = handlebars.render("template", &build_file)?;
     write_build_file(&paths.std_build.join("BUILD.gn"), gn_str).unwrap();
 
diff --git a/tools/crates/gnrt/lib/gn.rs b/tools/crates/gnrt/lib/gn.rs
index bac1bba..f2518b79 100644
--- a/tools/crates/gnrt/lib/gn.rs
+++ b/tools/crates/gnrt/lib/gn.rs
@@ -29,6 +29,16 @@
     pub rules: Vec<(String, Rule)>,
 }
 
+/// Identifies a package version. A package's dependency list uses this to refer
+/// to other targets.
+#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd, Serialize)]
+pub struct PackageId {
+    /// Package name in normalized form, as used in GN target and path names.
+    pub name: String,
+    /// Package epoch if relevant (i.e. when needed as part of target paths).
+    pub epoch: Option<String>,
+}
+
 #[derive(Debug, Serialize)]
 pub struct RuleCommon {
     pub testonly: bool,
@@ -59,6 +69,9 @@
     pub build_root: Option<String>,
     pub build_script_outputs: Vec<String>,
     pub extra_kv: HashMap<String, serde_json::Value>,
+    /// Whether this rule depends on the main lib target in its group (e.g. a
+    /// bin target alongside a lib inside a package).
+    pub dep_on_lib: bool,
 }
 
 /// Describes a single GN build rule for a crate configuration. Each field
@@ -89,8 +102,9 @@
 pub struct DepGroup {
     /// `if` condition for GN, or `None` for unconditional deps.
     cond: Option<Condition>,
-    /// GN rule names to depend on.
-    rules: Vec<String>,
+    /// Packages to depend on. The build file template determines the exact name
+    /// based on the identified package and context.
+    packages: Vec<PackageId>,
 }
 
 /// Extra metadata influencing GN output for a particular crate.
@@ -224,7 +238,10 @@
     // Group the dependencies by condition, where the unconditional deps come
     // first. `group_deps` always returns at least one element, even if the
     // first set is empty.
-    rule.deps = group_deps(&dep_deps, |d| format!(":{}", normalize_target_name(&d.package_name)));
+    rule.deps = group_deps(&dep_deps, |d| PackageId {
+        name: normalize_target_name(&d.package_name),
+        epoch: None,
+    });
 
     for dep in dep_deps {
         let target_name = normalize_target_name(&dep.package_name);
@@ -234,7 +251,7 @@
     }
 
     // If there are still no deps after `extra_deps`, simply clear the list.
-    if rule.deps.len() == 1 && rule.deps[0].rules.len() == 0 {
+    if rule.deps.len() == 1 && rule.deps[0].packages.len() == 0 {
         rule.deps.clear();
     }
 
@@ -255,7 +272,6 @@
     details: &CrateFiles,
     metadata: PerCrateMetadata,
 ) -> Option<(VendoredCrate, BuildFile)> {
-    let third_party_path_str = paths.third_party.to_str().unwrap();
     let crate_id = dep.crate_id();
     let crate_path_from_chromium_src =
         paths.third_party.join(ThirdPartySource::build_path(&crate_id));
@@ -288,10 +304,10 @@
     // then it should only depend on other ":cargo_tests_support" targets. We
     // should also define a group("cargo_tests_support") that points to ":lib"
     // if there is no Development library rule definition.
-    for (target_name, gn_deps, cargo_deps) in [
-        ("lib", &mut rule_template.deps, &dep.dependencies),
-        ("cargo_tests_support", &mut rule_template.dev_deps, &dep.dev_dependencies),
-        ("buildrs_support", &mut rule_template.build_deps, &dep.build_dependencies),
+    for (gn_deps, cargo_deps) in [
+        (&mut rule_template.deps, &dep.dependencies),
+        (&mut rule_template.dev_deps, &dep.dev_dependencies),
+        (&mut rule_template.build_deps, &dep.build_dependencies),
     ] {
         let cargo_deps: Vec<_> = cargo_deps.iter().collect();
 
@@ -300,13 +316,13 @@
         // first set is empty.
         *gn_deps = group_deps(&cargo_deps, |d| {
             let crate_id = d.crate_id();
-            let normalized_name = crate_id.normalized_name();
-            let epoch = Epoch::from_version(&crate_id.version);
-            format!("//{third_party_path_str}/{normalized_name}/{epoch}:{target_name}")
+            let normalized_name = crate_id.normalized_name().to_string();
+            let epoch = Some(Epoch::from_version(&crate_id.version).to_string());
+            PackageId { name: normalized_name, epoch }
         });
 
         // If there are still no deps after `extra_deps`, simply clear the list.
-        if gn_deps.len() == 1 && gn_deps[0].rules.len() == 0 {
+        if gn_deps.len() == 1 && gn_deps[0].packages.len() == 0 {
             gn_deps.clear();
         }
     }
@@ -337,10 +353,10 @@
         };
 
         if dep.lib_target.is_some() {
+            bin_rule.dep_on_lib = true;
             if bin_rule.deps.is_empty() {
-                bin_rule.deps.push(DepGroup { cond: None, rules: Vec::new() });
+                bin_rule.deps.push(DepGroup { cond: None, packages: Vec::new() });
             }
-            bin_rule.deps[0].rules.push(":lib".to_string());
         }
 
         rules.push((
@@ -421,11 +437,11 @@
 
 /// Group dependencies by condition, with unconditional deps first. The first
 /// element is always present even if its set is empty.
-fn group_deps<F: Fn(&DepOfDep) -> String>(deps: &[&DepOfDep], target_name: F) -> Vec<DepGroup>
+fn group_deps<F: Fn(&DepOfDep) -> PackageId>(deps: &[&DepOfDep], target_name: F) -> Vec<DepGroup>
 where
-    F: Fn(&DepOfDep) -> String,
+    F: Fn(&DepOfDep) -> PackageId,
 {
-    let mut groups = HashMap::<Option<Condition>, Vec<String>>::new();
+    let mut groups = HashMap::<Option<Condition>, Vec<_>>::new();
     for dep in deps {
         let cond = match &dep.platform {
             None => None,
@@ -438,10 +454,10 @@
     groups.entry(None).or_default();
 
     let mut groups: Vec<DepGroup> =
-        groups.into_iter().map(|(cond, rules)| DepGroup { cond, rules }).collect();
+        groups.into_iter().map(|(cond, rules)| DepGroup { cond, packages: rules }).collect();
 
     for group in groups.iter_mut() {
-        group.rules.sort_unstable();
+        group.packages.sort_unstable();
     }
     groups.sort_unstable_by(|l, r| l.cond.cmp(&r.cond));
     groups
@@ -503,16 +519,24 @@
         cargo_platform::CfgExpr::Not(expr) => {
             format!("!({})", cfg_expr_to_condition(expr))
         }
-        cargo_platform::CfgExpr::All(exprs) => exprs
-            .iter()
-            .map(|expr| format!("({})", cfg_expr_to_condition(expr)))
-            .collect::<Vec<String>>()
-            .join(" && "),
-        cargo_platform::CfgExpr::Any(exprs) => exprs
-            .iter()
-            .map(|expr| format!("({})", cfg_expr_to_condition(expr)))
-            .collect::<Vec<String>>()
-            .join(" || "),
+        cargo_platform::CfgExpr::All(exprs) => {
+            let mut conds = exprs
+                .iter()
+                .map(|expr| format!("({})", cfg_expr_to_condition(expr)))
+                .collect::<Vec<String>>();
+            conds.sort();
+            conds.dedup();
+            conds.join(" && ")
+        }
+        cargo_platform::CfgExpr::Any(exprs) => {
+            let mut conds = exprs
+                .iter()
+                .map(|expr| format!("({})", cfg_expr_to_condition(expr)))
+                .collect::<Vec<String>>();
+            conds.sort();
+            conds.dedup();
+            conds.join(" || ")
+        }
         cargo_platform::CfgExpr::Value(cfg) => cfg_to_condition(cfg),
     }
 }
@@ -613,7 +637,17 @@
             ))))
             .unwrap()
             .0,
-            "((is_win) || (is_android))"
+            "((is_android) || (is_win))"
+        );
+
+        // Redundant cfg expression.
+        assert_eq!(
+            Condition::from_platform_set(PlatformSet::one(Some(Platform::Cfg(
+                CfgExpr::from_str("any(windows, windows)").unwrap()
+            ))))
+            .unwrap()
+            .0,
+            "((is_win))"
         );
 
         // Try a PlatformSet with multiple filters.
diff --git a/tools/crates/gnrt/lib/manifest.rs b/tools/crates/gnrt/lib/manifest.rs
index 55c7cf8e..120fbbf 100644
--- a/tools/crates/gnrt/lib/manifest.rs
+++ b/tools/crates/gnrt/lib/manifest.rs
@@ -456,6 +456,7 @@
                 edition: Edition("2021".to_string()),
                 description: None,
                 license: "funtimes".to_string(),
+                include: Vec::new(),
             },
             workspace: None,
             dependencies: CargoDependencySet::new(),
@@ -512,6 +513,7 @@
                 edition: Edition("2021".to_string()),
                 description: Some("A library to foo the bars".to_string()),
                 license: "funtimes".to_string(),
+                include: Vec::new(),
             }
         )
     }
diff --git a/tools/crates/gnrt/lib/platforms.rs b/tools/crates/gnrt/lib/platforms.rs
index 6475ad0a..2e710ad 100644
--- a/tools/crates/gnrt/lib/platforms.rs
+++ b/tools/crates/gnrt/lib/platforms.rs
@@ -201,31 +201,48 @@
             }
         }
         cargo_platform::CfgExpr::Value(cfg) => {
+            transform_cfg(cfg);
             if supported_os_cfgs().iter().any(|c| c == cfg) {
                 Valid
             } else {
+                // TODO(danakj): Maybe this should be `Valid`, if there are conditions that are
+                // sometimes true depending on which OS we're targeting.
                 AlwaysFalse
             }
         }
     }
 }
 
+/// Some cfgs imply other cfgs, so we can just convert them to the other.
+fn transform_cfg(cfg: &mut Cfg) {
+    match cfg {
+        // Chromium always uses the "msvc" env if and only if we're on windows, so we can uplift
+        // the env to say the rule always applies to windows.
+        Cfg::KeyPair(a, b) if a == "target_env" && b == "msvc" => {
+            *cfg = Cfg::Name("windows".to_string())
+        }
+        // Chromium never targets UWP.
+        Cfg::KeyPair(a, b) if a == "target_vendor" && b == "uwp" => {
+            *cfg = Cfg::Name("false".to_string())
+        }
+        _ => (),
+    }
+}
+
 fn supported_os_cfgs() -> &'static [Cfg] {
     static CFG_SET: OnceCell<Vec<Cfg>> = OnceCell::new();
     CFG_SET.get_or_init(|| {
-        let mut cfg_set: Vec<Cfg> = [
+        [
             // Set of supported OSes for `cfg(target_os = ...)`.
             "android", "darwin", "fuchsia", "ios", "linux", "windows",
         ]
         .into_iter()
         .map(|os| Cfg::KeyPair("target_os".to_string(), os.to_string()))
-        .collect();
-
-        cfg_set.extend(
+        .chain(
             // Alternative syntax `cfg(unix)` or `cfg(windows)`.
             ["unix", "windows"].into_iter().map(|os| Cfg::Name(os.to_string())),
-        );
-        cfg_set
+        )
+        .collect()
     })
 }
 
@@ -237,8 +254,10 @@
     "aarch64-fuchsia",
     "x86_64-fuchsia",
     "aarch64-apple-ios",
+    "aarch64-apple-ios-macabi",
     "armv7-apple-ios",
     "x86_64-apple-ios",
+    "x86_64-apple-ios-macabi",
     "i386-apple-ios",
     "i686-pc-windows-msvc",
     "x86_64-pc-windows-msvc",
@@ -308,5 +327,29 @@
             )),
             None
         );
+
+        assert_eq!(
+            filter_unsupported_platform_terms(Platform::Cfg(
+                CfgExpr::from_str("not(all(windows, target_vendor = \"uwp\"))").unwrap()
+            )),
+            None
+        );
+
+        assert_eq!(
+            filter_unsupported_platform_terms(Platform::Cfg(
+                CfgExpr::from_str("not(all(windows, target_env = \"msvc\"))").unwrap()
+            )),
+            Some(Platform::Cfg(CfgExpr::from_str("not(all(windows, windows))").unwrap()))
+        );
+
+        assert_eq!(
+            filter_unsupported_platform_terms(Platform::Cfg(
+                CfgExpr::from_str(
+                    "not(all(windows, target_env = \"msvc\", not(target_vendor = \"uwp\")))"
+                )
+                .unwrap()
+            )),
+            Some(Platform::Cfg(CfgExpr::from_str("not(all(windows, windows))").unwrap()))
+        );
     }
 }
diff --git a/tools/crates/gnrt/main.rs b/tools/crates/gnrt/main.rs
index 5cb7d0e..765875c 100644
--- a/tools/crates/gnrt/main.rs
+++ b/tools/crates/gnrt/main.rs
@@ -56,6 +56,15 @@
                             Generated paths are rewritten to point into the toolchain package, as \
                             if generated by package_rust.py.",
                         ),
+                )
+                .arg(
+                    Arg::new("dump-template-input")
+                        .long("dump-template-input")
+                        .action(clap::ArgAction::SetTrue)
+                        .help(
+                            "Exit before writing BUILD.gn files, instead serialize the template \
+                            engine input and write it to a file named `gnrt-template-input.json`.",
+                        ),
                 ),
         )
         .subcommand(
diff --git a/tools/disable_tests/tests/gtest-basic.json b/tools/disable_tests/tests/gtest-basic.json
index 3bf3a3c8..343b66f 100644
--- a/tools/disable_tests/tests/gtest-basic.json
+++ b/tools/disable_tests/tests/gtest-basic.json
@@ -6,9 +6,9 @@
   ],
   "requests": "{\"QueryTestResults/{\\\"invocations\\\": [\\\"invocations/build-8802545798771106129\\\"], \\\"readMask\\\": {\\\"paths\\\": [\\\"test_id\\\", \\\"test_metadata\\\"]}, \\\"pageSize\\\": 1000, \\\"predicate\\\": {\\\"testIdRegexp\\\": \\\".*BrowserViewTest.GetAccessibleTabModalDialogTree.*\\\"}}\": \"{\\\"testResults\\\":[{\\\"name\\\":\\\"invocations/task-chromium-swarm.appspot.com-5d7161f0cd866211/tests/ninja:%2F%2Fchrome%2Ftest:browser_tests%2FBrowserViewTest.GetAccessibleTabModalDialogTree/results/0e419060-01374\\\",\\\"testId\\\":\\\"ninja://chrome/test:browser_tests/BrowserViewTest.GetAccessibleTabModalDialogTree\\\",\\\"testMetadata\\\":{\\\"name\\\":\\\"BrowserViewTest.GetAccessibleTabModalDialogTree\\\",\\\"location\\\":{\\\"repo\\\":\\\"https://chromium.googlesource.com/chromium/src\\\",\\\"fileName\\\":\\\"//chrome/browser/ui/views/frame/browser_view_browsertest.cc\\\",\\\"line\\\":359}}}]}\\n\"}",
   "read_data": {
-    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/chromium_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
+    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/branded_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
   },
   "written_data": {
-    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/chromium_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest,\n                       DISABLED_GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
+    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/branded_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest,\n                       DISABLED_GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
   }
-}
\ No newline at end of file
+}
diff --git a/tools/disable_tests/tests/gtest-bug-comment.json b/tools/disable_tests/tests/gtest-bug-comment.json
index 78f5326..77ed92e 100644
--- a/tools/disable_tests/tests/gtest-bug-comment.json
+++ b/tools/disable_tests/tests/gtest-bug-comment.json
@@ -8,9 +8,9 @@
   ],
   "requests": "{\"QueryTestResults/{\\\"invocations\\\": [\\\"invocations/build-8802545798771106129\\\"], \\\"readMask\\\": {\\\"paths\\\": [\\\"test_id\\\", \\\"test_metadata\\\"]}, \\\"pageSize\\\": 1000, \\\"predicate\\\": {\\\"testIdRegexp\\\": \\\".*BrowserViewTest.GetAccessibleTabModalDialogTree.*\\\"}}\": \"{\\\"testResults\\\":[{\\\"name\\\":\\\"invocations/task-chromium-swarm.appspot.com-5d7161f0cd866211/tests/ninja:%2F%2Fchrome%2Ftest:browser_tests%2FBrowserViewTest.GetAccessibleTabModalDialogTree/results/0e419060-01374\\\",\\\"testId\\\":\\\"ninja://chrome/test:browser_tests/BrowserViewTest.GetAccessibleTabModalDialogTree\\\",\\\"testMetadata\\\":{\\\"name\\\":\\\"BrowserViewTest.GetAccessibleTabModalDialogTree\\\",\\\"location\\\":{\\\"repo\\\":\\\"https://chromium.googlesource.com/chromium/src\\\",\\\"fileName\\\":\\\"//chrome/browser/ui/views/frame/browser_view_browsertest.cc\\\",\\\"line\\\":359}}}]}\\n\"}",
   "read_data": {
-    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/chromium_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
+    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/branded_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
   },
   "written_data": {
-    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/chromium_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\n// TODO(crbug.com/1234567): Re-enable this test\nIN_PROC_BROWSER_TEST_F(BrowserViewTest,\n                       DISABLED_GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
+    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/branded_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\n// TODO(crbug.com/1234567): Re-enable this test\nIN_PROC_BROWSER_TEST_F(BrowserViewTest,\n                       DISABLED_GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
   }
-}
\ No newline at end of file
+}
diff --git a/tools/disable_tests/tests/gtest-conditional.json b/tools/disable_tests/tests/gtest-conditional.json
index 3291060..d358317 100644
--- a/tools/disable_tests/tests/gtest-conditional.json
+++ b/tools/disable_tests/tests/gtest-conditional.json
@@ -7,9 +7,9 @@
   ],
   "requests": "{\"QueryTestResults/{\\\"invocations\\\": [\\\"invocations/build-8802545798771106129\\\"], \\\"readMask\\\": {\\\"paths\\\": [\\\"test_id\\\", \\\"test_metadata\\\"]}, \\\"pageSize\\\": 1000, \\\"predicate\\\": {\\\"testIdRegexp\\\": \\\".*BrowserViewTest.GetAccessibleTabModalDialogTree.*\\\"}}\": \"{\\\"testResults\\\":[{\\\"name\\\":\\\"invocations/task-chromium-swarm.appspot.com-5d7161f0cd866211/tests/ninja:%2F%2Fchrome%2Ftest:browser_tests%2FBrowserViewTest.GetAccessibleTabModalDialogTree/results/0e419060-01374\\\",\\\"testId\\\":\\\"ninja://chrome/test:browser_tests/BrowserViewTest.GetAccessibleTabModalDialogTree\\\",\\\"testMetadata\\\":{\\\"name\\\":\\\"BrowserViewTest.GetAccessibleTabModalDialogTree\\\",\\\"location\\\":{\\\"repo\\\":\\\"https://chromium.googlesource.com/chromium/src\\\",\\\"fileName\\\":\\\"//chrome/browser/ui/views/frame/browser_view_browsertest.cc\\\",\\\"line\\\":359}}}]}\\n\"}",
   "read_data": {
-    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/chromium_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
+    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/branded_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
   },
   "written_data": {
-    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/chromium_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\n#if BUILDFLAG(IS_LINUX)\n#define MAYBE_GetAccessibleTabModalDialogTree \\\n  DISABLED_GetAccessibleTabModalDialogTree\n#else\n#define MAYBE_GetAccessibleTabModalDialogTree GetAccessibleTabModalDialogTree\n#endif\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, MAYBE_GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
+    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/branded_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\n#if BUILDFLAG(IS_LINUX)\n#define MAYBE_GetAccessibleTabModalDialogTree \\\n  DISABLED_GetAccessibleTabModalDialogTree\n#else\n#define MAYBE_GetAccessibleTabModalDialogTree GetAccessibleTabModalDialogTree\n#endif\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, MAYBE_GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
   }
-}
\ No newline at end of file
+}
diff --git a/tools/disable_tests/tests/gtest-message.json b/tools/disable_tests/tests/gtest-message.json
index ea1f45a1..6c5b1bcd 100644
--- a/tools/disable_tests/tests/gtest-message.json
+++ b/tools/disable_tests/tests/gtest-message.json
@@ -8,9 +8,9 @@
   ],
   "requests": "{\"QueryTestResults/{\\\"invocations\\\": [\\\"invocations/build-8802545798771106129\\\"], \\\"readMask\\\": {\\\"paths\\\": [\\\"test_id\\\", \\\"test_metadata\\\"]}, \\\"pageSize\\\": 1000, \\\"predicate\\\": {\\\"testIdRegexp\\\": \\\".*BrowserViewTest.GetAccessibleTabModalDialogTree.*\\\"}}\": \"{\\\"testResults\\\":[{\\\"name\\\":\\\"invocations/task-chromium-swarm.appspot.com-5d7161f0cd866211/tests/ninja:%2F%2Fchrome%2Ftest:browser_tests%2FBrowserViewTest.GetAccessibleTabModalDialogTree/results/0e419060-01374\\\",\\\"testId\\\":\\\"ninja://chrome/test:browser_tests/BrowserViewTest.GetAccessibleTabModalDialogTree\\\",\\\"testMetadata\\\":{\\\"name\\\":\\\"BrowserViewTest.GetAccessibleTabModalDialogTree\\\",\\\"location\\\":{\\\"repo\\\":\\\"https://chromium.googlesource.com/chromium/src\\\",\\\"fileName\\\":\\\"//chrome/browser/ui/views/frame/browser_view_browsertest.cc\\\",\\\"line\\\":359}}}]}\\n\"}",
   "read_data": {
-    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/chromium_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
+    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/branded_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
   },
   "written_data": {
-    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/chromium_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\n// this is a message\nIN_PROC_BROWSER_TEST_F(BrowserViewTest,\n                       DISABLED_GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
+    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/branded_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\n// this is a message\nIN_PROC_BROWSER_TEST_F(BrowserViewTest,\n                       DISABLED_GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
   }
-}
\ No newline at end of file
+}
diff --git a/tools/disable_tests/tests/gtest-redundant-conditions.json b/tools/disable_tests/tests/gtest-redundant-conditions.json
index 9e4e397a..2efd6803 100644
--- a/tools/disable_tests/tests/gtest-redundant-conditions.json
+++ b/tools/disable_tests/tests/gtest-redundant-conditions.json
@@ -9,9 +9,9 @@
   ],
   "requests": "{\"QueryTestResults/{\\\"invocations\\\": [\\\"invocations/build-8802545798771106129\\\"], \\\"readMask\\\": {\\\"paths\\\": [\\\"test_id\\\", \\\"test_metadata\\\"]}, \\\"pageSize\\\": 1000, \\\"predicate\\\": {\\\"testIdRegexp\\\": \\\".*BrowserViewTest.GetAccessibleTabModalDialogTree.*\\\"}}\": \"{\\\"testResults\\\":[{\\\"name\\\":\\\"invocations/task-chromium-swarm.appspot.com-5d7161f0cd866211/tests/ninja:%2F%2Fchrome%2Ftest:browser_tests%2FBrowserViewTest.GetAccessibleTabModalDialogTree/results/0e419060-01374\\\",\\\"testId\\\":\\\"ninja://chrome/test:browser_tests/BrowserViewTest.GetAccessibleTabModalDialogTree\\\",\\\"testMetadata\\\":{\\\"name\\\":\\\"BrowserViewTest.GetAccessibleTabModalDialogTree\\\",\\\"location\\\":{\\\"repo\\\":\\\"https://chromium.googlesource.com/chromium/src\\\",\\\"fileName\\\":\\\"//chrome/browser/ui/views/frame/browser_view_browsertest.cc\\\",\\\"line\\\":359}}}]}\\n\"}",
   "read_data": {
-    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/chromium_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
+    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/branded_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
   },
   "written_data": {
-    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/chromium_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\n#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)\n#define MAYBE_GetAccessibleTabModalDialogTree \\\n  DISABLED_GetAccessibleTabModalDialogTree\n#else\n#define MAYBE_GetAccessibleTabModalDialogTree GetAccessibleTabModalDialogTree\n#endif\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, MAYBE_GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
+    "chrome/browser/ui/views/frame/browser_view_browsertest.cc": "// Copyright 2013 The Chromium Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"chrome/browser/ui/views/frame/browser_view.h\"\n\n#include \"base/memory/raw_ptr.h\"\n#include \"base/strings/utf_string_conversions.h\"\n#include \"build/build_config.h\"\n#include \"build/chromeos_buildflags.h\"\n#include \"chrome/browser/devtools/devtools_window_testing.h\"\n#include \"chrome/browser/ui/browser.h\"\n#include \"chrome/browser/ui/browser_tabstrip.h\"\n#include \"chrome/browser/ui/tab_modal_confirm_dialog.h\"\n#include \"chrome/browser/ui/tab_ui_helper.h\"\n#include \"chrome/browser/ui/tabs/tab_strip_model.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view.h\"\n#include \"chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h\"\n#include \"chrome/browser/ui/views/tabs/tab_strip.h\"\n#include \"chrome/common/pref_names.h\"\n#include \"chrome/common/url_constants.h\"\n#include \"chrome/grit/branded_strings.h\"\n#include \"chrome/test/base/in_process_browser_test.h\"\n#include \"chrome/test/base/ui_test_utils.h\"\n#include \"components/bookmarks/common/bookmark_pref_names.h\"\n#include \"components/prefs/pref_service.h\"\n#include \"content/public/browser/browser_accessibility_state.h\"\n#include \"content/public/browser/invalidate_type.h\"\n#include \"content/public/browser/web_contents.h\"\n#include \"content/public/browser/web_contents_observer.h\"\n#include \"content/public/test/browser_test.h\"\n#include \"content/public/test/browser_test_utils.h\"\n#include \"content/public/test/test_navigation_observer.h\"\n#include \"media/base/media_switches.h\"\n#include \"ui/accessibility/platform/ax_platform_node.h\"\n#include \"ui/accessibility/platform/ax_platform_node_test_helper.h\"\n#include \"ui/base/l10n/l10n_util.h\"\n\n#if defined(USE_AURA)\n#include \"ui/aura/client/focus_client.h\"\n#include \"ui/views/widget/native_widget_aura.h\"\n#endif  // USE_AURA\n\nclass BrowserViewTest : public InProcessBrowserTest {\n public:\n  BrowserViewTest() : devtools_(nullptr) {}\n\n  BrowserViewTest(const BrowserViewTest&) = delete;\n  BrowserViewTest& operator=(const BrowserViewTest&) = delete;\n\n protected:\n  BrowserView* browser_view() {\n    return BrowserView::GetBrowserViewForBrowser(browser());\n  }\n\n  views::WebView* devtools_web_view() {\n    return browser_view()->GetDevToolsWebViewForTest();\n  }\n\n  views::WebView* contents_web_view() {\n    return browser_view()->contents_web_view();\n  }\n\n  void OpenDevToolsWindow(bool docked) {\n    devtools_ =\n        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked);\n  }\n\n  void CloseDevToolsWindow() {\n    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_);\n  }\n\n  void SetDevToolsBounds(const gfx::Rect& bounds) {\n    DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds);\n  }\n\n  raw_ptr<DevToolsWindow> devtools_;\n\n private:\n  base::test::ScopedFeatureList scoped_feature_list_;\n};\n\nnamespace {\n\n// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked\n// updates the navigation state of another tab.\nclass TestWebContentsObserver : public content::WebContentsObserver {\n public:\n  TestWebContentsObserver(content::WebContents* source,\n                          content::WebContents* other)\n      : content::WebContentsObserver(source),\n        other_(other) {}\n\n  TestWebContentsObserver(const TestWebContentsObserver&) = delete;\n  TestWebContentsObserver& operator=(const TestWebContentsObserver&) = delete;\n\n  ~TestWebContentsObserver() override {}\n\n  void WebContentsDestroyed() override {\n    other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>(\n        content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD));\n  }\n\n private:\n  raw_ptr<content::WebContents> other_;\n};\n\nclass TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {\n public:\n  explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)\n      : TabModalConfirmDialogDelegate(contents) {}\n\n  TestTabModalConfirmDialogDelegate(const TestTabModalConfirmDialogDelegate&) =\n      delete;\n  TestTabModalConfirmDialogDelegate& operator=(\n      const TestTabModalConfirmDialogDelegate&) = delete;\n\n  std::u16string GetTitle() override { return std::u16string(u\"Dialog Title\"); }\n  std::u16string GetDialogMessage() override { return std::u16string(); }\n};\n}  // namespace\n\n// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.\n// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged()\n// is invoked on the other.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Same as CloseWithTabs, but activates the first tab, which is the first tab\n// BrowserView will destroy.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) {\n  Browser* browser2 =\n      Browser::Create(Browser::CreateParams(browser()->profile(), true));\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  chrome::AddTabAt(browser2, GURL(), -1, true);\n  browser2->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  TestWebContentsObserver observer(\n      browser2->tab_strip_model()->GetWebContentsAt(0),\n      browser2->tab_strip_model()->GetWebContentsAt(1));\n  BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow();\n}\n\n// Verifies that page and devtools WebViews are being correctly layed out\n// when DevTools is opened/closed/updated/undocked.\n// TODO(crbug.com/1316663): Re-enable; currently failing on multiple platforms.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, DISABLED_DevToolsUpdatesBrowserWindow) {\n  gfx::Rect full_bounds =\n      browser_view()->GetContentsContainerForTest()->GetLocalBounds();\n  gfx::Rect small_bounds(10, 20, 30, 40);\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Docked.\n  OpenDevToolsWindow(true);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  // Undocked.\n  OpenDevToolsWindow(false);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n\n  SetDevToolsBounds(small_bounds);\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_TRUE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(small_bounds, contents_web_view()->bounds());\n\n  CloseDevToolsWindow();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n\n  browser_view()->UpdateDevTools();\n  EXPECT_FALSE(devtools_web_view()->web_contents());\n  EXPECT_EQ(full_bounds, devtools_web_view()->bounds());\n  EXPECT_EQ(full_bounds, contents_web_view()->bounds());\n}\n\nclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver {\n public:\n  BookmarkBarViewObserverImpl() : change_count_(0) {\n  }\n\n  BookmarkBarViewObserverImpl(const BookmarkBarViewObserverImpl&) = delete;\n  BookmarkBarViewObserverImpl& operator=(const BookmarkBarViewObserverImpl&) =\n      delete;\n\n  int change_count() const { return change_count_; }\n  void clear_change_count() { change_count_ = 0; }\n\n  // BookmarkBarViewObserver:\n  void OnBookmarkBarVisibilityChanged() override { change_count_++; }\n\n private:\n  int change_count_ = 0;\n};\n\n// Verifies we don't unnecessarily change the visibility of the BookmarkBarView.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {\n  // Create two tabs, the first empty and the second the ntp. Make it so the\n  // BookmarkBarView isn't shown.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, false);\n  GURL new_tab_url(chrome::kChromeUINewTabURL);\n  chrome::AddTabAt(browser(), GURL(), -1, true);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), new_tab_url));\n\n  ASSERT_TRUE(browser_view()->bookmark_bar());\n  BookmarkBarViewObserverImpl observer;\n  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();\n  bookmark_bar->AddObserver(&observer);\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n\n  // Go to empty tab. Bookmark bar should hide.\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Go to ntp tab. Bookmark bar should not show.\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_FALSE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  // Repeat with the bookmark bar always visible.\n  browser()->profile()->GetPrefs()->SetBoolean(\n      bookmarks::prefs::kShowBookmarkBar, true);\n  browser()->tab_strip_model()->ActivateTabAt(\n      0, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(1, observer.change_count());\n  observer.clear_change_count();\n\n  browser()->tab_strip_model()->ActivateTabAt(\n      1, TabStripUserGestureDetails(\n             TabStripUserGestureDetails::GestureType::kOther));\n  EXPECT_TRUE(bookmark_bar->GetVisible());\n  EXPECT_EQ(0, observer.change_count());\n  observer.clear_change_count();\n\n  browser_view()->bookmark_bar()->RemoveObserver(&observer);\n}\n\n// Launch the app, navigate to a page with a title, check that the tab title\n// is set before load finishes and the throbber state updates when the title\n// changes. Regression test for crbug.com/752266\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, TitleAndLoadState) {\n  const std::u16string test_title(u\"Title Of Awesomeness\");\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  content::TitleWatcher title_watcher(contents, test_title);\n  content::TestNavigationObserver navigation_watcher(\n      contents, 1, content::MessageLoopRunner::QuitMode::DEFERRED);\n\n  TabStrip* tab_strip = browser_view()->tabstrip();\n  // Navigate without blocking.\n  const GURL test_url = ui_test_utils::GetTestUrl(\n      base::FilePath(base::FilePath::kCurrentDirectory),\n      base::FilePath(FILE_PATH_LITERAL(\"title2.html\")));\n  contents->GetController().LoadURL(test_url, content::Referrer(),\n                                    ui::PAGE_TRANSITION_LINK, std::string());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kWaiting,\n            tab_strip->tab_at(0)->data().network_state);\n  EXPECT_EQ(test_title, title_watcher.WaitAndGetTitle());\n  EXPECT_TRUE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kLoading,\n            tab_strip->tab_at(0)->data().network_state);\n\n  // Now block for the navigation to complete.\n  navigation_watcher.Wait();\n  EXPECT_FALSE(browser()->tab_strip_model()->TabsAreLoading());\n  EXPECT_EQ(TabNetworkState::kNone, tab_strip->tab_at(0)->data().network_state);\n}\n\n// Verifies a tab should show its favicon.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {\n  // Opens \"chrome://version/\" page, which uses default favicon.\n  GURL version_url(chrome::kChromeUIVersionURL);\n  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), version_url));\n  auto* contents = browser()->tab_strip_model()->GetActiveWebContents();\n  auto* helper = TabUIHelper::FromWebContents(contents);\n  ASSERT_TRUE(helper);\n\n  auto favicon = helper->GetFavicon();\n  ASSERT_FALSE(favicon.IsEmpty());\n}\n\n// On Mac, voiceover treats tab modal dialogs as native windows, so setting an\n// accessible title for tab-modal dialogs is not necessary.\n#if !BUILDFLAG(IS_MAC)\n\n// Open a tab-modal dialog and check that the accessible window title is the\n// title of the dialog.\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, GetAccessibleTabModalDialogTitle) {\n  std::u16string window_title =\n      u\"about:blank - \" + l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TestTabModalConfirmDialogDelegate* delegate_observer = delegate.get();\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n  EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(),\n            delegate_observer->GetTitle());\n\n  delegate_observer->Close();\n\n  EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),\n                               window_title, base::CompareCase::SENSITIVE));\n}\n\n// Open a tab-modal dialog and check that the accessibility tree only contains\n// the dialog.\n#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)\n#define MAYBE_GetAccessibleTabModalDialogTree \\\n  DISABLED_GetAccessibleTabModalDialogTree\n#else\n#define MAYBE_GetAccessibleTabModalDialogTree GetAccessibleTabModalDialogTree\n#endif\nIN_PROC_BROWSER_TEST_F(BrowserViewTest, MAYBE_GetAccessibleTabModalDialogTree) {\n  content::testing::ScopedContentAXModeSetter ax_mode_setter(\n      ui::kAXModeComplete);\n  ui::AXPlatformNode* ax_node = ui::AXPlatformNode::FromNativeViewAccessible(\n      browser_view()->GetWidget()->GetRootView()->GetNativeViewAccessible());\n// We expect this conversion to be safe on Windows, but can't guarantee that it\n// is safe on other platforms.\n#if BUILDFLAG(IS_WIN)\n  ASSERT_TRUE(ax_node);\n#else\n  if (!ax_node)\n    return;\n#endif\n\n  // There is no dialog, but the browser UI should be visible. So we expect the\n  // browser's reload button and no \"OK\" button from a dialog.\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n\n  content::WebContents* contents = browser_view()->GetActiveWebContents();\n  auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);\n  TabModalConfirmDialog::Create(std::move(delegate), contents);\n\n  // The tab modal dialog should be in the accessibility tree; everything else\n  // should be hidden. So we expect an \"OK\" button and no reload button.\n  EXPECT_EQ(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"Reload\"),\n            nullptr);\n  EXPECT_NE(ui::AXPlatformNodeTestHelper::FindChildByName(ax_node, \"OK\"),\n            nullptr);\n}\n\n#endif  // !BUILDFLAG(IS_MAC)\n"
   }
-}
\ No newline at end of file
+}
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec
index e65fe34..fcf451f1 100644
--- a/tools/gritsettings/resource_ids.spec
+++ b/tools/gritsettings/resource_ids.spec
@@ -164,6 +164,10 @@
     "META": {"sizes": {"includes": [50]}},
     "includes": [2560],
   },
+   "chrome/browser/resources/chromeos/mako/resources.grd": {
+    "META": {"sizes": {"includes": [50]}},
+    "includes": [2570],
+  },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/remote_maintenance_curtain/resources.grd": {
     "META": {"sizes": {"includes": [10]}},
     "includes": [2580],
@@ -303,6 +307,10 @@
     "META": {"sizes": {"includes": [10],}},
     "includes": [3280],
   },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/media_router/internals/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [3290],
+  },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/new_tab_page/resources.grd": {
     "META": {"sizes": {"includes": [200]}},
     "includes": [3300],
@@ -311,10 +319,6 @@
     "META": {"sizes": {"includes": [10]}},
     "includes": [3320],
   },
-  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/ntp4/resources.grd": {
-    "META": {"sizes": {"includes": [40]}},
-    "includes": [3340],
-  },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/omnibox_popup/resources.grd": {
     "META": {"sizes": {"includes": [50]}},
     "includes": [3360],
@@ -672,7 +676,7 @@
     "structures": [5100],
   },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/test/data/webui/resources.grd": {
-    "META": {"sizes": {"includes": [1500],}},
+    "META": {"sizes": {"includes": [2000],}},
     "includes": [5120],
   },
   # END chrome/ miscellaneous section.
@@ -787,9 +791,9 @@
     "META": {"sizes": {"includes": [50],}},
     "includes": [5620],
   },
-  "ash/webui/scanning/resources/scanning_app_resources.grd": {
+  "<(SHARED_INTERMEDIATE_DIR)/ash/webui/scanning/resources/resources.grd": {
+    "META": {"sizes": {"includes": [100],}},
     "includes": [5640],
-    "structures": [5660],
   },
   "<(SHARED_INTERMEDIATE_DIR)/ash/webui/system_extensions_internals_ui/ash_system_extensions_internals_resources.grd": {
     "META": {"sizes": {"includes": [10],}},
@@ -1053,7 +1057,7 @@
     "messages": [6500],
   },
   "<(SHARED_INTERMEDIATE_DIR)/ash/webui/shimless_rma/resources/ash_shimless_rma_resources.grd": {
-    "META": {"sizes": {"includes": [54],}},
+    "META": {"sizes": {"includes": [80],}},
     "includes": [6520],
   },
   "ash/keyboard/ui/keyboard_resources.grd": {
diff --git a/tools/licenses/.style.yapf b/tools/licenses/.style.yapf
index 566f50c..49ccf275 100644
--- a/tools/licenses/.style.yapf
+++ b/tools/licenses/.style.yapf
@@ -5,3 +5,4 @@
 column_limit = 80
 indent_width = 2
 allow_multiline_dictionary_keys = true
+allow_split_before_dict_value = false
diff --git a/tools/licenses/licenses.py b/tools/licenses/licenses.py
index 9a34155..e0e9996e 100755
--- a/tools/licenses/licenses.py
+++ b/tools/licenses/licenses.py
@@ -186,8 +186,8 @@
     },
     os.path.join('third_party', 'ipcz'): {
         "Name": "ipcz",
-        "URL":
-        "https://chromium.googlesource.com/chromium/src/third_party/ipcz",
+        "URL": (
+            "https://chromium.googlesource.com/chromium/src/third_party/ipcz"),
         "Shipped": "yes",
         "License": "BSD",
         "License File": ["//third_party/ipcz/LICENSE"],
@@ -222,8 +222,8 @@
         "License": "MIT",
         "License File": ["//third_party/jsoncpp/LICENSE"],
     },
-    os.path.join('third_party', 'openscreen', 'src', 'third_party', 'mozilla'):
-    {
+    os.path.join('third_party', 'openscreen', 'src', 'third_party',
+                 'mozilla'): {
         "Name": "mozilla",
         "URL": "https://github.com/mozilla",
         "Shipped": "yes",
@@ -255,14 +255,10 @@
     },
     os.path.join('third_party', 'crashpad', 'crashpad', 'third_party',
                  'getopt'): {
-        "Name":
-        "getopt",
-        "URL":
-        "https://sourceware.org/ml/newlib/2005/msg00758.html",
-        "Shipped":
-        "yes",
-        "License":
-        "Public domain",
+        "Name": "getopt",
+        "URL": "https://sourceware.org/ml/newlib/2005/msg00758.html",
+        "Shipped": "yes",
+        "License": "Public domain",
         "License File": [
             "//third_party/crashpad/crashpad/third_party/getopt/LICENSE",
         ],
@@ -370,28 +366,20 @@
         "License File": ["//third_party/swiftshader/LICENSE.txt"],
     },
     os.path.join('third_party', 'swiftshader', 'third_party', 'SPIRV-Tools'): {
-        "Name":
-        "SPIRV-Tools",
-        "URL":
-        "https://github.com/KhronosGroup/SPIRV-Tools",
-        "Shipped":
-        "yes",
-        "License":
-        "Apache 2.0",
+        "Name": "SPIRV-Tools",
+        "URL": "https://github.com/KhronosGroup/SPIRV-Tools",
+        "Shipped": "yes",
+        "License": "Apache 2.0",
         "License File": [
             "//third_party/swiftshader/third_party/SPIRV-Tools/LICENSE",
         ],
     },
     os.path.join('third_party', 'swiftshader', 'third_party',
                  'SPIRV-Headers'): {
-        "Name":
-        "SPIRV-Headers",
-        "URL":
-        "https://github.com/KhronosGroup/SPIRV-Headers",
-        "Shipped":
-        "yes",
-        "License":
-        "Apache 2.0",
+        "Name": "SPIRV-Headers",
+        "URL": "https://github.com/KhronosGroup/SPIRV-Headers",
+        "Shipped": "yes",
+        "License": "Apache 2.0",
         "License File": [
             "//third_party/swiftshader/third_party/SPIRV-Headers/LICENSE",
         ],
@@ -438,9 +426,31 @@
     os.path.join('buildtools', 'third_party', 'libunwind'),
 }
 
-# The delimiter used to separate license files specified in the 'License File'
-# field.
-LICENSE_FILE_DELIMITER = ","
+# The mandatory metadata fields for a single dependency.
+MANDATORY_FIELDS = {
+    "Name",  # Short name (for header on about:credits).
+    "URL",  # Project home page.
+    "License",  # Software license.
+    "License File",  # Relative paths to license texts.
+    "Shipped",  # Whether the package is in the shipped product.
+}
+
+# Field aliases (key is the alias, value is the field to map to).
+# Note: if both fields are provided, the alias field value will be used.
+ALIAS_FIELDS = {
+    "Shipped in Chromium": "Shipped",
+}
+
+# The metadata fields that can have multiple values.
+MULTIVALUE_FIELDS = {
+    "License File",
+}
+
+# Line used to separate dependencies within the same metadata file.
+PATTERN_DEPENDENCY_DIVIDER = re.compile(r"^-{20} DEPENDENCY DIVIDER -{20}$")
+
+# The delimiter used to separate multiple values for one metadata field.
+VALUE_DELIMITER = ","
 
 # Soon-to-be-deprecated special value for 'License File' field used to indicate
 # that the library is not shipped so the license file should not be used in
@@ -515,9 +525,15 @@
 ])
 
 
+class InvalidMetadata(Exception):
+  """This exception is raised when metadata is invalid."""
+  pass
+
+
 class LicenseError(Exception):
-  """We raise this exception when a directory's licensing info isn't
-    fully filled out."""
+  """We raise this exception when a dependency's licensing info isn't
+  fully filled out.
+  """
   pass
 
 
@@ -535,97 +551,200 @@
   return None
 
 
+def ParseMetadataFile(filepath: str,
+                      optional_fields: List[str] = []) -> List[Dict[str, Any]]:
+  """Parses the metadata from the file.
+
+  Args:
+    filepath: the path to a file from which to parse metadata.
+    optional_fields: list of optional metadata fields.
+
+  Returns: the metadata for all dependencies described in the file.
+
+  Raises:
+    InvalidMetadata - if the metadata in the file has duplicate fields
+                      for a dependency.
+  """
+  known_fields = (list(MANDATORY_FIELDS) + list(ALIAS_FIELDS.keys()) +
+                  optional_fields)
+  field_lookup = {name.lower(): name for name in known_fields}
+
+  dependencies = []
+  metadata = {}
+  with codecs.open(filepath, encoding="utf-8") as readme:
+    for line in readme:
+      line = line.strip()
+      # Skip empty lines.
+      if not line:
+        continue
+
+      # Check if a new dependency will be described.
+      if re.match(PATTERN_DEPENDENCY_DIVIDER, line):
+        # Save the metadata for the previous dependency.
+        if metadata:
+          dependencies.append(metadata)
+        metadata = {}
+        continue
+
+      # Otherwise, try to parse the field name and field value.
+      parts = line.split(": ", 1)
+      if len(parts) == 2:
+        raw_field, value = parts
+        field = field_lookup.get(raw_field.lower())
+        if field:
+          if field in metadata:
+            # Duplicate field for this dependency.
+            raise InvalidMetadata(f"duplicate '{field}' in {filepath}")
+          if field in MULTIVALUE_FIELDS:
+            metadata[field] = [
+                entry.strip() for entry in value.split(VALUE_DELIMITER)
+            ]
+          else:
+            metadata[field] = value
+
+    # The end of the file has been reached. Save the metadata for the
+    # last dependency, if available.
+    if metadata:
+      dependencies.append(metadata)
+
+  return dependencies
+
+
+def ProcessMetadata(metadata: Dict[str, Any],
+                    readme_path: str,
+                    path: str,
+                    root: str,
+                    require_license_file: bool = True,
+                    enable_warnings: bool = False) -> List[str]:
+  """Process a single dependency's metadata in-place. This function will
+  update the given metadata to use fallback field values, and update
+  filepaths to absolute paths.
+
+  Args:
+    metadata: a single dependency's metadata.
+    readme_path: the source of the metadata (either a metadata file
+                 or a SPECIAL_CASES entry).
+    path: the source directory for the metadata.
+    root: the root directory of the repo.
+    require_license_file: whether a license file is required.
+    enable_warnings: whether warnings should be displayed.
+
+  Returns: error messages, if there were any issues processing the
+           metadata for license information.
+  """
+  errors = []
+
+  # The dependency reference, for more precise error messages.
+  dep_ref = readme_path
+  dep_name = metadata.get("Name")
+  if dep_name:
+    dep_ref = f"{readme_path}>>{dep_name}"
+
+  # Set field values for fields with aliases.
+  for alias, field in ALIAS_FIELDS.items():
+    if alias in metadata:
+      metadata[field] = metadata[alias]
+      metadata.pop(alias)
+
+  # Set the default "License File" value.
+  if metadata.get("License File") is None:
+    metadata["License File"] = ["LICENSE"]
+
+  # If the "Shipped" field isn't present (or is empty), set it based on
+  # the value of the "License File" field.
+  if not metadata.get("Shipped"):
+    shipped = YES
+    if NOT_SHIPPED in metadata.get("License File"):
+      shipped = NO
+    metadata["Shipped"] = shipped
+
+  # Check all mandatory fields have a non-empty value.
+  for field in MANDATORY_FIELDS:
+    if not metadata.get(field):
+      errors.append(f"couldn't find '{field}' line in README.chromium or "
+                    "licenses.py SPECIAL_CASES")
+
+  license_file_value = metadata.get("License File")
+  shipped_value = metadata.get("Shipped")
+  if enable_warnings:
+    # Check for the deprecated special value used in the "License File"
+    # field.
+    if NOT_SHIPPED in license_file_value:
+      logging.warning(
+          f"{dep_ref} is using deprecated {NOT_SHIPPED} value "
+          "in 'License File' field - remove this and instead specify "
+          f"'Shipped: {NO}'.")
+
+      # Check the "Shipped" field does not contradict the "License File"
+      # field.
+      if shipped_value == YES:
+        logging.warning(
+            f"Contradictory metadata for {dep_ref} - 'Shipped: {YES}' "
+            f"but 'License File' includes '{NOT_SHIPPED}'")
+
+  # For the modules that are in the shipping product, we need their
+  # license in about:credits, so update the license files to be the
+  # full paths.
+  license_paths = process_license_files(root, path, license_file_value)
+  if shipped_value == YES and require_license_file and not license_paths:
+    errors.append(
+        f"License file not found for {dep_ref}. Either add a file named "
+        "LICENSE, import upstream's COPYING if available, or add a "
+        "'License File:' line to README.chromium with the appropriate paths.")
+  metadata["License File"] = license_paths
+
+  return errors
+
+
 def ParseDir(path,
              root,
              require_license_file=True,
-             optional_keys=None,
+             optional_keys=[],
              enable_warnings=False):
-  """Examine a third_party/foo component and extract its metadata."""
+  """Examine a third_party path and extract that directory's metadata.
+
+  Note: directory metadata can contain metadata for multiple
+  dependencies.
+  """
   if path in THIRD_PARTY_FOR_BUILD_FILES_ONLY:
-    return {}
-  # Parse metadata fields out of README.chromium.
-  # We examine "LICENSE" for the license file by default.
-  metadata = {
-      "License File": ["LICENSE"],  # Relative paths to license texts.
-      "Name": None,  # Short name (for header on about:credits).
-      "URL": None,  # Project home page.
-      "License": None,  # Software license.
-      "Shipped": None,  # Whether the package is in the shipped product.
-  }
+    return []
 
-  if optional_keys is None:
-    optional_keys = []
-
+  # Get the metadata values, from
+  # (a) looking up the path in SPECIAL_CASES; or
+  # (b) parsing the metadata from a README.chromium file.
   readme_path = ""
   if path in SPECIAL_CASES:
     readme_path = f"licenses.py SPECIAL_CASES entry for {path}"
-    metadata.update(SPECIAL_CASES[path])
+    directory_metadata = [dict(SPECIAL_CASES[path])]
   else:
     # Try to find README.chromium.
-    readme_path = os.path.join(root, path, 'README.chromium')
+    readme_path = os.path.join(root, path, "README.chromium")
     if not os.path.exists(readme_path):
       raise LicenseError("missing README.chromium or licenses.py "
                          "SPECIAL_CASES entry in %s\n" % path)
 
-    with codecs.open(readme_path, encoding='utf-8') as readme:
-      for line in readme:
-        line = line.strip()
-        if not line:
-          break
-        for key in list(metadata.keys()) + optional_keys:
-          field = key + ": "
-          if line.startswith(field):
-            value = line[len(field):]
-            # Multiple license files can be specified.
-            if key == "License File":
-              licenses = value.split(LICENSE_FILE_DELIMITER)
-              metadata[key] = [license.strip() for license in licenses]
-            else:
-              metadata[key] = value
+    try:
+      directory_metadata = ParseMetadataFile(readme_path,
+                                             optional_fields=optional_keys)
+    except InvalidMetadata as e:
+      raise LicenseError(f"Invalid metadata file: {e}")
 
-  if enable_warnings:
-    # Check for the deprecated special value used in the "License File" field.
-    if NOT_SHIPPED in metadata["License File"]:
-      logging.warning(f"{readme_path} is using deprecated {NOT_SHIPPED} "
-                      "value in 'License File' field - remove this and instead "
-                      f"specify 'Shipped: {NO}'.")
-
-      # Check the "Shipped" field does not contradict the "License File" field.
-      if metadata["Shipped"] == YES:
-        logging.warning(f"Contradictory metadata for {readme_path} - "
-                        f"'Shipped: {YES}' but 'License File' includes "
-                        f"'{NOT_SHIPPED}'")
-
-  # If the "Shipped" field isn't present, set it based on the value of the
-  # "License File" field.
-  if not metadata["Shipped"]:
-    shipped = YES
-    if NOT_SHIPPED in metadata["License File"]:
-      shipped = NO
-    metadata["Shipped"] = shipped
-
-  # Check that all expected metadata is present.
   errors = []
-  for key, value in metadata.items():
-    if not value:
-      errors.append("couldn't find '" + key + "' line "
-                    "in README.chromium or licences.py "
-                    "SPECIAL_CASES")
-
-  # For the modules that are in the shipping product, we need their license in
-  # about:credits, so update the license files to be the full paths.
-  license_paths = process_license_files(root, path, metadata["License File"])
-  if metadata["Shipped"] == YES and require_license_file and not license_paths:
-    errors.append("License file not found. "
-                  "Either add a file named LICENSE, "
-                  "import upstream's COPYING if available, "
-                  "or add a 'License File:' line to "
-                  "README.chromium with the appropriate paths.")
-  metadata["License File"] = license_paths
+  for dependency_metadata in directory_metadata:
+    # Process the metadata for licensing info.
+    dependency_errors = ProcessMetadata(
+        dependency_metadata,
+        readme_path,
+        path,
+        root,
+        require_license_file=require_license_file,
+        enable_warnings=enable_warnings)
+    errors.extend(dependency_errors)
 
   if errors:
     raise LicenseError("Errors in %s:\n %s\n" % (path, ";\n ".join(errors)))
-  return metadata
+
+  return directory_metadata
 
 
 def process_license_files(
@@ -954,33 +1073,37 @@
   entries_by_name = {}
   for path in third_party_dirs:
     try:
-      metadata = ParseDir(path,
-                          _REPOSITORY_ROOT,
-                          enable_warnings=enable_warnings)
-      if not metadata:
+      # Directory metadata can be for multiple dependencies.
+      directory_metadata = ParseDir(path,
+                                    _REPOSITORY_ROOT,
+                                    enable_warnings=enable_warnings)
+      if not directory_metadata:
         continue
     except LicenseError:
       # TODO(phajdan.jr): Convert to fatal error (http://crbug.com/39240).
       continue
-    if metadata['Shipped'] == NO:
-      continue
-    if target_os == 'ios' and not gn_target:
-      # Skip over files that are known not to be used on iOS. But
-      # skipping is unnecessary if GN was used to query the actual
-      # dependencies.
-      # TODO(lambroslambrou): Remove this step once the iOS build is
-      # updated to provide --gn-target to this script.
-      if path in KNOWN_NON_IOS_LIBRARIES:
+
+    for dep_metadata in directory_metadata:
+      if dep_metadata['Shipped'] == NO:
+        continue
+      if target_os == 'ios' and not gn_target:
+        # Skip over files that are known not to be used on iOS. But
+        # skipping is unnecessary if GN was used to query the actual
+        # dependencies.
+        # TODO(lambroslambrou): Remove this step once the iOS build is
+        # updated to provide --gn-target to this script.
+        if path in KNOWN_NON_IOS_LIBRARIES:
+          continue
+
+      new_entry = MetadataToTemplateEntry(dep_metadata, entry_template)
+      # Skip entries that we've already seen (it exists in multiple
+      # directories).
+      prev_entry = entries_by_name.setdefault(new_entry['name'], new_entry)
+      if prev_entry is not new_entry and (prev_entry['content']
+                                          == new_entry['content']):
         continue
 
-    new_entry = MetadataToTemplateEntry(metadata, entry_template)
-    # Skip entries that we've already seen (it exists in multiple directories).
-    prev_entry = entries_by_name.setdefault(new_entry['name'], new_entry)
-    if prev_entry is not new_entry and (prev_entry['content']
-                                        == new_entry['content']):
-      continue
-
-    entries.append(new_entry)
+      entries.append(new_entry)
 
   entries.sort(key=lambda entry: (entry['name'].lower(), entry['content']))
   for entry_id, entry in enumerate(entries):
@@ -1059,12 +1182,12 @@
   metadatas = {}
   for d in third_party_dirs:
     try:
-      md = ParseDir(d,
-                    _REPOSITORY_ROOT,
-                    require_license_file=True,
-                    enable_warnings=args.enable_warnings)
-      if md:
-        metadatas[d] = md
+      directory_metadata = ParseDir(d,
+                                    _REPOSITORY_ROOT,
+                                    require_license_file=True,
+                                    enable_warnings=args.enable_warnings)
+      if directory_metadata:
+        metadatas[d] = directory_metadata
     except LicenseError as lic_exp:
       # TODO(phajdan.jr): Convert to fatal error (http://crbug.com/39240).
       print(f"Error: {lic_exp}")
@@ -1091,7 +1214,7 @@
 
 
 def GenerateLicenseFileCsv(
-    metadata: Dict[str, Dict[str, Any]],
+    metadata: Dict[str, List[Dict[str, Any]]],
     repo_root: str = _REPOSITORY_ROOT,
 ) -> str:
   """Generates a CSV formatted file which contains license data to be used as
@@ -1107,7 +1230,7 @@
   #   * License text for library included in product,
   #   * Mirrored source for reciprocal licences.
   #   * Signoff date.
-  static_data = ["Chromium", "Yes", "Yes", "N/A"]
+  static_data = ["Chromium", "Yes", "No", "N/A"]
 
   # Add informative CSV header row to make it clear which columns represent
   # which data in the review spreadsheet.
@@ -1128,39 +1251,39 @@
   # Add necessary third_party.
   for directory in sorted(metadata):
     dir_metadata = metadata[directory]
+    for dep_metadata in dir_metadata:
+      # Only third party libraries which are shipped as part of a final
+      # product are in scope for license review.
+      if dep_metadata['Shipped'] == NO:
+        continue
 
-    # Only third party libraries which are shipped as part of a final product
-    # are in scope for license review.
-    if dir_metadata['Shipped'] == NO:
-      continue
+      data_row = [dep_metadata['Name'] or "UNKNOWN"]
 
-    data_row = [dir_metadata['Name'] or "UNKNOWN"]
+      urls = []
+      for lic in dep_metadata['License File']:
+        # The review process requires that a link is provided to each license
+        # which is included. We can achieve this by combining a static
+        # Chromium googlesource URL with the relative path to the license
+        # file from the top level Chromium src directory.
+        lic_url = (
+            "https://chromium.googlesource.com/chromium/src.git/+/refs/heads/main/"
+            + os.path.relpath(lic, repo_root))
 
-    urls = []
-    for lic in dir_metadata['License File']:
-      # The review process requires that a link is provided to each license
-      # which is included. We can achieve this by combining a static
-      # Chromium googlesource URL with the relative path to the license
-      # file from the top level Chromium src directory.
-      lic_url = (
-          "https://chromium.googlesource.com/chromium/src.git/+/refs/heads/main/"
-          + os.path.relpath(lic, repo_root))
+        # Since these are URLs and not paths, replace any Windows path `\`
+        # separators with a `/`
+        urls.append(lic_url.replace("\\", "/"))
 
-      # Since these are URLs and not paths, replace any Windows path `\`
-      # separators with a `/`
-      urls.append(lic_url.replace("\\", "/"))
+      data_row.append(", ".join(urls) or "UNKNOWN")
+      data_row.append(dep_metadata["License"] or "UNKNOWN")
 
-    data_row.append(", ".join(urls) or "UNKNOWN")
-    data_row.append(dir_metadata["License"] or "UNKNOWN")
-
-    # Join the default data which applies to each row
-    csv_writer.writerow(data_row + static_data)
+      # Join the default data which applies to each row
+      csv_writer.writerow(data_row + static_data)
 
   return csv_content.getvalue()
 
 
 def GenerateLicenseFilePlainText(
-    metadata: Dict[str, Dict[str, Any]],
+    metadata: Dict[str, List[Dict[str, Any]]],
     repo_root: str = _REPOSITORY_ROOT,
     read_file=lambda x: pathlib.Path(x).read_text(encoding='utf-8')
 ) -> str:
@@ -1176,20 +1299,21 @@
   # Add necessary third_party.
   for directory in sorted(metadata):
     dir_metadata = metadata[directory]
-    shipped = dir_metadata['Shipped']
-    license_files = dir_metadata['License File']
-    if shipped == YES and license_files:
-      content.append('-' * 20)
-      content.append(dir_metadata["Name"])
-      content.append('-' * 20)
-      for license_file in license_files:
-        content.append(read_file(os.path.join(repo_root, license_file)))
+    for dep_metadata in dir_metadata:
+      shipped = dep_metadata['Shipped']
+      license_files = dep_metadata['License File']
+      if shipped == YES and license_files:
+        content.append('-' * 20)
+        content.append(dep_metadata["Name"])
+        content.append('-' * 20)
+        for license_file in license_files:
+          content.append(read_file(os.path.join(repo_root, license_file)))
 
   return '\n'.join(content)
 
 
 def GenerateLicenseFileSpdx(
-    metadata: Dict[str, Dict[str, Any]],
+    metadata: Dict[str, List[Dict[str, Any]]],
     spdx_link_prefix: str,
     spdx_root: str,
     doc_name: Optional[str],
@@ -1221,12 +1345,13 @@
   # Add all third party libraries
   for directory in sorted(metadata):
     dir_metadata = metadata[directory]
-    shipped = dir_metadata['Shipped']
-    license_files = dir_metadata['License File']
-    if shipped == YES and license_files:
-      for license_file in license_files:
-        license_path = os.path.join(repo_root, license_file)
-        spdx_writer.add_package(dir_metadata['Name'], license_path)
+    for dep_metadata in dir_metadata:
+      shipped = dep_metadata['Shipped']
+      license_files = dep_metadata['License File']
+      if shipped == YES and license_files:
+        for license_file in license_files:
+          license_path = os.path.join(repo_root, license_file)
+          spdx_writer.add_package(dep_metadata['Name'], license_path)
 
   return spdx_writer.write()
 
diff --git a/tools/licenses/licenses_test.py b/tools/licenses/licenses_test.py
index 67d54a8..84029a7 100755
--- a/tools/licenses/licenses_test.py
+++ b/tools/licenses/licenses_test.py
@@ -27,73 +27,82 @@
 class LicensesTest(unittest.TestCase):
   def _get_metadata(self):
     return {
-        os.path.join('third_party', 'lib1'): {
+        os.path.join('third_party', 'lib1'): [{
             'Name': 'lib1',
             'Shipped': 'yes',
             'License': 'MIT',
             'License File': [os.path.join('third_party', 'lib1', 'LICENSE')],
-        },
-        os.path.join('third_party', 'lib2'): {
-            'Name':
-            'lib2',
-            'Shipped':
-            'yes',
-            'License':
-            'MIT, Apache 2.0',
+        }],
+        os.path.join('third_party', 'lib2'): [{
+            'Name': 'lib2',
+            'Shipped': 'yes',
+            'License': 'MIT, Apache 2.0',
             'License File': [
                 os.path.join('third_party', 'lib2', 'LICENSE-A'),
                 os.path.join('third_party', 'lib2', 'LICENSE-B'),
             ],
-        },
-        'ignored': {
+        }],
+        'ignored': [{
             'Name': 'ignored',
             'Shipped': 'no',
             'License File': [],
-        },
-        os.path.join('third_party', 'lib_unshipped'): {
-            'Name':
-            'lib_unshipped',
-            'Shipped':
-            'no',
-            'License':
-            '',
+        }],
+        os.path.join('third_party', 'lib_unshipped'): [{
+            'Name': 'lib_unshipped',
+            'Shipped': 'no',
+            'License': '',
             'License File': [
-                os.path.join('third_party', 'lib_unshipped', 'LICENSE'),
+                os.path.join('third_party', 'lib_unshipped', 'LICENSE')
             ],
-        },
-        os.path.join('third_party', 'lib3'): {
+        }],
+        os.path.join('third_party', 'lib3'): [{
             'Name': 'lib3',
             'Shipped': 'yes',
             'License': '',
             'License File': [os.path.join('third_party', 'lib3', 'LICENSE')],
-        },
-        os.path.join('third_party', 'lib3-v1'): {
+        }],
+        os.path.join('third_party', 'lib3-v1'): [{
             # Test SPDX license file dedup. (different name, same license file)
             'Name': 'lib3-v1',
             'Shipped': 'yes',
             'License': 'Apache 2.0',
-            'License File': [os.path.join('third_party', 'lib3', 'LICENSE')],
-        },
-        os.path.join('third_party', 'lib3-v2'): {
+            'License File': [
+                os.path.join('third_party', 'lib3', 'LICENSE'),
+            ],
+        }],
+        os.path.join('third_party', 'lib3-v2'): [{
             # Test SPDX id dedup. (same name, different license file)
             'Name': 'lib3',
             'Shipped': 'yes',
             'License': 'BSD',
             'License File': [os.path.join('third_party', 'lib3-v2', 'LICENSE')],
-        },
+        }],
     }
 
   def test_parse_dir(self):
     test_path = os.path.join('tools', 'licenses', 'test_dir')
-    metadata = licenses.ParseDir(test_path, REPOSITORY_ROOT)
-    expected = {
-        'License File': [os.path.join(REPOSITORY_ROOT, test_path, 'LICENSE')],
-        'Name': 'License tools directory parsing test',
-        'URL': 'https://chromium.tools.licenses.test/src.git',
-        'License': 'FAKE',
-        'Shipped': 'no',
-    }
-    self.assertDictEqual(metadata, expected)
+    dir_metadata = licenses.ParseDir(test_path, REPOSITORY_ROOT)
+    expected = [
+        {
+            'License File': [
+                os.path.join(REPOSITORY_ROOT, test_path, 'LICENSE')
+            ],
+            'Name': 'License tools directory parsing test',
+            'URL': 'https://chromium.tools.licenses.test/src.git',
+            'License': 'FAKE',
+            'Shipped': 'no',
+        },
+        {
+            'License File': [
+                os.path.join(REPOSITORY_ROOT, test_path, 'LICENSE')
+            ],
+            'Name': 'License tools directory parsing test for multiple',
+            'URL': 'https://chromium.tools.licenses.test/multi/src.git',
+            'License': 'FAKE',
+            'Shipped': 'no',
+        },
+    ]
+    self.assertListEqual(dir_metadata, expected)
 
   def test_get_third_party_deps_from_gn_deps_output(self):
     prune_path = next(iter(licenses.PRUNE_PATHS))
@@ -140,7 +149,8 @@
 
   def test_generate_license_file_csv(self):
     # This is the same for all the links and prevents wildly long strings.
-    prefix = "https://chromium.googlesource.com/chromium/src.git/+/refs/heads/main/"
+    prefix = (
+        "https://chromium.googlesource.com/chromium/src.git/+/refs/heads/main/")
 
     csv_file = io.StringIO(licenses.GenerateLicenseFileCsv(
         self._get_metadata()))
@@ -152,59 +162,53 @@
         'License Name': 'Chromium',
         'Binary which uses library': 'Chromium',
         'License text for library included?': 'Yes',
-        'Source code for library includes the mirrored source?': 'Yes',
+        'Source code for library includes the mirrored source?': 'No',
         'Authorization date': 'N/A'
     }, {
         'Library Name': 'lib1',
-        'Link to LICENSE file':
-        f'{prefix}tools/licenses/third_party/lib1/LICENSE',
+        'Link to LICENSE file': (
+            f'{prefix}tools/licenses/third_party/lib1/LICENSE'),
         'License Name': 'MIT',
         'Binary which uses library': 'Chromium',
         'License text for library included?': 'Yes',
-        'Source code for library includes the mirrored source?': 'Yes',
+        'Source code for library includes the mirrored source?': 'No',
         'Authorization date': 'N/A'
     }, {
-        'Library Name':
-        'lib2',
-        'Link to LICENSE file':
-        (f'{prefix}tools/licenses/third_party/lib2/LICENSE-A, '
-         f'{prefix}tools/licenses/third_party/lib2/LICENSE-B'),
-        'License Name':
-        'MIT, Apache 2.0',
-        'Binary which uses library':
-        'Chromium',
-        'License text for library included?':
-        'Yes',
-        'Source code for library includes the mirrored source?':
-        'Yes',
-        'Authorization date':
-        'N/A'
+        'Library Name': 'lib2',
+        'Link to LICENSE file': (
+            f'{prefix}tools/licenses/third_party/lib2/LICENSE-A, '
+            f'{prefix}tools/licenses/third_party/lib2/LICENSE-B'),
+        'License Name': 'MIT, Apache 2.0',
+        'Binary which uses library': 'Chromium',
+        'License text for library included?': 'Yes',
+        'Source code for library includes the mirrored source?': 'No',
+        'Authorization date': 'N/A'
     }, {
         'Library Name': 'lib3',
-        'Link to LICENSE file':
-        f'{prefix}tools/licenses/third_party/lib3/LICENSE',
+        'Link to LICENSE file': (
+            f'{prefix}tools/licenses/third_party/lib3/LICENSE'),
         'License Name': 'UNKNOWN',
         'Binary which uses library': 'Chromium',
         'License text for library included?': 'Yes',
-        'Source code for library includes the mirrored source?': 'Yes',
+        'Source code for library includes the mirrored source?': 'No',
         'Authorization date': 'N/A'
     }, {
         'Library Name': 'lib3-v1',
-        'Link to LICENSE file':
-        f'{prefix}tools/licenses/third_party/lib3/LICENSE',
+        'Link to LICENSE file': (
+            f'{prefix}tools/licenses/third_party/lib3/LICENSE'),
         'License Name': 'Apache 2.0',
         'Binary which uses library': 'Chromium',
         'License text for library included?': 'Yes',
-        'Source code for library includes the mirrored source?': 'Yes',
+        'Source code for library includes the mirrored source?': 'No',
         'Authorization date': 'N/A'
     }, {
         'Library Name': 'lib3',
-        'Link to LICENSE file':
-        f'{prefix}tools/licenses/third_party/lib3-v2/LICENSE',
+        'Link to LICENSE file': (
+            f'{prefix}tools/licenses/third_party/lib3-v2/LICENSE'),
         'License Name': 'BSD',
         'Binary which uses library': 'Chromium',
         'License text for library included?': 'Yes',
-        'Source code for library includes the mirrored source?': 'Yes',
+        'Source code for library includes the mirrored source?': 'No',
         'Authorization date': 'N/A'
     }]
 
diff --git a/tools/licenses/test_dir/README.chromium b/tools/licenses/test_dir/README.chromium
index 87a90929..c2c8a1d 100644
--- a/tools/licenses/test_dir/README.chromium
+++ b/tools/licenses/test_dir/README.chromium
@@ -4,7 +4,26 @@
 Version: 0
 Revision: v1.0.0
 License: FAKE
-License File: NONEXISTING-LICENSE, NOT_SHIPPED, //tools/licenses/test_dir/LICENSE
+License file: NONEXISTING-LICENSE, NOT_SHIPPED, //tools/licenses/test_dir/LICENSE
+Security Critical: no
+
+Description:
+This package contains only dummy files to test the ParseDir function
+in tools/licenses.py
+
+Local Modifications:
+N/A.
+
+-------------------- DEPENDENCY DIVIDER --------------------
+
+Name: License tools directory parsing test for multiple
+Short Name: tools-licenses-parse-dir-test-multi
+URL: https://chromium.tools.licenses.test/multi/src.git
+Version: 0
+Revision: v1.0.0
+License: FAKE
+Shipped in Chromium: no
+Shipped: yes
 Security Critical: no
 
 Description:
diff --git a/tools/mb/mb.py b/tools/mb/mb.py
index 80f93c3f..992ce130 100755
--- a/tools/mb/mb.py
+++ b/tools/mb/mb.py
@@ -87,13 +87,12 @@
     self.args = argparse.Namespace()
     self.configs = {}
     self.public_artifact_builders = None
+    self.gn_args_locations_files = []
     self.builder_groups = {}
     self.mixins = {}
     self.isolate_exe = 'isolate.exe' if self.platform.startswith(
         'win') else 'isolate'
     self.use_luci_auth = False
-    self.rts_out_dir = self.PathJoin('gen', 'rts')
-    self.banned_from_rts = set()
 
   def PostArgsInit(self):
     self.use_luci_auth = getattr(self.args, 'luci_auth', False)
@@ -105,16 +104,6 @@
       self.args.expectations_dir = os.path.join(
           os.path.dirname(self.args.config_file), 'mb_config_expectations')
 
-    banned_from_rts_map = json.loads(
-        self.ReadFile(
-            self.PathJoin(self.chromium_src_dir, 'tools', 'mb',
-                          'rts_banned_suites.json')))
-    self.banned_from_rts.update(banned_from_rts_map.get('*', set()))
-
-    if getattr(self.args, 'builder', None):
-      self.banned_from_rts.update(
-          banned_from_rts_map.get(self.args.builder, set()))
-
   def Main(self, args):
     self.ParseArgs(args)
     self.PostArgsInit()
@@ -175,15 +164,6 @@
                         help='Sets GN arg android_default_version_code')
       subp.add_argument('--android-version-name',
                         help='Sets GN arg android_default_version_name')
-      subp.add_argument('--rts',
-                        default=None,
-                        help='which regression test selection model to use'
-                        ' For more info about RTS, please see'
-                        ' //docs/testing/regression-test-selection.md')
-      subp.add_argument('--use-rts',
-                        action='store_true',
-                        default=False,
-                        help='Deprecated argument for enabling RTS')
 
       # TODO(crbug.com/1060857): Remove this once swarming task templates
       # support command prefixes.
@@ -282,10 +262,6 @@
                            'newline.')
     subp.add_argument('--json-output',
                       help='Write errors to json.output')
-    subp.add_argument('--rts-target-change-recall',
-                      type=float,
-                      help='how much safety is needed when selecting tests. '
-                      '0.0 is the lowest and 1.0 is the highest')
     subp.add_argument('path',
                       help='path to generate build into')
     subp.set_defaults(func=self.CmdGen)
@@ -467,41 +443,7 @@
       self.WriteFile(expectation_file, json_s)
     return 0
 
-  def RtsSelect(self):
-    if self.args.rts == 'rts-ml-chromium':
-      model_dir = self.PathJoin(self.chromium_src_dir, 'testing', 'rts',
-                                self.args.rts, self._CipdPlatform())
-      exe = self.PathJoin(model_dir, self.args.rts)
-    else:
-      model_dir = self.PathJoin(self.chromium_src_dir, 'testing', 'rts',
-                                self._CipdPlatform())
-      exe = self.PathJoin(model_dir, self.args.rts)
-
-    if self.platform == 'win32':
-      exe += '.exe'
-
-    args = [
-        exe,
-        'select',
-        '-gen-inverse',
-        '-model-dir', model_dir, \
-        '-out', self.PathJoin(self.ToAbsPath(self.args.path), self.rts_out_dir),
-        '-checkout', self.chromium_src_dir,
-    ]
-    if self.args.rts_target_change_recall:
-      if (self.args.rts_target_change_recall < 0
-          or self.args.rts_target_change_recall > 1):
-        self.WriteFailureAndRaise(
-            'rts-target-change-recall must be between (0 and 1]', None)
-      args += ['-target-change-recall', str(self.args.rts_target_change_recall)]
-
-    ret, _, err = self.Run(args, force_verbose=True)
-    if ret != 0:
-      self.WriteFailureAndRaise(err, None)
-
   def CmdGen(self):
-    if self.args.rts:
-      self.RtsSelect()
     vals = self.Lookup()
     return self.RunGNGen(vals)
 
@@ -930,11 +872,18 @@
 
     args_contents = ReplaceImports(args_contents)
     args_dict = gn_helpers.FromGNArgs(args_contents)
-    # Re-add the quotes around strings so they show up as they would in the
-    # args.gn file.
+    return self._convert_args_dict_to_args_string(args_dict)
+
+  def _convert_args_dict_to_args_string(self, args_dict):
+    """Format a dict of GN args into a single string."""
     for k, v in args_dict.items():
       if isinstance(v, str):
+        # Re-add the quotes around strings so they show up as they would in the
+        # args.gn file.
         args_dict[k] = '"%s"' % v
+      elif isinstance(v, bool):
+        # Convert boolean values to lower case strings.
+        args_dict[k] = str(v).lower()
     return ' '.join(['%s=%s' % (k, v) for (k, v) in args_dict.items()])
 
   def Lookup(self):
@@ -951,6 +900,11 @@
         raise e
       return vals
 
+    # "config" would be a dict if the GN args are loaded from a
+    # starlark-generated file.
+    if isinstance(config, dict):
+      return config
+
     # TODO(crbug.com/912681) Some iOS bots have a definition, with ios_error
     # as an indicator that it's incorrect. We utilize this to check the
     # iOS JSON instead, and error out if there exists no definition at all.
@@ -1003,6 +957,7 @@
 
     self.configs = contents['configs']
     self.mixins = contents['mixins']
+    self.gn_args_locations_files = contents.get('gn_args_locations_files', [])
     self.builder_groups = contents.get('builder_groups')
     self.public_artifact_builders = contents.get('public_artifact_builders')
 
@@ -1040,6 +995,27 @@
       raise MBErr('Must specify either -c/--config or '
                   '(--builder-group and -b/--builder)')
 
+    # Try finding gn-args.json generated by starlark definition.
+    for gn_args_locations_file in self.gn_args_locations_files:
+      locations_file_abs_path = os.path.join(
+          os.path.dirname(self.args.config_file),
+          os.path.normpath(gn_args_locations_file))
+      gn_args_locations = json.loads(self.ReadFile(locations_file_abs_path))
+      gn_args_file = gn_args_locations.get(self.args.builder_group,
+                                           {}).get(self.args.builder, None)
+      if gn_args_file:
+        gn_args_dict = json.loads(
+            self.ReadFile(
+                os.path.join(os.path.dirname(locations_file_abs_path),
+                             os.path.normpath(gn_args_file))))
+        return {
+            'args_file':
+            gn_args_dict.get('args_file', ''),
+            'gn_args':
+            self._convert_args_dict_to_args_string(
+                gn_args_dict.get('gn_args', {})) or ''
+        }
+
     if not self.args.builder_group in self.builder_groups:
       raise MBErr('Builder group name "%s" not found in "%s"' %
                   (self.args.builder_group, self.args.config_file))
@@ -1281,7 +1257,11 @@
       command, extra_files = self.GetSwarmingCommand(target, vals)
       runtime_deps = self.ReadFile(path_to_use).splitlines()
       runtime_deps = self._DedupDependencies(runtime_deps)
-      if 'is_skylab=true' in vals['gn_args']:
+      # TODO(crbug.com/1481305): Lacros gtest may need files from folders
+      # filtered out here. Eventually, we should move the filter to builder
+      # specific config. Before that, leave the filter only for Ash.
+      if ('is_skylab=true' in vals['gn_args']
+          and not 'chromeos_is_browser_only=true' in vals['gn_args']):
         runtime_deps = self._FilterOutUnneededSkylabDeps(runtime_deps)
 
       canonical_target = target.replace(':','_').replace('/','_')
@@ -1291,20 +1271,6 @@
         return ret
     return 0
 
-  def AddFilterFileArg(self, target, build_dir, command, inverted=False):
-    filter_file = ('%s_inverted' % target if inverted else target) + '.filter'
-    filter_file_path = self.PathJoin(self.rts_out_dir, filter_file)
-    abs_filter_file_path = self.ToAbsPath(build_dir, filter_file_path)
-
-    filter_exists = self.Exists(abs_filter_file_path)
-    if filter_exists:
-      filtered_command = command.copy()
-      filtered_command.append('--test-launcher-filter-file=%s' %
-                              filter_file_path)
-      self.Print('added RTS filter file to command: %s' % filter_file)
-      return filtered_command
-    return None
-
   def PossibleRuntimeDepsPaths(self, vals, ninja_targets, isolate_map):
     """Returns a map of targets to possible .runtime_deps paths.
 
@@ -1509,25 +1475,6 @@
             'files': files,
         }
     }
-    # For more info about RTS, please see
-    # //docs/testing/regression-test-selection.md
-    if self.args.rts:
-      if target in self.banned_from_rts:
-        self.Print('%s is banned for RTS on this builder' % target)
-      else:
-        rts_command = self.AddFilterFileArg(target,
-                                            build_dir,
-                                            command,
-                                            inverted=False)
-        if rts_command:
-          isolate['variables']['rts_command'] = rts_command
-
-        inverted_command = self.AddFilterFileArg(target,
-                                                 build_dir,
-                                                 command,
-                                                 inverted=True)
-        if inverted_command:
-          isolate['variables']['inverted_command'] = inverted_command
 
     self.WriteFile(isolate_path, json.dumps(isolate, sort_keys=True) + '\n')
 
@@ -1602,9 +1549,6 @@
     if android_version_name:
       gn_args += ' android_default_version_name="%s"' % android_version_name
 
-    if self.args.rts:
-      gn_args += ' use_rts=true'
-
     args_gn_lines = []
     parsed_gn_args = {}
 
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index d2977687..5dcd574 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -9,6 +9,14 @@
 # * trailing commas are allowed.
 
 {
+  # Paths to gn_args_locations.json relative to the directory containing mb_config.pyl.
+  # Such json files contain maps of
+  # builder group -> builder ID -> file path of "gn-args.json" generated from starlark.
+  'gn_args_locations_files': [
+      '../../infra/config/generated/builders/gn_args_locations.json',
+      '../../infra/config/generated/builders-dev/gn_args_locations.json',
+  ],
+
   # This is a map of builder group names -> builder names -> config names
   # (where each config name is a key in the 'configs' dict, below). MB uses
   # this dict to look up which config to use for a given bot.
@@ -19,6 +27,7 @@
       'chromeos-betty-arc-r-chrome': 'chromeos_betty-arc-r_include_unwind_tables_official_use_fake_dbus_clients_reclient',
       'chromeos-betty-pi-arc-cfi-thin-lto-chrome': 'chromeos_betty-pi-arc_cfi_thin_lto_official_reclient',
       'chromeos-betty-pi-arc-chrome': 'chromeos_betty-pi-arc_dchecks_reclient',
+      'chromeos-brya-chrome-skylab': 'chromeos_brya_include_unwind_tables_official_dchecks_skylab_reclient',
       'chromeos-eve-arc-r-chrome': 'chromeos_eve-arc-r_include_unwind_tables_official_reclient',
       'chromeos-eve-chrome': 'chromeos_eve_include_unwind_tables_official_dchecks_reclient',
       'chromeos-jacuzzi-chrome': 'chromeos_jacuzzi_include_unwind_tables_official_reclient',
@@ -288,20 +297,21 @@
     },
 
     'chromium.dev': {
-      # This should be the same with 'android-pie-arm64-rel'.
+      # This should be the same as 'android-pie-arm64-rel'.
       'android-pie-arm64-rel-dev':  'android_release_bot_minimal_symbols_arm64_webview_monochrome_reclient',
 
-      # These should be the same with 'Linux Builder'.
+      # These should be the same as 'Linux Builder'.
       'linux-local-ssd-rel-dev': 'gpu_tests_release_bot_do_typecheck_reclient',
       'linux-rel-dev': 'gpu_tests_release_bot_do_typecheck_reclient',
       'linux-rel-jammy-dev': 'gpu_tests_release_bot_do_typecheck_reclient',
       'linux-remote-ssd-rel-dev': 'gpu_tests_release_bot_do_typecheck_reclient',
 
-      # This should be the same with 'Mac Builder'.
+      # This should be the same as 'Mac Builder'.
       'mac-arm-rel-dev': 'gpu_tests_release_bot_minimal_symbols_no_nacl_reclient',
       'mac-rel-dev': 'gpu_tests_release_bot_minimal_symbols_no_nacl_reclient',
 
-      # This should be the same with 'Win x64 Builder'.
+      # This should be the same as 'Win x64 Builder'.
+      'win-local-ssd-rel-dev': 'gpu_tests_release_bot_minimal_symbols_reclient',
       'win-rel-dev': 'gpu_tests_release_bot_minimal_symbols_reclient',
       'win11-rel-dev': 'gpu_tests_release_bot_minimal_symbols_reclient',
     },
@@ -499,6 +509,7 @@
       'mac-perfetto-rel': 'perfetto_release_bot_reclient',
       'mac-upload-perfetto': 'release_bot_perfetto_zlib_reclient',
       'mac10.15-wpt-content-shell-fyi-rel': 'release_trybot_minimal_symbols_reclient',
+      'mac11-arm64-wpt-content-shell-fyi-rel': 'mac_arm64_release_bot_reclient',
       'mac11-wpt-content-shell-fyi-rel': 'release_trybot_minimal_symbols_reclient',
       'mac12-arm64-wpt-content-shell-fyi-rel': 'mac_arm64_release_bot_reclient',
       'mac12-wpt-content-shell-fyi-rel': 'release_trybot_minimal_symbols_reclient',
@@ -912,7 +923,6 @@
       'chromeos-betty-pi-arc-chrome-accessibility-fyi': 'chromeos_betty-pi-arc_dchecks_reclient',
       'chromeos-betty-pi-arc-chrome-dchecks': 'chromeos_betty-pi-arc_dchecks_reclient',
       'chromeos-betty-pi-arc-finch-smoke-chrome': 'chromeos_betty-pi-arc_dchecks_reclient',
-      'chromeos-brya-chrome-skylab-fyi': 'chromeos_brya_include_unwind_tables_official_dchecks_skylab_reclient',
       'chromeos-jacuzzi-chrome-skylab-fyi': 'chromeos_jacuzzi_include_unwind_tables_official_dchecks_skylab_reclient',
       'chromeos-octopus-chrome-skylab-fyi': 'chromeos_octopus_include_unwind_tables_official_dchecks_skylab_reclient',
       'chromeos-trogdor-chrome-skylab-fyi': 'chromeos_trogdor_include_unwind_tables_official_dchecks_skylab_reclient',
@@ -921,6 +931,17 @@
       'lacros-arm-generic-chrome-fyi': 'chromeos_arm-generic_lacros_official_skylab_reclient',
     },
 
+    'internal.optimization_guide': {
+      'companion-linux': 'companion_dbg',
+      'companion-win64': 'companion_dbg',
+      'optimization_guide-android-arm64': 'optimization_guide_android_arm64_rel',
+      'optimization_guide-chromeos': 'optimization_guide_cros_rel',
+      'optimization_guide-linux': 'optimization_guide_rel',
+      'optimization_guide-mac': 'optimization_guide_rel',
+      'optimization_guide-win32': 'optimization_guide_x86_rel',
+      'optimization_guide-win64': 'optimization_guide_rel',
+    },
+
     # Internal codesearch builders.
     'luci.infra-internal.codesearch': {
       'codesearch-gen-chrome-internal-linux': 'codesearch_gen_chromium_bot_reclient',
@@ -1021,6 +1042,7 @@
       'android-10-arm64-rel': 'android_release_trybot_arm64_fastbuild_webview_trichrome_reclient',
       'android-11-x86-rel': 'android_release_trybot_x86_fastbuild_webview_trichrome_reclient',
       'android-12-x64-dbg': 'android_debug_trybot_x64_webview_trichrome_webview_shell_reclient',
+      'android-12-x64-dual-coverage-exp-rel': 'android_release_trybot_x64_dual_coverage_fastbuild_webview_trichrome_reclient',
       'android-12-x64-rel': 'android_release_trybot_x64_coverage_fastbuild_webview_trichrome_reclient',
       'android-12-x64-siso-rel': 'android_release_trybot_x64_coverage_fastbuild_webview_trichrome_reclient',
       'android-12l-x64-dbg': 'android_debug_trybot_x64_webview_trichrome_webview_shell_reclient',
@@ -1052,6 +1074,8 @@
       'android-cronet-x86-dbg': 'android_cronet_debug_static_bot_x86_reclient',
       'android-cronet-x86-dbg-10-tests': 'android_cronet_debug_static_bot_x86_reclient',
       'android-cronet-x86-dbg-11-tests': 'android_cronet_debug_static_bot_x86_reclient',
+      'android-cronet-x86-dbg-lollipop-tests': 'android_cronet_debug_static_bot_x86_reclient',
+      'android-cronet-x86-dbg-marshmallow-tests': 'android_cronet_debug_static_bot_x86_reclient',
       'android-cronet-x86-dbg-nougat-tests': 'android_cronet_debug_static_bot_x86_reclient',
       'android-cronet-x86-dbg-oreo-tests': 'android_cronet_debug_static_bot_x86_reclient',
       'android-cronet-x86-dbg-pie-tests': 'android_cronet_debug_static_bot_x86_reclient',
@@ -1060,6 +1084,7 @@
       'android-deterministic-rel': 'android_without_codecs_release_trybot_reclient',
       'android-fieldtrial-rel': 'android_release_trybot_x64_fastbuild_webview_trichrome_reclient',
       'android-inverse-fieldtrials-pie-x86-fyi-rel': 'android_release_trybot_x86_fastbuild_webview_google_invert_fieldtrials_reclient',
+      'android-nougat-x86-dual-coverage-exp-rel': 'android_release_trybot_x86_fastbuild_webview_monochrome_dual_coverage_reclient',
       'android-nougat-x86-rel': 'android_release_trybot_x86_fastbuild_webview_monochrome_coverage_reclient',
       'android-nougat-x86-siso-rel': 'android_release_trybot_x86_fastbuild_webview_monochrome_coverage_reclient',
       'android-oreo-arm64-dbg': 'android_debug_trybot_arm64_reclient',
@@ -1121,7 +1146,6 @@
       'chromeos-amd64-generic-dbg': 'chromeos_amd64-generic_dbg_reclient',
       'chromeos-amd64-generic-lacros-dbg': 'chromeos_amd64-generic_lacros_dbg_reclient',
       'chromeos-amd64-generic-rel': 'chromeos_amd64-generic_use_fake_dbus_clients_vm_optimized_dchecks_reclient',
-      'chromeos-amd64-generic-rel-rts': 'chromeos_amd64-generic_use_fake_dbus_clients_vm_optimized_dchecks_reclient',
       'chromeos-amd64-generic-siso-rel': 'chromeos_amd64-generic_use_fake_dbus_clients_vm_optimized_dchecks_reclient',
       'chromeos-arm-generic-dbg': 'chromeos_arm-generic_dbg_try_reclient',
       'chromeos-arm-generic-rel': 'chromeos_arm-generic_dcheck_always_on_reclient',
@@ -1143,11 +1167,9 @@
       'linux-chromeos-dbg': 'chromeos_with_codecs_debug_bot_reclient',
       'linux-chromeos-inverse-fieldtrials-fyi-rel': 'chromeos_with_codecs_release_trybot_invert_fieldtrials_reclient',
       'linux-chromeos-rel': 'chromeos_with_codecs_release_trybot_code_coverage_reclient',
-      'linux-chromeos-rel-rts': 'chromeos_with_codecs_release_trybot_code_coverage_reclient',
       'linux-chromeos-siso-rel': 'chromeos_with_codecs_release_trybot_code_coverage_reclient',
       'linux-lacros-dbg': 'lacros_on_linux_debug_bot_reclient',
       'linux-lacros-rel': 'lacros_on_linux_release_trybot_reclient_code_coverage',
-      'linux-lacros-rel-rts': 'lacros_on_linux_release_trybot_reclient',
       'linux-lacros-siso-rel': 'lacros_on_linux_release_trybot_reclient_code_coverage',
     },
 
@@ -1348,6 +1370,7 @@
       'mac-siso-rel': 'gpu_tests_release_trybot_no_symbols_mac_code_coverage_x64_reclient',
       'mac10.15-wpt-content-shell-fyi-rel': 'release_trybot_minimal_symbols_reclient',
       'mac11-arm64-rel': 'mac_arm64_gpu_tests_release_trybot_no_symbols_reclient',
+      'mac11-arm64-wpt-content-shell-fyi-rel': 'mac_arm64_release_trybot_reclient',
       'mac11-wpt-content-shell-fyi-rel': 'release_trybot_minimal_symbols_reclient',
       'mac12-arm64-rel': 'mac_arm64_gpu_tests_release_trybot_no_symbols_reclient',
       'mac12-arm64-wpt-content-shell-fyi-rel': 'mac_arm64_release_trybot_reclient',
@@ -1476,6 +1499,20 @@
       'devtools_frontend_linux_blink_rel': 'release_trybot_blink_do_typecheck',
     },
 
+    'tryserver.internal.optimization_guide': {
+      'companion-linux': 'companion_dbg',
+      'companion-win64': 'companion_dbg',
+      'model_validation-linux': 'optimization_guide_rel',
+      'model_validation-win32': 'optimization_guide_x86_rel',
+      'model_validation-win64': 'optimization_guide_rel',
+      'optimization_guide-android-arm64': 'optimization_guide_android_arm64_rel',
+      'optimization_guide-chromeos': 'optimization_guide_cros_rel',
+      'optimization_guide-linux': 'optimization_guide_rel',
+      'optimization_guide-mac': 'optimization_guide_rel',
+      'optimization_guide-win32': 'optimization_guide_x86_rel',
+      'optimization_guide-win64': 'optimization_guide_rel',
+    },
+
     'tryserver.v8': {
       'v8_linux_blink_rel': 'release_trybot_blink',
       'v8_linux_chromium_gn_rel': 'release_trybot_reclient',
@@ -1841,6 +1878,14 @@
       'webview_trichrome', 'no_secondary_abi', 'webview_shell',
     ],
 
+    # TODO(crbug.com/1416662): Add java coverage once dual coverage supported
+    # in recipe.
+    'android_release_trybot_x64_dual_coverage_fastbuild_webview_trichrome_reclient': [
+      'android', 'release_trybot_reclient', 'strip_debug_info', 'x64',
+      'android_fastbuild', 'use_clang_coverage', 'partial_code_coverage_instrumentation',
+      'webview_trichrome', 'no_secondary_abi', 'webview_shell',
+    ],
+
     'android_release_trybot_x64_fastbuild_webview_trichrome_reclient': [
       'android', 'release_trybot_reclient', 'strip_debug_info', 'x64',
       'android_fastbuild', 'webview_trichrome',
@@ -1867,6 +1912,14 @@
       'webview_monochrome', 'webview_shell',
     ],
 
+    # TODO(crbug.com/1416662): Add java coverage once dual coverage supported
+    # in recipe.
+    'android_release_trybot_x86_fastbuild_webview_monochrome_dual_coverage_reclient': [
+      'android', 'release_trybot_reclient', 'strip_debug_info', 'x86',
+      'android_fastbuild', 'use_clang_coverage', 'partial_code_coverage_instrumentation',
+      'webview_monochrome', 'webview_shell',
+    ],
+
     'android_release_trybot_x86_fastbuild_webview_monochrome_reclient': [
       'android', 'release_trybot_reclient', 'strip_debug_info', 'x86',
       'android_fastbuild', 'webview_monochrome', 'webview_shell',
@@ -2542,6 +2595,10 @@
       'codesearch_reclient', 'mac',
     ],
 
+    'companion_dbg': [
+      'chrome_branded', 'debug', 'reclient', 'shared',
+    ],
+
     'dawn_tests_android_arm64_release_trybot_reclient': [
       'android', 'arm64', 'release_trybot_minimal_symbols_reclient',
     ],
@@ -3452,6 +3509,22 @@
       'official', 'reclient', 'x86', 'no_symbols', 'pgo_phase_1', 'release'
     ],
 
+    'optimization_guide_android_arm64_rel': [
+      'minimal_symbols', 'optimization_guide', 'reclient', 'release', 'android', 'arm64',
+    ],
+
+    'optimization_guide_cros_rel': [
+      'minimal_symbols', 'optimization_guide', 'reclient', 'release', 'chromeos',
+    ],
+
+    'optimization_guide_rel': [
+      'minimal_symbols', 'optimization_guide', 'reclient', 'release',
+    ],
+
+    'optimization_guide_x86_rel': [
+      'minimal_symbols', 'optimization_guide', 'reclient', 'release', 'x86',
+    ],
+
     'perfetto_release_bot_reclient': [
       'perfetto', 'release_bot_reclient',
     ],
@@ -4517,6 +4590,10 @@
       'mixins': ['official_optimize', 'reclient', 'minimal_symbols', 'dcheck_always_on'],
     },
 
+    'optimization_guide': {
+        'gn_args': 'build_with_internal_optimization_guide=true'
+    },
+
     'optimize_for_fuzzing': {
       'gn_args': 'optimize_for_fuzzing=true',
     },
diff --git a/tools/mb/mb_config_expectations/chrome.json b/tools/mb/mb_config_expectations/chrome.json
index 766e7f1..4b452bf 100644
--- a/tools/mb/mb_config_expectations/chrome.json
+++ b/tools/mb/mb_config_expectations/chrome.json
@@ -73,6 +73,19 @@
       "use_remoteexec": true
     }
   },
+  "chromeos-brya-chrome-skylab": {
+    "args_file": "//build/args/chromeos/brya.gni",
+    "gn_args": {
+      "dcheck_always_on": true,
+      "exclude_unwind_tables": false,
+      "is_chrome_branded": true,
+      "is_chromeos_device": true,
+      "is_official_build": true,
+      "is_skylab": true,
+      "ozone_platform_headless": true,
+      "use_remoteexec": true
+    }
+  },
   "chromeos-eve-arc-r-chrome": {
     "args_file": "//build/args/chromeos/eve-arc-r.gni",
     "gn_args": {
diff --git a/tools/mb/mb_config_expectations/chromium.dev.json b/tools/mb/mb_config_expectations/chromium.dev.json
index 0971beb..f479a431 100644
--- a/tools/mb/mb_config_expectations/chromium.dev.json
+++ b/tools/mb/mb_config_expectations/chromium.dev.json
@@ -83,6 +83,17 @@
       "use_remoteexec": true
     }
   },
+  "win-local-ssd-rel-dev": {
+    "gn_args": {
+      "dcheck_always_on": false,
+      "ffmpeg_branding": "Chrome",
+      "is_component_build": false,
+      "is_debug": false,
+      "proprietary_codecs": true,
+      "symbol_level": 1,
+      "use_remoteexec": true
+    }
+  },
   "win-rel-dev": {
     "gn_args": {
       "dcheck_always_on": false,
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json
index cf98172..03b7d66d 100644
--- a/tools/mb/mb_config_expectations/chromium.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -1233,6 +1233,15 @@
       "use_remoteexec": true
     }
   },
+  "mac11-arm64-wpt-content-shell-fyi-rel": {
+    "gn_args": {
+      "dcheck_always_on": false,
+      "is_component_build": false,
+      "is_debug": false,
+      "target_cpu": "arm64",
+      "use_remoteexec": true
+    }
+  },
   "mac11-wpt-content-shell-fyi-rel": {
     "gn_args": {
       "dcheck_always_on": true,
diff --git a/tools/mb/mb_config_expectations/internal.chromeos.fyi.json b/tools/mb/mb_config_expectations/internal.chromeos.fyi.json
index 64a833f9..db62a83 100644
--- a/tools/mb/mb_config_expectations/internal.chromeos.fyi.json
+++ b/tools/mb/mb_config_expectations/internal.chromeos.fyi.json
@@ -41,19 +41,6 @@
       "use_remoteexec": true
     }
   },
-  "chromeos-brya-chrome-skylab-fyi": {
-    "args_file": "//build/args/chromeos/brya.gni",
-    "gn_args": {
-      "dcheck_always_on": true,
-      "exclude_unwind_tables": false,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "is_skylab": true,
-      "ozone_platform_headless": true,
-      "use_remoteexec": true
-    }
-  },
   "chromeos-jacuzzi-chrome-skylab-fyi": {
     "args_file": "//build/args/chromeos/jacuzzi.gni",
     "gn_args": {
diff --git a/tools/mb/mb_config_expectations/internal.optimization_guide.json b/tools/mb/mb_config_expectations/internal.optimization_guide.json
new file mode 100644
index 0000000..c8c6b32e
--- /dev/null
+++ b/tools/mb/mb_config_expectations/internal.optimization_guide.json
@@ -0,0 +1,79 @@
+{
+  "companion-linux": {
+    "gn_args": {
+      "is_chrome_branded": true,
+      "is_component_build": true,
+      "is_debug": true,
+      "use_remoteexec": true
+    }
+  },
+  "companion-win64": {
+    "gn_args": {
+      "is_chrome_branded": true,
+      "is_component_build": true,
+      "is_debug": true,
+      "use_remoteexec": true
+    }
+  },
+  "optimization_guide-android-arm64": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "debuggable_apks": false,
+      "ffmpeg_branding": "Chrome",
+      "is_debug": false,
+      "proprietary_codecs": true,
+      "symbol_level": 1,
+      "target_cpu": "arm64",
+      "target_os": "android",
+      "use_remoteexec": true
+    }
+  },
+  "optimization_guide-chromeos": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "target_os": "chromeos",
+      "use_remoteexec": true
+    }
+  },
+  "optimization_guide-linux": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "use_remoteexec": true
+    }
+  },
+  "optimization_guide-mac": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "use_remoteexec": true
+    }
+  },
+  "optimization_guide-win32": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "target_cpu": "x86",
+      "use_remoteexec": true
+    }
+  },
+  "optimization_guide-win64": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "use_remoteexec": true
+    }
+  }
+}
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.android.json b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
index 59e539ffd..ab76a7f 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.android.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
@@ -49,6 +49,27 @@
       "use_remoteexec": true
     }
   },
+  "android-12-x64-dual-coverage-exp-rel": {
+    "gn_args": {
+      "android_static_analysis": "off",
+      "coverage_instrumentation_input_file": "//.code-coverage/files_to_instrument.txt",
+      "dcheck_always_on": true,
+      "debuggable_apks": false,
+      "ffmpeg_branding": "Chrome",
+      "is_component_build": false,
+      "is_debug": false,
+      "proprietary_codecs": true,
+      "skip_secondary_abi_for_cq": true,
+      "strip_debug_info": true,
+      "symbol_level": 0,
+      "system_webview_package_name": "com.google.android.webview.debug",
+      "system_webview_shell_package_name": "org.chromium.my_webview_shell",
+      "target_cpu": "x64",
+      "target_os": "android",
+      "use_clang_coverage": true,
+      "use_remoteexec": true
+    }
+  },
   "android-12-x64-rel": {
     "gn_args": {
       "android_static_analysis": "off",
@@ -758,6 +779,62 @@
       "use_thin_lto": false
     }
   },
+  "android-cronet-x86-dbg-lollipop-tests": {
+    "gn_args": {
+      "clang_use_default_sample_profile": false,
+      "debuggable_apks": false,
+      "default_min_sdk_version": 21,
+      "disable_file_support": true,
+      "enable_base_tracing": false,
+      "enable_reporting": true,
+      "enable_resource_allowlist_generation": false,
+      "enable_websockets": false,
+      "ffmpeg_branding": "Chrome",
+      "include_transport_security_state_preload_list": false,
+      "is_component_build": false,
+      "is_cronet_build": true,
+      "is_debug": true,
+      "media_use_ffmpeg": false,
+      "proprietary_codecs": true,
+      "symbol_level": 1,
+      "target_cpu": "x86",
+      "target_os": "android",
+      "use_crash_key_stubs": true,
+      "use_hashed_jni_names": true,
+      "use_partition_alloc": false,
+      "use_platform_icu_alternatives": true,
+      "use_remoteexec": true,
+      "use_thin_lto": false
+    }
+  },
+  "android-cronet-x86-dbg-marshmallow-tests": {
+    "gn_args": {
+      "clang_use_default_sample_profile": false,
+      "debuggable_apks": false,
+      "default_min_sdk_version": 21,
+      "disable_file_support": true,
+      "enable_base_tracing": false,
+      "enable_reporting": true,
+      "enable_resource_allowlist_generation": false,
+      "enable_websockets": false,
+      "ffmpeg_branding": "Chrome",
+      "include_transport_security_state_preload_list": false,
+      "is_component_build": false,
+      "is_cronet_build": true,
+      "is_debug": true,
+      "media_use_ffmpeg": false,
+      "proprietary_codecs": true,
+      "symbol_level": 1,
+      "target_cpu": "x86",
+      "target_os": "android",
+      "use_crash_key_stubs": true,
+      "use_hashed_jni_names": true,
+      "use_partition_alloc": false,
+      "use_platform_icu_alternatives": true,
+      "use_remoteexec": true,
+      "use_thin_lto": false
+    }
+  },
   "android-cronet-x86-dbg-nougat-tests": {
     "gn_args": {
       "clang_use_default_sample_profile": false,
@@ -934,6 +1011,26 @@
       "use_remoteexec": true
     }
   },
+  "android-nougat-x86-dual-coverage-exp-rel": {
+    "gn_args": {
+      "android_static_analysis": "off",
+      "coverage_instrumentation_input_file": "//.code-coverage/files_to_instrument.txt",
+      "dcheck_always_on": true,
+      "debuggable_apks": false,
+      "ffmpeg_branding": "Chrome",
+      "is_component_build": false,
+      "is_debug": false,
+      "proprietary_codecs": true,
+      "strip_debug_info": true,
+      "symbol_level": 0,
+      "system_webview_package_name": "com.google.android.apps.chrome",
+      "system_webview_shell_package_name": "org.chromium.my_webview_shell",
+      "target_cpu": "x86",
+      "target_os": "android",
+      "use_clang_coverage": true,
+      "use_remoteexec": true
+    }
+  },
   "android-nougat-x86-rel": {
     "gn_args": {
       "android_static_analysis": "off",
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json b/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json
index e4bac828..9c63f24 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json
@@ -46,17 +46,6 @@
       "use_remoteexec": true
     }
   },
-  "chromeos-amd64-generic-rel-rts": {
-    "args_file": "//build/args/chromeos/amd64-generic-vm.gni",
-    "gn_args": {
-      "also_build_lacros_chrome_for_architecture": "amd64",
-      "dcheck_always_on": true,
-      "is_chromeos_device": true,
-      "ozone_platform_headless": true,
-      "use_real_dbus_clients": false,
-      "use_remoteexec": true
-    }
-  },
   "chromeos-amd64-generic-siso-rel": {
     "args_file": "//build/args/chromeos/amd64-generic-vm.gni",
     "gn_args": {
@@ -315,24 +304,6 @@
       "use_remoteexec": true
     }
   },
-  "linux-chromeos-rel-rts": {
-    "gn_args": {
-      "also_build_lacros_chrome": true,
-      "coverage_instrumentation_input_file": "//.code-coverage/files_to_instrument.txt",
-      "dcheck_always_on": true,
-      "enable_backup_ref_ptr_feature_flag": true,
-      "enable_dangling_raw_ptr_checks": true,
-      "enable_dangling_raw_ptr_feature_flag": true,
-      "ffmpeg_branding": "ChromeOS",
-      "is_component_build": false,
-      "is_debug": false,
-      "proprietary_codecs": true,
-      "symbol_level": 0,
-      "target_os": "chromeos",
-      "use_clang_coverage": true,
-      "use_remoteexec": true
-    }
-  },
   "linux-chromeos-siso-rel": {
     "gn_args": {
       "also_build_lacros_chrome": true,
@@ -377,18 +348,6 @@
       "use_remoteexec": true
     }
   },
-  "linux-lacros-rel-rts": {
-    "gn_args": {
-      "also_build_ash_chrome": true,
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": true,
-      "is_component_build": false,
-      "is_debug": false,
-      "symbol_level": 0,
-      "target_os": "chromeos",
-      "use_remoteexec": true
-    }
-  },
   "linux-lacros-siso-rel": {
     "gn_args": {
       "also_build_ash_chrome": true,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.mac.json b/tools/mb/mb_config_expectations/tryserver.chromium.mac.json
index aac9c722..c2425b5 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.mac.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.mac.json
@@ -641,6 +641,16 @@
       "use_remoteexec": true
     }
   },
+  "mac11-arm64-wpt-content-shell-fyi-rel": {
+    "gn_args": {
+      "dcheck_always_on": true,
+      "is_component_build": false,
+      "is_debug": false,
+      "symbol_level": 0,
+      "target_cpu": "arm64",
+      "use_remoteexec": true
+    }
+  },
   "mac11-wpt-content-shell-fyi-rel": {
     "gn_args": {
       "dcheck_always_on": true,
diff --git a/tools/mb/mb_config_expectations/tryserver.internal.optimization_guide.json b/tools/mb/mb_config_expectations/tryserver.internal.optimization_guide.json
new file mode 100644
index 0000000..acb1c79
--- /dev/null
+++ b/tools/mb/mb_config_expectations/tryserver.internal.optimization_guide.json
@@ -0,0 +1,107 @@
+{
+  "companion-linux": {
+    "gn_args": {
+      "is_chrome_branded": true,
+      "is_component_build": true,
+      "is_debug": true,
+      "use_remoteexec": true
+    }
+  },
+  "companion-win64": {
+    "gn_args": {
+      "is_chrome_branded": true,
+      "is_component_build": true,
+      "is_debug": true,
+      "use_remoteexec": true
+    }
+  },
+  "model_validation-linux": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "use_remoteexec": true
+    }
+  },
+  "model_validation-win32": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "target_cpu": "x86",
+      "use_remoteexec": true
+    }
+  },
+  "model_validation-win64": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "use_remoteexec": true
+    }
+  },
+  "optimization_guide-android-arm64": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "debuggable_apks": false,
+      "ffmpeg_branding": "Chrome",
+      "is_debug": false,
+      "proprietary_codecs": true,
+      "symbol_level": 1,
+      "target_cpu": "arm64",
+      "target_os": "android",
+      "use_remoteexec": true
+    }
+  },
+  "optimization_guide-chromeos": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "target_os": "chromeos",
+      "use_remoteexec": true
+    }
+  },
+  "optimization_guide-linux": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "use_remoteexec": true
+    }
+  },
+  "optimization_guide-mac": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "use_remoteexec": true
+    }
+  },
+  "optimization_guide-win32": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "target_cpu": "x86",
+      "use_remoteexec": true
+    }
+  },
+  "optimization_guide-win64": {
+    "gn_args": {
+      "build_with_internal_optimization_guide": true,
+      "dcheck_always_on": false,
+      "is_debug": false,
+      "symbol_level": 1,
+      "use_remoteexec": true
+    }
+  }
+}
\ No newline at end of file
diff --git a/tools/mb/mb_unittest.py b/tools/mb/mb_unittest.py
index 53df08b..d302a44 100755
--- a/tools/mb/mb_unittest.py
+++ b/tools/mb/mb_unittest.py
@@ -207,6 +207,40 @@
 }
 """
 
+CONFIG_STARLARK_GN_ARGS = """\
+{
+  'gn_args_locations_files': [
+      '../../infra/config/generated/builders/gn_args_locations.json',
+  ],
+  'builder_groups': {
+  },
+  'configs': {
+  },
+  'mixins': {
+  },
+}
+"""
+
+TEST_GN_ARGS_LOCATIONS_JSON = """\
+{
+  "chromium": {
+    "linux-official": "ci/linux-official/gn-args.json"
+  },
+  "tryserver.chromium": {
+    "linux-official": "try/linux-official/gn-args.json"
+  }
+}
+"""
+
+TEST_GN_ARGS_JSON = """\
+{
+  "gn_args": {
+    "string_arg": "has double quotes",
+    "bool_arg_lower_case": true
+  }
+}
+"""
+
 TEST_BAD_CONFIG = """\
 {
   'configs': {
@@ -872,6 +906,38 @@
                     '""" to _path_/args.gn.\n\n'
                     '/fake_src/buildtools/linux64/gn gen _path_\n'))
 
+  def test_lookup_starlark_generated_gn_args(self):
+    is_win = sys.platform == 'win32'
+    paths = [
+        '/fake_src/tools/mb/mb_config.pyl',
+        '/fake_src/tools/mb/../../infra/config/generated/builders/'
+        'gn_args_locations.json',
+        '/fake_src/tools/mb/../../infra/config/generated/builders/'
+        'ci/linux-official/gn-args.json',
+    ]
+    files = {
+        'c:' + paths[0].replace('/', '\\') if is_win else paths[0]:
+        CONFIG_STARLARK_GN_ARGS,
+        'c:' + paths[1].replace('/', '\\') if is_win else paths[1]:
+        TEST_GN_ARGS_LOCATIONS_JSON,
+        'c:' + paths[2].replace('/', '\\') if is_win else paths[2]:
+        TEST_GN_ARGS_JSON,
+    }
+    mbw = self.fake_mbw(files=files, win32=is_win)
+    expected_out = ('\n'
+                    'Writing """\\\n'
+                    'bool_arg_lower_case = true\n'
+                    'string_arg = "has double quotes"\n'
+                    '""" to _path_/args.gn.\n\n')
+    if is_win:
+      expected_out += 'c:\\fake_src\\buildtools\\win\\gn.exe gen _path_\n'
+    else:
+      expected_out += '/fake_src/buildtools/linux64/gn gen _path_\n'
+    self.check(['lookup', '-m', 'chromium', '-b', 'linux-official'],
+               mbw=mbw,
+               ret=0,
+               out=expected_out)
+
   def test_quiet_lookup(self):
     self.check(['lookup', '-c', 'debug_goma', '--quiet'], ret=0,
                out=('is_debug = true\n'
diff --git a/tools/mb/rts_banned_suites.json b/tools/mb/rts_banned_suites.json
deleted file mode 100644
index 89e33f5..0000000
--- a/tools/mb/rts_banned_suites.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-
-  "*": [
-    "xr_browser_tests",
-    "metrics_python_tests",
-    "mojo_python_unittests",
-    "blink_python_tests",
-    "gl_unittests_ozone",
-    "grit_python_unittests",
-    "telemetry_perf_unittests",
-    "telemetry_perf_unittests_android_chrome",
-    "telemetry_perf_unittests_android_monochrome",
-    "telemetry_perf_unittests_android_monochrome_bundle",
-    "telemetry_perf_unittests_android_weblayer",
-    "telemetry_perf_unittests_android_webview",
-    "maps_tests",
-    "telemetry_gpu_unittests",
-    "telemetry_gpu_integration_test",
-    "telemetry_gpu_integration_test_android_chrome",
-    "telemetry_gpu_integration_test_android_monochrome",
-    "telemetry_gpu_integration_test_android_monochrome_bundle",
-    "telemetry_gpu_integration_test_android_weblayer",
-    "telemetry_gpu_integration_test_android_webview",
-    "monochrome_public_apk_checker"
-  ],
-  "fuchsia_x64_rts": [
-    "blink_web_tests"
-  ]
-}
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index ce4852b..bc9124e 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -10225,6 +10225,109 @@
   <description>Please enter the description of this user action.</description>
 </action>
 
+<action name="Glanceables_Classroom_AssignmentPressed">
+  <owner>mmourgos@chromium.org</owner>
+  <owner>tbarzic@chromium.org</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <description>
+    User clicked on an assignment in the classroom glanceable.
+  </description>
+</action>
+
+<action name="Glanceables_Classroom_AssignmentPressed_DefaultList">
+  <owner>mmourgos@chromium.org</owner>
+  <owner>tbarzic@chromium.org</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <description>
+    User clicked on an assignment in the classroom glanceable, while the default
+    assignment list is shown.
+  </description>
+</action>
+
+<action name="Glanceables_Classroom_HeaderIconPressed">
+  <owner>mmourgos@chromium.org</owner>
+  <owner>tbarzic@chromium.org</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <description>
+    User clicked on the header icon button in the classroom glanceable.
+  </description>
+</action>
+
+<action name="Glanceables_Classroom_SeeAllPressed">
+  <owner>mmourgos@chromium.org</owner>
+  <owner>tbarzic@chromium.org</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <description>
+    User clicked on the see all button in the footer of the classroom
+    glanceable.
+  </description>
+</action>
+
+<action name="Glanceables_Classroom_SelectedListChanged">
+  <owner>mmourgos@chromium.org</owner>
+  <owner>tbarzic@chromium.org</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <description>
+    User changed the selected assignment list in the classroom glanceable.
+  </description>
+</action>
+
+<action name="Glanceables_Tasks_ActiveTaskListChanged">
+  <owner>yulunwu@chromium.org</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <description>
+    User changes the active task list for the tasks glanceable.
+  </description>
+</action>
+
+<action name="Glanceables_Tasks_AddTaskButtonShown">
+  <owner>yulunwu@chromium.org</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <description>
+    The add task button is shown for an empty tasks list.
+  </description>
+</action>
+
+<action name="Glanceables_Tasks_LaunchTasksApp_AddNewTaskButton">
+  <owner>yulunwu@chromium.org</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <description>
+    User clicked on the add new task button on the tasks glanceable.
+  </description>
+</action>
+
+<action name="Glanceables_Tasks_LaunchTasksApp_FooterButton">
+  <owner>yulunwu@chromium.org</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <description>
+    User clicked on the see all button in the footer of the tasks glanceable.
+  </description>
+</action>
+
+<action name="Glanceables_Tasks_LaunchTasksApp_HeaderButton">
+  <owner>yulunwu@chromium.org</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <description>
+    User clicked on the tasks icon in the header of the tasks glanceable.
+  </description>
+</action>
+
+<action name="Glanceables_Tasks_TaskMarkedAsCompleted">
+  <owner>yulunwu@chromium.org</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <description>
+    User marks a task in the tasks glanceable as completed.
+  </description>
+</action>
+
+<action name="Glanceables_Tasks_TaskMarkedAsIncomplete">
+  <owner>yulunwu@chromium.org</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <description>
+    User marks a task in the tasks glanceable as incomplete.
+  </description>
+</action>
+
 <action name="Go">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <description>Please enter the description of this user action.</description>
@@ -18620,6 +18723,35 @@
   </description>
 </action>
 
+<action name="Mobile.PasswordsSettings.BulkSavePasswordsToAccountButtonClicked">
+  <owner>nicolasmacbeth@google.com</owner>
+  <owner>tmartino@chromium.org</owner>
+  <description>
+    Reported when the user clicks on the entrypoint button of the &quot;save
+    passwords in account&quot; section. iOS only.
+  </description>
+</action>
+
+<action
+    name="Mobile.PasswordsSettings.BulkSavePasswordsToAccountDialog.Accepted">
+  <owner>nicolasmacbeth@google.com</owner>
+  <owner>tmartino@chromium.org</owner>
+  <description>
+    Reported when the user accepts the confirmation dialog to move their local
+    passwords to their account. iOS only.
+  </description>
+</action>
+
+<action
+    name="Mobile.PasswordsSettings.BulkSavePasswordsToAccountDialog.Cancelled">
+  <owner>nicolasmacbeth@google.com</owner>
+  <owner>tmartino@chromium.org</owner>
+  <description>
+    Reported when the user denies the confirmation dialog to move their local
+    passwords to their account. iOS only.
+  </description>
+</action>
+
 <action name="Mobile.Signin.SnackbarUndoTapped">
   <owner>triploblastic@chromium.org</owner>
   <owner>chrome-signin-team@google.org</owner>
@@ -19947,6 +20079,14 @@
   </description>
 </action>
 
+<action name="MobileKeyboardAccessoryOpenPasswordManager">
+  <owner>noemies@google.com</owner>
+  <description>
+    Reported when user opens the Password Manager page from keyboard accessory.
+    iOS only.
+  </description>
+</action>
+
 <action name="MobileKeyCommandAddToBookmarks">
   <owner>lpromero@google.com</owner>
   <owner>alionadangla@google.com</owner>
@@ -20349,6 +20489,14 @@
   </description>
 </action>
 
+<action name="MobileMagicStackOpenPasswordCheckup">
+  <owner>noemies@google.com</owner>
+  <description>
+    Reported when user opens the Password Checkup page from the Magic Stack. iOS
+    only.
+  </description>
+</action>
+
 <action name="MobileMenuAddToBookmarks">
   <owner>aurimas@chromium.org</owner>
   <description>
@@ -21283,10 +21431,11 @@
   <description>Please enter the description of this user action.</description>
 </action>
 
-<action name="MobilePasswordCheckupOpen">
+<action name="MobilePasswordBreachOpenPasswordManager">
   <owner>noemies@google.com</owner>
   <description>
-    Reported when user opens the Password Checkup page. iOS only.
+    Reported when user opens the Password Manager page from the password breach
+    view. iOS only.
   </description>
 </action>
 
@@ -21313,10 +21462,18 @@
   </description>
 </action>
 
-<action name="MobilePasswordDetailsOpen">
+<action name="MobilePasswordDetailsSettingsBack">
   <owner>noemies@google.com</owner>
   <description>
-    Reported when user opens a password details page. iOS only.
+    Reported when user goes back from Password Details Settings UI to root
+    Settings screen. iOS only.
+  </description>
+</action>
+
+<action name="MobilePasswordDetailsSettingsClose">
+  <owner>noemies@google.com</owner>
+  <description>
+    Reported when Password Details Settings UI was dismissed. iOS only.
   </description>
 </action>
 
@@ -21328,6 +21485,58 @@
   </description>
 </action>
 
+<action name="MobilePasswordInfobarModalOpenPasswordManager">
+  <owner>noemies@google.com</owner>
+  <description>
+    Reported when user opens the Password Manager page from a password infobar
+    modal. iOS only.
+  </description>
+</action>
+
+<action name="MobilePasswordIssuesCompromisedOpen">
+  <owner>noemies@google.com</owner>
+  <description>
+    Reported when user opens the compromised password issues page. iOS only.
+  </description>
+</action>
+
+<action name="MobilePasswordIssuesOpenPasswordDetails">
+  <owner>noemies@google.com</owner>
+  <description>
+    Reported when user opens the password details page from the password issues
+    page. iOS only.
+  </description>
+</action>
+
+<action name="MobilePasswordIssuesReusedOpen">
+  <owner>noemies@google.com</owner>
+  <description>
+    Reported when user opens the reused password issues page. iOS only.
+  </description>
+</action>
+
+<action name="MobilePasswordIssuesSettingsBack">
+  <owner>noemies@google.com</owner>
+  <description>
+    Reported when user goes back from Password Issues Settings UI to root
+    Settings screen. iOS only.
+  </description>
+</action>
+
+<action name="MobilePasswordIssuesSettingsClose">
+  <owner>noemies@google.com</owner>
+  <description>
+    Reported when Password Issues Settings UI was dismissed. iOS only.
+  </description>
+</action>
+
+<action name="MobilePasswordIssuesWeakOpen">
+  <owner>noemies@google.com</owner>
+  <description>
+    Reported when user opens the weak password issues page. iOS only.
+  </description>
+</action>
+
 <action name="MobilePasswordManagerAddPassword">
   <owner>noemies@google.com</owner>
   <description>
@@ -21335,10 +21544,19 @@
   </description>
 </action>
 
-<action name="MobilePasswordManagerOpen">
+<action name="MobilePasswordManagerOpenPasswordCheckup">
   <owner>noemies@google.com</owner>
   <description>
-    Reported when user opens the Password Manager. iOS only.
+    Reported when user opens the Password Checkup page from the Password
+    Manager. iOS only.
+  </description>
+</action>
+
+<action name="MobilePasswordManagerOpenPasswordDetails">
+  <owner>noemies@google.com</owner>
+  <description>
+    Reported when user opens the password details page from the Password
+    Manager. iOS only.
   </description>
 </action>
 
@@ -21817,6 +22035,14 @@
   </description>
 </action>
 
+<action name="MobileSearchPasswordsWidgetOpenPasswordManager">
+  <owner>noemies@google.com</owner>
+  <description>
+    Reported when user opens the Password Manager page from the Search Passwords
+    widget. iOS only.
+  </description>
+</action>
+
 <action name="MobileSettingsClose">
   <owner>edchin@chromium.org</owner>
   <owner>gambard@chromium.org</owner>
@@ -23309,6 +23535,14 @@
   </description>
 </action>
 
+<action name="MobileWebsiteOpenPasswordManager">
+  <owner>noemies@google.com</owner>
+  <description>
+    Reported when user opens the Password Manager page when navigating to a
+    website. iOS only.
+  </description>
+</action>
+
 <action name="MobileWebsiteSettingsOpenedFromMenu">
   <owner>tedchoc@chromium.org</owner>
   <description>Page Info opened via the menu.</description>
@@ -32331,6 +32565,57 @@
   </description>
 </action>
 
+<action name="Signin_BulkUpload_Close">
+  <owner>arthurmilchior@chromium.org</owner>
+  <owner>chrome-signin-team@google.com</owner>
+  <description>
+    Recorded when the Bulk Upload Settings is dismissed. iOS only.
+  </description>
+</action>
+
+<action name="Signin_BulkUpload_FaceID_CannotBeStarted">
+  <owner>arthurmilchior@chromium.org</owner>
+  <owner>chrome-signin-team@google.com</owner>
+  <description>
+    Recorded when the face id auth cannot be started in the Bulk Upload
+    Settings. iOS only.
+  </description>
+</action>
+
+<action name="Signin_BulkUpload_FaceID_Failed">
+  <owner>arthurmilchior@chromium.org</owner>
+  <owner>chrome-signin-team@google.com</owner>
+  <description>
+    Recorded when the face id auth fails in the Bulk Upload Settings. iOS only.
+  </description>
+</action>
+
+<action name="Signin_BulkUpload_FaceID_Success">
+  <owner>arthurmilchior@chromium.org</owner>
+  <owner>chrome-signin-team@google.com</owner>
+  <description>
+    Recorded when the face id auth is successful in the Bulk Upload Settings.
+    iOS only.
+  </description>
+</action>
+
+<action name="Signin_BulkUpload_Open">
+  <owner>arthurmilchior@chromium.org</owner>
+  <owner>chrome-signin-team@google.com</owner>
+  <description>
+    Recorded when the Bulk Upload Settings is opened. iOS only.
+  </description>
+</action>
+
+<action name="Signin_BulkUpload_Save">
+  <owner>arthurmilchior@chromium.org</owner>
+  <owner>chrome-signin-team@google.com</owner>
+  <description>
+    Recorded when the user presses the save button in the Bulk Upload Settings.
+    iOS only.
+  </description>
+</action>
+
 <action name="Signin_EnterpriseAccountPrompt_Cancel">
   <owner>gogerald@chromium.org</owner>
   <description>
@@ -37758,6 +38043,74 @@
   <description>Please enter the description of this user action.</description>
 </action>
 
+<action name="UserEducation.MessageAction.Abort.IPH">
+  <owner>mickeyburks@chromium.org</owner>
+  <description>
+    The In-Product Help Bubble was aborted due to leaving the flow of the
+    feature promotion. This is specific to the IPH implementation and could mean
+    navigation or hiding a surface.
+  </description>
+</action>
+
+<action name="UserEducation.MessageAction.Action.IPH">
+  <owner>mickeyburks@chromium.org</owner>
+  <description>
+    The In-Product Help Bubble was closed after the user selected the action in
+    the IPH. For a Custom Action IPH, this means the custom action was
+    activated. For a Tutorial IPH, this means the tutorial was started.
+  </description>
+</action>
+
+<action name="UserEducation.MessageAction.Cancel.IPH">
+  <owner>mickeyburks@chromium.org</owner>
+  <description>
+    The In-Product Help Bubble was closed after the user pressed Escape or
+    clicked &quot;X&quot; in the IPH.
+  </description>
+</action>
+
+<action name="UserEducation.MessageAction.Dismiss.IPH">
+  <owner>mickeyburks@chromium.org</owner>
+  <description>The user dismissed the In-Product Help Bubble.</description>
+</action>
+
+<action name="UserEducation.MessageAction.FeatureEngaged.IPH">
+  <owner>mickeyburks@chromium.org</owner>
+  <description>
+    The user engaged with the promoted feature outside the In-Product Help
+    Bubble in a way that obviated the need for this IPH.
+  </description>
+</action>
+
+<action name="UserEducation.MessageAction.OverrideForPrecedence.IPH"
+    not_user_triggered="true">
+  <owner>mickeyburks@chromium.org</owner>
+  <description>
+    The In-Product Help Bubble was closed to allow showing a message with higher
+    priority.
+  </description>
+</action>
+
+<action name="UserEducation.MessageAction.OverrideForUIRegionConflict.IPH">
+  <owner>mickeyburks@chromium.org</owner>
+  <description>
+    The In-Product Help Bubble was closed to avoid overlap with an important UI
+    element.
+  </description>
+</action>
+
+<action name="UserEducation.MessageAction.Snooze.IPH">
+  <owner>mickeyburks@chromium.org</owner>
+  <description>The user snoozed the In-Product Help Bubble.</description>
+</action>
+
+<action name="UserEducation.MessageAction.Timeout.IPH">
+  <owner>mickeyburks@chromium.org</owner>
+  <description>
+    The In-Product Help Bubble spontaneously timed out after some time interval.
+  </description>
+</action>
+
 <action name="UserManager_Cleared_Legacy_User_Prefs">
   <owner>mahmadi@chromium.org</owner>
   <description>
@@ -38911,6 +39264,8 @@
 </action-suffix>
 
 <action-suffix separator="_" ordering="suffix">
+  <suffix name="3pcdUserBypass"
+      label="For third party cookie deprecation user bypass feature."/>
   <suffix name="AdaptiveButtonInTopToolbarCustomization_AddToBookmarks"
       label="For AdaptiveButtonInTopToolbarCustomization add to bookmarks
              feature."/>
@@ -38934,8 +39289,6 @@
       label="For AutoDarkUserEducationMessageOptIn feature."/>
   <suffix name="AutofillExternalAccountProfileSuggestion"
       label="For AutofillExternalAccountProfileSuggestion feature."/>
-  <suffix name="AutofillFeedbackNewBadge"
-      label="For AutofillFeedbackNewBadge feature."/>
   <suffix name="AutofillVirtualCardSuggestion"
       label="For AutofillVirtualCardSuggestion feature."/>
   <suffix name="BackNavigationMenu" label="For BackNavigationMenu feature."/>
@@ -39077,6 +39430,7 @@
   <suffix name="IntentChip"
       label="In product help for opening a webpage in an app using the intent
              chip."/>
+  <suffix name="iOSChoiceScreen" label="For iOSChoiceScreen feature"/>
   <suffix name="iOSDefaultBrowserBadgeEligibility"
       label="For iOSDefaultBrowserBadgeEligibility feature"/>
   <suffix name="iOSDefaultBrowserOverflowMenuBadge"
@@ -39264,6 +39618,8 @@
       label="For Sharing Hub link toggle feature."/>
   <suffix name="SharingHubWebnotesStylize"
       label="For SharingHubWebnotesStylize feature."/>
+  <suffix name="ShoppingCollectionFeature"
+      label="For the explanation of what the shopping collection is."/>
   <suffix name="ShoppingListMenuItem"
       label="For ShoppingListMenuItem feature."/>
   <suffix name="ShoppingListSaveFlow"
@@ -39312,6 +39668,17 @@
       name="InProductHelp.ShouldTriggerHelpUIResult.Triggered.IPH"/>
   <affected-action
       name="InProductHelp.ShouldTriggerHelpUIResult.WouldHaveTriggered.IPH"/>
+  <affected-action name="UserEducation.MessageAction.Abort.IPH"/>
+  <affected-action name="UserEducation.MessageAction.Action.IPH"/>
+  <affected-action name="UserEducation.MessageAction.Cancel.IPH"/>
+  <affected-action name="UserEducation.MessageAction.Dismiss.IPH"/>
+  <affected-action name="UserEducation.MessageAction.FeatureEngaged.IPH"/>
+  <affected-action
+      name="UserEducation.MessageAction.OverrideForPrecedence.IPH"/>
+  <affected-action
+      name="UserEducation.MessageAction.OverrideForUIRegionConflict.IPH"/>
+  <affected-action name="UserEducation.MessageAction.Snooze.IPH"/>
+  <affected-action name="UserEducation.MessageAction.Timeout.IPH"/>
 </action-suffix>
 
 <action-suffix separator="." ordering="suffix">
diff --git a/tools/metrics/histograms/README.md b/tools/metrics/histograms/README.md
index 92136dbad..a0df808b 100644
--- a/tools/metrics/histograms/README.md
+++ b/tools/metrics/histograms/README.md
@@ -690,8 +690,11 @@
 ### Cleaning Up Histogram Entries {#obsolete}
 
 If a histogram is no longer being emitted to, you should clean it up by removing
-the corresponding histograms.xml entry. You can also add an obsoletion message
-in the same changelist. This also applies to variants of a
+the corresponding histograms.xml entry. The histogram data will still be
+available for viewing on Google's internal UMA dashboard.
+
+When removing a histograms.xml entry you can also add an obsoletion message in
+the same changelist. This also applies to variants of a
 [patterned histogram](#Patterned-Histograms) and to suffix entries for a
 suffixed histogram.
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 7a5c43e6c..0df239d 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -365,6 +365,16 @@
   <int value="4" label="Cancel"/>
 </enum>
 
+<enum name="AccessibilityModeBundleEnum">
+  <summary>Tracks usage of named sets of mode flags.</summary>
+  <int value="0" label="Unnamed"/>
+  <int value="1" label="Basic"/>
+  <int value="2" label="WebContentsOnly"/>
+  <int value="3" label="Complete"/>
+  <int value="4" label="CompleteNoHTML"/>
+  <int value="5" label="FormControls"/>
+</enum>
+
 <enum name="AccessibilityModeFlagEnum">
   <summary>Track individual accessibility mode flags that are enabled.</summary>
   <int value="0" label="Native APIs"/>
@@ -1167,12 +1177,6 @@
   <int value="21" label="Error (Unexpected Value)"/>
 </enum>
 
-<enum name="AccountChooserDismissalReason">
-  <int value="0" label="Canceled"/>
-  <int value="1" label="Credential chosen"/>
-  <int value="2" label="Sign in clicked"/>
-</enum>
-
 <enum name="AccountChooserUsabilityState">
   <int value="0" label="Looks OK"/>
   <int value="1" label="Empty username"/>
@@ -2957,6 +2961,15 @@
   <int value="5" label="SSL_INVALID">A generic error occurred.</int>
 </enum>
 
+<enum name="AndroidWebViewSupervisedUserUrlCheckResult">
+  <int value="0" label="ALLOWED_SITE_LOADED"/>
+  <int value="1" label="ALLOWED_SITE_DETECTED"/>
+  <int value="2" label="DISALLOWED_SITE_BLOCKED"/>
+  <int value="3" label="DISALLOWED_SITE_DETECTED"/>
+  <int value="4" label="TIMEOUT"/>
+  <int value="5" label="UNKNOWN_ERROR"/>
+</enum>
+
 <enum name="AndroidWebViewVariationsEnableState">
   <obsolete>
     Removed from code July 2018. Variations in WebView has launched.
@@ -3221,6 +3234,7 @@
   </int>
   <int value="81" label="CREATE_WEBVIEW">WebViewCompat#createWebView()</int>
   <int value="82" label="GET_STATICS">WebViewCompat#getStatics()</int>
+  <int value="83" label="GET_PROFILE_STORE">ProfileStore#getInstance()</int>
 </enum>
 
 <enum name="AnnouncementNotificationEvent">
@@ -6849,14 +6863,6 @@
   <int value="1745" label="NAME_LAST_SECOND: accepted"/>
   <int value="1760" label="NAME_HONORIFIC_PREFIX: edited"/>
   <int value="1761" label="NAME_HONORIFIC_PREFIX: accepted"/>
-  <int value="1776" label="ADDRESS_HOME_PREMISE_NAME: edited"/>
-  <int value="1777" label="ADDRESS_HOME_PREMISE_NAME: accepted"/>
-  <int value="1792" label="ADDRESS_HOME_DEPENDENT_STREET_NAME: edited"/>
-  <int value="1793" label="ADDRESS_HOME_DEPENDENT_STREET_NAME: accepted"/>
-  <int value="1808"
-      label="ADDRESS_HOME_STREET_AND_DEPENDENT_STREET_NAME: edited"/>
-  <int value="1809"
-      label="ADDRESS_HOME_STREET_AND_DEPENDENT_STREET_NAME: accepted"/>
   <int value="1824" label="ADDRESS_HOME_ADDRESS: edited"/>
   <int value="1825" label="ADDRESS_HOME_ADDRESS: accepted"/>
   <int value="1840" label="ADDRESS_HOME_ADDRESS_WITH_NAME: edited"/>
@@ -8766,58 +8772,6 @@
   <int value="666"
       label="NAME_HONORIFIC_PREFIX - Predictions different - Value agrees
              with both predictions"/>
-  <int value="667"
-      label="ADDRESS_HOME_PREMISE_NAME - Predictions equal - Value agrees"/>
-  <int value="668"
-      label="ADDRESS_HOME_PREMISE_NAME - Predictions equal - Value disagrees"/>
-  <int value="669"
-      label="ADDRESS_HOME_PREMISE_NAME - Predictions different - Value agrees
-             with old prediction"/>
-  <int value="670"
-      label="ADDRESS_HOME_PREMISE_NAME - Predictions different - Value agrees
-             with new prediction"/>
-  <int value="671"
-      label="ADDRESS_HOME_PREMISE_NAME - Predictions different - Value agrees
-             with neither prediction"/>
-  <int value="672"
-      label="ADDRESS_HOME_PREMISE_NAME - Predictions different - Value agrees
-             with both predictions"/>
-  <int value="673"
-      label="ADDRESS_HOME_DEPENDENT_STREET_NAME - Predictions equal - Value
-             agrees"/>
-  <int value="674"
-      label="ADDRESS_HOME_DEPENDENT_STREET_NAME - Predictions equal - Value
-             disagrees"/>
-  <int value="675"
-      label="ADDRESS_HOME_DEPENDENT_STREET_NAME - Predictions different -
-             Value agrees with old prediction"/>
-  <int value="676"
-      label="ADDRESS_HOME_DEPENDENT_STREET_NAME - Predictions different -
-             Value agrees with new prediction"/>
-  <int value="677"
-      label="ADDRESS_HOME_DEPENDENT_STREET_NAME - Predictions different -
-             Value agrees with neither prediction"/>
-  <int value="678"
-      label="ADDRESS_HOME_DEPENDENT_STREET_NAME - Predictions different -
-             Value agrees with both predictions"/>
-  <int value="679"
-      label="ADDRESS_HOME_STREET_AND_DEPENDENT_STREET_NAME - Predictions
-             equal - Value agrees"/>
-  <int value="680"
-      label="ADDRESS_HOME_STREET_AND_DEPENDENT_STREET_NAME - Predictions
-             equal - Value disagrees"/>
-  <int value="681"
-      label="ADDRESS_HOME_STREET_AND_DEPENDENT_STREET_NAME - Predictions
-             different - Value agrees with old prediction"/>
-  <int value="682"
-      label="ADDRESS_HOME_STREET_AND_DEPENDENT_STREET_NAME - Predictions
-             different - Value agrees with new prediction"/>
-  <int value="683"
-      label="ADDRESS_HOME_STREET_AND_DEPENDENT_STREET_NAME - Predictions
-             different - Value agrees with neither prediction"/>
-  <int value="684"
-      label="ADDRESS_HOME_STREET_AND_DEPENDENT_STREET_NAME - Predictions
-             different - Value agrees with both predictions"/>
   <int value="685"
       label="ADDRESS_HOME_ADDRESS - Predictions equal - Value agrees"/>
   <int value="686"
@@ -9501,9 +9455,6 @@
   <int value="108" label="NAME_LAST_CONJUNCTION"/>
   <int value="109" label="NAME_LAST_SECOND"/>
   <int value="110" label="NAME_HONORIFIC_PREFIX"/>
-  <int value="111" label="ADDRESS_HOME_PREMISE_NAME"/>
-  <int value="112" label="ADDRESS_HOME_DEPENDENT_STREET_NAME"/>
-  <int value="113" label="ADDRESS_HOME_STREET_AND_DEPENDENT_STREET_NAME"/>
   <int value="114" label="ADDRESS_HOME_ADDRESS"/>
   <int value="115" label="ADDRESS_HOME_ADDRESS_WITH_NAME"/>
   <int value="116" label="ADDRESS_HOME_FLOOR"/>
@@ -9882,6 +9833,8 @@
   <int value="251" label="RemoveServerCvc: Failure"/>
   <int value="260" label="ClearServerCvcs: Success"/>
   <int value="261" label="ClearServerCvcs: Failure"/>
+  <int value="270" label="UpdateCreditCardCvc: Success"/>
+  <int value="271" label="UpdateCreditCardCvc: Failure"/>
 </enum>
 
 <enum name="AutoFramingError">
@@ -10532,6 +10485,8 @@
       label="Trace finalization started with a local output location"/>
   <int value="17" label="Failed to initialize the trace report database"/>
   <int value="18" label="Failed to clean the trace report database"/>
+  <int value="19" label="Saving trace failed"/>
+  <int value="20" label="Saving trace succeeded"/>
 </enum>
 
 <enum name="BackingStoreResults">
@@ -10923,6 +10878,10 @@
   <int value="304"
       label="PERMISSION_SERVICE_REQUEST_EMBEDDED_PERMISSION_WITHOUT_FEATURE"/>
   <int value="305" label="RFH_FOCUS_ACROSS_FENCED_BOUNDARY"/>
+  <int value="306"
+      label="RFH_RECEIVED_INVALID_SHARED_STORAGE_WRITABLE_ATTRIBUTE"/>
+  <int value="307"
+      label="MSDH_EXCLUDE_MONITORS_BUT_PREFERRED_MONITOR_REQUESTED"/>
 </enum>
 
 <enum name="BadMessageReasonExtensions">
@@ -13749,6 +13708,15 @@
   <int value="7" label="Sign challenge failed"/>
 </enum>
 
+<enum name="BoundSessionCredentialsSessionRegistrationResult">
+  <int value="0" label="Success"/>
+  <int value="1" label="Failed to generate a registration token"/>
+  <int value="2" label="Network error"/>
+  <int value="3" label="Server response contained an error"/>
+  <int value="4" label="Failed to parse the server response"/>
+  <int value="5" label="Invalid session parameters"/>
+</enum>
+
 <enum name="BreakageIndicatorType">
   <int value="0" label="User Reload"/>
 </enum>
@@ -14112,6 +14080,8 @@
   <int value="5" label="Cache Name Not Found Error"/>
   <int value="6" label="Query Too Large Error"/>
   <int value="7" label="Not Implemented Error"/>
+  <int value="8" label="Duplicate Operation Error"/>
+  <int value="9" label="Cross Origin Resource Policy Error"/>
 </enum>
 
 <enum name="CacheStorageIndexResult">
@@ -18263,6 +18233,9 @@
   <int value="7" label="Exps.Shown"/>
   <int value="8" label="Exps.Accepted"/>
   <int value="9" label="Exps.Rejected"/>
+  <int value="10" label="Pco.Shown"/>
+  <int value="11" label="Pco.Accepted"/>
+  <int value="12" label="Pco.Rejected"/>
 </enum>
 
 <enum name="Companion.UiEvent">
@@ -18754,22 +18727,20 @@
 </enum>
 
 <enum name="ContactsPickerProperties">
-  <int value="0" label="No properties requested"/>
-  <int value="1" label="Telephone numbers requested"/>
-  <int value="2" label="Emails requested"/>
-  <int value="3" label="Emails and Telephone numbers requested"/>
-  <int value="4" label="Names requested"/>
-  <int value="5" label="Names and Telephone numbers requested"/>
-  <int value="6" label="Names and Emails requested"/>
-  <int value="7" label="Names, Emails, and Telephone numbers requested"/>
-  <int value="13" label="Addresses, Names, and Telephone numbers requested"/>
-  <int value="15"
-      label="Addresses, Names, Emails, and Telephone numbers requested"/>
-  <int value="21" label="Icons, Names, and Telephone numbers requested"/>
-  <int value="23"
-      label="Icons, Names, Emails, and Telephone numbers requested"/>
+  <int value="0" label="No properties"/>
+  <int value="1" label="Telephone numbers"/>
+  <int value="2" label="Emails"/>
+  <int value="3" label="Emails and Telephone numbers"/>
+  <int value="4" label="Names"/>
+  <int value="5" label="Names and Telephone numbers"/>
+  <int value="6" label="Names and Emails"/>
+  <int value="7" label="Names, Emails, and Telephone numbers"/>
+  <int value="13" label="Addresses, Names, and Telephone numbers"/>
+  <int value="15" label="Addresses, Names, Emails, and Telephone numbers"/>
+  <int value="21" label="Icons, Names, and Telephone numbers"/>
+  <int value="23" label="Icons, Names, Emails, and Telephone numbers"/>
   <int value="31"
-      label="Icons, Addresses, Names, Emails, and Telephone numbers requested"/>
+      label="Icons, Addresses, Names, Emails, and Telephone numbers"/>
 </enum>
 
 <enum name="ContentClassification">
@@ -19930,6 +19901,13 @@
   <int value="3" label="Failed to assemble"/>
 </enum>
 
+<enum name="ConversionReportSendRetryCount">
+  <int value="0" label="None"/>
+  <int value="1" label="One retry"/>
+  <int value="2" label="Two retries"/>
+  <int value="3" label="Failed"/>
+</enum>
+
 <enum name="ConversionReportStatus">
   <int value="0" label="OK"/>
   <int value="1" label="Internal network error"/>
@@ -20868,6 +20846,12 @@
   </int>
 </enum>
 
+<enum name="CrasApNcStartStatus">
+  <summary/>
+  <int value="0" label="CRAS_AP_NC_REQUESTED_FAILED"/>
+  <int value="1" label="CRAS_AP_NC_REQUESTED_SUCCEEDED"/>
+</enum>
+
 <enum name="CrasClientType">
   <summary>
     List of the client type of CRAS. The list can be found in
@@ -22502,6 +22486,13 @@
   <int value="6" label="UPDATE_IN_PROGRESS"/>
 </enum>
 
+<enum name="CrosCrashCollectorAddWeightResult">
+  <int value="0" label="Good value"/>
+  <int value="1" label="Bad value"/>
+  <int value="2" label="Added weight twice"/>
+  <int value="3" label="Added in wrong method"/>
+</enum>
+
 <enum name="CrosCrashSenderRemoveReason">
 <!-- TotalRemoval should be the total of other values -->
 
@@ -26954,6 +26945,7 @@
   <int value="1" label="Mobile section shown"/>
   <int value="2" label="Ethernet section shown"/>
   <int value="3" label="Detailed view shown"/>
+  <int value="4" label="Tether Hosts section shown"/>
 </enum>
 
 <enum name="DeviceActiveCheckMembershipResponseCases">
@@ -29348,18 +29340,11 @@
   <int value="2" label="Same Site Different Scheme Script"/>
 </enum>
 
-<enum name="DohProviderId">
-  <int value="0" label="CUSTOM"/>
-  <int value="1" label="CLEANBROWSING_FAMILY"/>
-  <int value="2" label="CLOUDFLARE"/>
-  <int value="3" label="GOOGLE"/>
-  <int value="4" label="IIJ"/>
-  <int value="5" label="QUAD9_SECURE"/>
-  <int value="6" label="DNS_SB"/>
-  <int value="7" label="CZ_NIC"/>
-  <int value="8" label="NEXT_DNS"/>
-  <int value="9" label="OPEN_DNS"/>
-  <int value="10" label="ALEK_BERG_NL"/>
+<enum name="DohServerAutoupgradeStatus">
+  <int value="0" label="SuccessWithNoPriorFailures"/>
+  <int value="1" label="SuccessWithSomePriorFailures"/>
+  <int value="2" label="FailureWithSomePriorSuccesses"/>
+  <int value="3" label="FailureWithNoPriorSuccesses"/>
 </enum>
 
 <enum name="DomainBoundCerts.DBLoadStatus">
@@ -31253,6 +31238,7 @@
   <int value="0" label="No early swap"/>
   <int value="1" label="Early swap for the initial non-live RenderFrameHost"/>
   <int value="2" label="Early swap for a crashed RenderFrameHost"/>
+  <int value="3" label="Early swap for a navigation transition"/>
 </enum>
 
 <enum name="EasyUnlockAuthEvent">
@@ -32649,6 +32635,15 @@
   <int value="62" label="Too many requests">
     Too many requests are uploaded within a short time.
   </int>
+  <int value="63" label="Illegal account for packaged EDU license">
+    Illegal account for packaged EDU license.
+  </int>
+  <int value="64" label="May not block dev mode">
+    Dev mode would be blocked but this is prevented by a command-line switch.
+  </int>
+  <int value="65" label="Invalid packaged device for kiosk">
+    Packaged license device invalid for kiosk.
+  </int>
 </enum>
 
 <enum name="EnterpriseExistingInstallAttributesLockType">
@@ -33888,6 +33883,14 @@
   <int value="1149" label="ExtensionOAuthRedirectUrls"/>
   <int value="1150" label="CreatePasskeysInICloudKeychain"/>
   <int value="1151" label="QuickOfficeForceFileDownloadEnabled"/>
+  <int value="1152" label="ProfileSeparationSettings"/>
+  <int value="1153" label="ProfileSeparationDataMigrationSettings"/>
+  <int value="1154" label="ProfileSeparationDomainExceptionList"/>
+  <int value="1155" label="FullRestoreMode"/>
+  <int value="1156" label="MicrosoftOneDriveAccountRestriction"/>
+  <int value="1157" label="SafeBrowsingDeepScanningEnabled"/>
+  <int value="1158" label="DriveFileSyncAvailable"/>
+  <int value="1159" label="DeviceSwitchFunctionKeysBehaviorEnabled"/>
 </enum>
 
 <enum name="EnterprisePoliciesSources">
@@ -34744,6 +34747,12 @@
   <int value="0" label="errSecSuccess"/>
 </enum>
 
+<enum name="ESimInstallResult">
+  <int value="0" label="Success"/>
+  <int value="1" label="Inhibit failed"/>
+  <int value="2" label="Hermes failed"/>
+</enum>
+
 <enum name="ESimPolicyInstallMethod">
   <int value="0" label="ViaSmdp"/>
   <int value="1" label="ViaSmds"/>
@@ -34797,6 +34806,9 @@
   <int value="25" label="smsc95xx"/>
   <int value="26" label="tg3"/>
   <int value="27" label="error"/>
+  <int value="28" label="rndis_host"/>
+  <int value="29" label="atl1c"/>
+  <int value="30" label="sky2"/>
 </enum>
 
 <enum name="EulaScreenUserAction">
@@ -36587,8 +36599,8 @@
   <int value="792" label="VIRTUALKEYBOARDPRIVATE_OPENSETTINGS"/>
   <int value="793" label="BLUETOOTHLOWENERGY_CONNECT"/>
   <int value="794" label="BLUETOOTHLOWENERGY_DISCONNECT"/>
-  <int value="795" label="WEBSTOREPRIVATE_GETEPHEMERALAPPSENABLED"/>
-  <int value="796" label="WEBSTOREPRIVATE_LAUNCHEPHEMERALAPP"/>
+  <int value="795" label="DELETED_WEBSTOREPRIVATE_GETEPHEMERALAPPSENABLED"/>
+  <int value="796" label="DELETED_WEBSTOREPRIVATE_LAUNCHEPHEMERALAPP"/>
   <int value="797" label="FILESYSTEMPROVIDERINTERNAL_OPERATIONREQUESTEDERROR"/>
   <int value="798"
       label="FILESYSTEMPROVIDERINTERNAL_OPERATIONREQUESTEDSUCCESS"/>
@@ -37672,6 +37684,10 @@
   <int value="1823" label="FILEMANAGERPRIVATE_GETDEVICECONNECTIONSTATE"/>
   <int value="1824" label="USERSCRIPTS_UNREGISTER"/>
   <int value="1825" label="AUTOTESTPRIVATE_SETARCINTERACTIVESTATE"/>
+  <int value="1826" label="OS_DIAGNOSTICS_CREATEMEMORYROUTINE"/>
+  <int value="1827" label="OS_DIAGNOSTICS_STARTROUTINE"/>
+  <int value="1828" label="OS_DIAGNOSTICS_CANCELROUTINE"/>
+  <int value="1829" label="OS_DIAGNOSTICS_ISMEMORYROUTINEARGUMENTSUPPORTED"/>
 </enum>
 
 <enum name="ExtensionIconState">
@@ -44041,6 +44057,19 @@
   <int value="4643" label="ScrollSnapNestedSnapAreas"/>
   <int value="4644" label="ScrollSnapCoveringSnapArea"/>
   <int value="4645" label="V8RTCEncodedAudioFrame_SetMetadata_Method"/>
+  <int value="4646" label="V8FetchLaterResult_Activated_AttributeGetter"/>
+  <int value="4647" label="V8Window_FetchLater_Method"/>
+  <int value="4648" label="FetchLaterInvokeStateDeferred"/>
+  <int value="4649" label="FetchLaterInvokeStateScheduled"/>
+  <int value="4650" label="FetchLaterInvokeStateTerminated"/>
+  <int value="4651" label="FetchLaterInvokeStateAborted"/>
+  <int value="4652" label="FetchLaterInvokeStateActivated"/>
+  <int value="4653" label="FetchLaterErrorUnknownBodyLength"/>
+  <int value="4654" label="FetchLaterErrorQuotaExceeded"/>
+  <int value="4655" label="V8FileSystemHandle_GetCloudIdentifiers_Method"/>
+  <int value="4656" label="PrivateAggregationApiEnableDebugMode"/>
+  <int value="4657" label="LineBreakPhrase"/>
+  <int value="4658" label="AttributionReportingUnderscorePrefixedFilterKey"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
@@ -49632,6 +49661,13 @@
   <int value="6" label="UNSET"/>
 </enum>
 
+<enum name="GlanceableStudentAssignmentList">
+  <int value="0" label="Assigned"/>
+  <int value="1" label="NoDueDate"/>
+  <int value="2" label="Missing"/>
+  <int value="3" label="Done"/>
+</enum>
+
 <enum name="GLError">
   <int value="0" label="0x0000 - GL_NO_ERROR"/>
   <int value="1280" label="0x0500 - GL_INVALID_ENUM"/>
@@ -49654,15 +49690,6 @@
   <int value="9" label="kGLImplementationEGLANGLE"/>
 </enum>
 
-<enum name="GlobalMediaControlsCastActionAndEntryPoint">
-  <int value="0" label="Casting started via toolbar icon"/>
-  <int value="1" label="Casting stopped via toolbar icon"/>
-  <int value="2" label="Casting started via Presentation API"/>
-  <int value="3" label="Casting stopped via Presentation API"/>
-  <int value="4" label="Casting started via system tray"/>
-  <int value="5" label="Casting stopped via system tray"/>
-</enum>
-
 <enum name="GlobalMediaControlsCastMode">
   <int value="0" label="Presentation"/>
   <int value="1" label="Remote Playback"/>
@@ -49890,6 +49917,22 @@
   <int value="9" label="GOOGLE_UPDATE_DISABLED_BY_POLICY_AUTO_ONLY"/>
 </enum>
 
+<enum name="GoogleUpdateHashedCohortId">
+  <summary>
+    A hash of the update cohort id; a value of zero/none likely indicates no
+    cohort id, which suggests that the updater is broken or not present.
+  </summary>
+  <int value="0" label="None"/>
+</enum>
+
+<enum name="GoogleUpdateHashedCohortName">
+  <summary>
+    A hash of the update cohort name; a value of zero/none likely indicates no
+    cohort name, which suggests that the updater is broken or not present.
+  </summary>
+  <int value="0" label="None"/>
+</enum>
+
 <enum name="GoogleUpdateInfoBarActions">
   <int value="0" label="Clicked close"/>
   <int value="1" label="Clicked to update appears successful"/>
@@ -52643,6 +52686,19 @@
   <int value="13" label="HTTP_1_1_REQUIRED"/>
 </enum>
 
+<enum name="HttpAuthCount">
+  <int value="0" label="Basic Start"/>
+  <int value="1" label="Basic Reject"/>
+  <int value="2" label="Digest Start"/>
+  <int value="3" label="Digest Reject"/>
+  <int value="4" label="NTLM Start"/>
+  <int value="5" label="NTLM Reject"/>
+  <int value="6" label="Negotiate Start"/>
+  <int value="7" label="Negotiate Reject"/>
+  <int value="8" label="SpdyProxy Start (Deprecated)"/>
+  <int value="9" label="SpdyProxy Reject (Deprecated)"/>
+</enum>
+
 <enum name="HttpAuthNtlmV2Usage">
   <int value="0" label="Disabled over unsecured connection"/>
   <int value="1" label="Disabled over secure connection"/>
@@ -52672,6 +52728,29 @@
   <int value="3" label="Cross-domain Sub-resource Allowed"/>
 </enum>
 
+<enum name="HttpAuthTarget">
+  <int value="0" label="Basic Proxy"/>
+  <int value="1" label="Basic Secure Proxy"/>
+  <int value="2" label="Basic Server"/>
+  <int value="3" label="Basic Secure Server"/>
+  <int value="4" label="Digest Proxy"/>
+  <int value="5" label="Digest Secure Proxy"/>
+  <int value="6" label="Digest Server"/>
+  <int value="7" label="Digest Secure Server"/>
+  <int value="8" label="NTLM Proxy"/>
+  <int value="9" label="NTLM Secure Proxy"/>
+  <int value="10" label="NTLM Server"/>
+  <int value="11" label="NTLM Secure Server"/>
+  <int value="12" label="Negotiate Proxy"/>
+  <int value="13" label="Negotiate Secure Proxy"/>
+  <int value="14" label="Negotiate Server"/>
+  <int value="15" label="Negotiate Secure Server"/>
+  <int value="16" label="SpdyProxy (Deprecated)"/>
+  <int value="17" label="SpdyProxy Secure (Deprecated)"/>
+  <int value="18" label="SpdyProxy Server (Invalid)"/>
+  <int value="19" label="SpdyProxy Secure Server (Invalid)"/>
+</enum>
+
 <enum name="HttpCacheParallelWritingPattern">
   <int value="0" label="Initial value, headers phase"/>
   <int value="1" label="Created Writers"/>
@@ -53830,6 +53909,8 @@
   <int value="5" label="Handwriting"/>
   <int value="6" label="Emoji"/>
   <int value="7" label="StylusHandwriting"/>
+  <int value="8" label="Multipaste"/>
+  <int value="9" label="unknown"/>
 </enum>
 
 <enum name="IMEVKMode">
@@ -54165,6 +54246,7 @@
   <int value="115" label="LOCAL_TEST_POLICIES_APPLIED_INFOBAR"/>
   <int value="116"
       label="BIDDING_AND_AUCTION_USER_CONSENTED_DEBUGGING_DELEGATE"/>
+  <int value="117" label="PARCEL_TRACKING_INFOBAR_DELEGATE"/>
 </enum>
 
 <enum name="InfoBarResponse">
@@ -54332,9 +54414,11 @@
   <int value="1" label="Timed Out"/>
   <int value="2" label="On Keyboard Hide"/>
   <int value="3" label="Tapped IPH"/>
-  <int value="4" label="Tapped Outside"/>
+  <int value="4" label="Tapped Outside (deprecated)"/>
   <int value="5" label="Tapped Close"/>
   <int value="6" label="Tapped Snooze"/>
+  <int value="7" label="Tapped Outside IPH And Anchor View"/>
+  <int value="8" label="Tapped Anchor View"/>
 </enum>
 
 <enum name="InProductHelpSnoozeAction">
@@ -55330,6 +55414,13 @@
   <int value="50" label="CRASH"/>
 </enum>
 
+<enum name="IntersectionObservationStateOnScroll">
+  <int value="0" label="Viewport only"/>
+  <int value="1" label="Newly desired"/>
+  <int value="2" label="Already desired"/>
+  <int value="3" label="Already required"/>
+</enum>
+
 <enum name="InterstitialCloseReason">
   <int value="0" label="Interstitial is shown"/>
   <int value="1" label="User leaves the interstitial by navigating away"/>
@@ -55723,6 +55814,7 @@
   </int>
   <int value="9" label="Web Search Bar"/>
   <int value="10" label="Translate Onebox"/>
+  <int value="11" label="Intents"/>
 </enum>
 
 <enum name="IOSLensSupportStatus">
@@ -55914,6 +56006,25 @@
   <int value="2" label="Go forward"/>
 </enum>
 
+<enum name="IOSOverflowMenuAction">
+  <int value="0" label="Reload"/>
+  <int value="1" label="NewTab"/>
+  <int value="2" label="NewIncognitoTab"/>
+  <int value="3" label="NewWindow"/>
+  <int value="4" label="Follow"/>
+  <int value="5" label="Bookmark"/>
+  <int value="6" label="ReadingList"/>
+  <int value="7" label="ClearBrowsingData"/>
+  <int value="8" label="Translate"/>
+  <int value="9" label="DesktopSite"/>
+  <int value="10" label="FindInPage"/>
+  <int value="11" label="TextZoom"/>
+  <int value="12" label="ReportAnIssue"/>
+  <int value="13" label="Help"/>
+  <int value="14" label="ShareChrome"/>
+  <int value="15" label="EditActions"/>
+</enum>
+
 <enum name="IOSOverflowMenuActionType">
   <int value="0" label="No scroll, no action"/>
   <int value="1" label="Scroll, no action"/>
@@ -55921,6 +56032,31 @@
   <int value="3" label="Scroll, action"/>
 </enum>
 
+<enum name="IOSOverflowMenuDestination">
+  <int value="0" label="Bookmarks"/>
+  <int value="1" label="History"/>
+  <int value="2" label="ReadingList"/>
+  <int value="3" label="Passwords"/>
+  <int value="4" label="Downloads"/>
+  <int value="5" label="RecentTabs"/>
+  <int value="6" label="SiteInfo"/>
+  <int value="7" label="Settings"/>
+  <int value="8" label="WhatsNew"/>
+  <int value="9" label="SpotlightDebugger"/>
+  <int value="10" label="PriceNotifications"/>
+</enum>
+
+<enum name="IOSOverflowMenuReorderingReason">
+  <int value="0" label="Error Badge"/>
+  <int value="1" label="New Badge"/>
+  <int value="2" label="Both Badges"/>
+</enum>
+
+<enum name="IOSOverflowMenuSmartSortingChange">
+  <int value="0" label="Newly Enabled"/>
+  <int value="1" label="Newly Disabled"/>
+</enum>
+
 <enum name="IOSPageLoadCountNavigationType">
   <int value="0" label="Chrome URL Navigation"/>
   <int value="1" label="Same Document Web Navigation"/>
@@ -55943,6 +56079,13 @@
   <int value="11" label="CarrierIParcel"/>
 </enum>
 
+<enum name="IOSParcelTrackingOptInActionOnPrompt">
+  <int value="0" label="AskEveryTime"/>
+  <int value="1" label="AlwaysTrack"/>
+  <int value="2" label="NoThanks"/>
+  <int value="3" label="SwipeToDismiss"/>
+</enum>
+
 <enum name="IOSPermissionEvent">
   <int value="0" label="Camera permission disabled"/>
   <int value="1" label="Camera permission enabled"/>
@@ -56106,6 +56249,22 @@
   <int value="2" label="Available"/>
 </enum>
 
+<enum name="IOSSpotlightDonatedIntentType">
+  <int value="0" label="Search In Chrome"/>
+  <int value="1" label="Open Reading List"/>
+  <int value="2" label="Open Bookmarks"/>
+  <int value="3" label="Open Recent Tabs"/>
+  <int value="4" label="Open Tab Grid"/>
+  <int value="5" label="Open Voice Search"/>
+  <int value="6" label="Open New Tab"/>
+  <int value="7" label="Play Dino Game"/>
+  <int value="8" label="Set Default Browser"/>
+  <int value="9" label="View History"/>
+  <int value="10" label="Open Latest Tab"/>
+  <int value="11" label="Start Lens"/>
+  <int value="12" label="Clear Browsing Data"/>
+</enum>
+
 <enum name="IOSSpotlightOrigin">
   <int value="0" label="Unknown Origin"/>
   <int value="1" label="Bookmark"/>
@@ -57433,6 +57592,7 @@
   <int value="2" label="Opened regular browser"/>
   <int value="3" label="Opened devtools browser"/>
   <int value="4" label="Opened normal troubleshooting browser"/>
+  <int value="5" label="Opened system web app"/>
 </enum>
 
 <enum name="KioskInternetAccessInfo">
@@ -57567,12 +57727,12 @@
 <enum name="LacrosMigrationStatus">
   <int value="0" label="Lacros not enabled"/>
   <int value="1" label="Uncompleted"/>
-  <int value="2" label="Completed via copy"/>
-  <int value="3" label="Completed via move"/>
-  <int value="4" label="Skipped for new user">
+  <int value="2" label="Skipped for new user">
     Migration was skipped but marked as completed because new users don't
     require migration.
   </int>
+  <int value="3" label="Completed via copy"/>
+  <int value="4" label="Completed via move"/>
 </enum>
 
 <enum name="LanguageDetectionComparison">
@@ -58539,6 +58699,8 @@
   <int value="68" label="SBOX_ERROR_MISMATCH_SENTINEL_VALUE"/>
   <int value="69" label="SBOX_ERROR_FAILED_TO_FREEZE_CONFIG"/>
   <int value="70" label="SBOX_ERROR_CANNOT_OBTAIN_ENVIRONMENT"/>
+  <int value="71" label="SBOX_ERROR_DELEGATE_INITIALIZE_CONFIG"/>
+  <int value="72" label="SBOX_ERROR_DISABLING_APPHELP"/>
   <int value="1002" label="LAUNCH_RESULT_SUCCESS"/>
   <int value="1003" label="LAUNCH_RESULT_FAILURE"/>
 </enum>
@@ -60305,6 +60467,7 @@
   <int value="-2104950596" label="HandwritingGesture:enabled"/>
   <int value="-2104757592"
       label="OmniboxUseExistingAutocompleteClient:enabled"/>
+  <int value="-2104240590" label="TimeOfDayDlc:disabled"/>
   <int value="-2103692632" label="EnhancedNetworkVoices:disabled"/>
   <int value="-2102286055" label="WebViewVulkanIntermediateBuffer:disabled"/>
   <int value="-2101682955" label="EnableNotificationIndicator:enabled"/>
@@ -60469,6 +60632,7 @@
       label="HappinessTrackingSurveysForDesktopPrivacySandbox:enabled"/>
   <int value="-2033225430" label="NTPMostLikelyFaviconsFromServer:disabled"/>
   <int value="-2033136855" label="MessagesForAndroidPasswords:disabled"/>
+  <int value="-2032870269" label="PrivacyGuideAndroid3:disabled"/>
   <int value="-2032292269" label="ImprovedIncognitoScreenshot:enabled"/>
   <int value="-2032013236"
       label="AutofillEnforceDelaysInStrikeDatabase:disabled"/>
@@ -60484,6 +60648,7 @@
   <int value="-2028232016" label="spurious-power-button-lid-angle-change"/>
   <int value="-2028202891"
       label="AutofillEnableFixedPaymentsBubbleLogging:disabled"/>
+  <int value="-2027019131" label="LegacyTechReportTopLevelUrl:enabled"/>
   <int value="-2026838590" label="OmniboxSteadyStateHeight:disabled"/>
   <int value="-2026156288"
       label="LookalikeUrlNavigationSuggestionsUI:disabled"/>
@@ -60555,6 +60720,7 @@
       label="OmniboxGroupSuggestionsBySearchVsUrl:enabled"/>
   <int value="-1996087238" label="kAutofillEnableOffersInDownstream:enabled"/>
   <int value="-1995534832" label="DownloadProgressMessage:disabled"/>
+  <int value="-1993967111" label="EnableRuntimeCountersTelemetry:enabled"/>
   <int value="-1993745822" label="PrivacyIndicators:disabled"/>
   <int value="-1993739187"
       label="AutofillHighlightOnlyChangedValuesInPreviewMode:disabled"/>
@@ -60583,7 +60749,6 @@
   <int value="-1983891525" label="DecodeJpeg420ImagesToYUV:disabled"/>
   <int value="-1983569861" label="WebXROrientationSensorDevice:disabled"/>
   <int value="-1982700103" label="EnableAppsGridGapFeature:enabled"/>
-  <int value="-1982298556" label="DownloadBubble:disabled"/>
   <int value="-1982080540" label="DurableClientHintsCache:disabled"/>
   <int value="-1981692093"
       label="SafeBrowsingPasswordProtectionForSignedInUsers:enabled"/>
@@ -60790,6 +60955,7 @@
   <int value="-1892555086" label="disable-compositor-animation-timelines"/>
   <int value="-1892000374" label="SeccompSandboxAndroid:enabled"/>
   <int value="-1890374564" label="OobeRecommendAppsScreen:disabled"/>
+  <int value="-1889151011" label="Cardboard:disabled"/>
   <int value="-1888578524" label="DisplayIdentification:enabled"/>
   <int value="-1888273969" label="tab-capture-upscale-quality"/>
   <int value="-1887862464" label="SpannableInlineAutocomplete:disabled"/>
@@ -60803,6 +60969,7 @@
   <int value="-1885074774" label="ShelfScrollable:enabled"/>
   <int value="-1884845660" label="PreferConstantFrameRate:enabled"/>
   <int value="-1883170077" label="EnableHtmlBaseUsernameDetector:disabled"/>
+  <int value="-1882649050" label="ProfilesReordering:enabled"/>
   <int value="-1882427024" label="IwaControlledFrame:disabled"/>
   <int value="-1882330924" label="NTPArticleSuggestions:enabled"/>
   <int value="-1880633355" label="CaptureModeAudioMixing:disabled"/>
@@ -60823,6 +60990,7 @@
   <int value="-1872867546" label="EnumerateAudioDevices:disabled"/>
   <int value="-1872205507" label="ShelfNewUi:enabled"/>
   <int value="-1871552967" label="DesktopPWAsTabStrip:disabled"/>
+  <int value="-1871472551" label="PwaRestoreUi:enabled"/>
   <int value="-1871389939" label="DeskButton:enabled"/>
   <int value="-1871185948" label="VrLaunchIntents:disabled"/>
   <int value="-1870961970" label="enable-filemanager-mtp"/>
@@ -61031,6 +61199,7 @@
   <int value="-1766317053" label="GridTabSwitcherForTablets:enabled"/>
   <int value="-1766162197" label="AppServiceInstanceRegistry:enabled"/>
   <int value="-1766129470" label="DataSaverLiteModeRebranding:disabled"/>
+  <int value="-1765921578" label="BlinkExtensionDiagnostics:enabled"/>
   <int value="-1765004425"
       label="CertificateTransparency2022PolicyAllCerts:disabled"/>
   <int value="-1764447174" label="UseNAT64ForIPv4Literal:disabled"/>
@@ -61161,6 +61330,8 @@
   <int value="-1691602043" label="DisableOfficeEditingComponentApp:enabled"/>
   <int value="-1691281364" label="enable-notification-action-icons"/>
   <int value="-1690359116" label="ShortcutCustomizationJelly:enabled"/>
+  <int value="-1689444567"
+      label="AutofillUpdateChromeSettingsLinkToGPayWeb:disabled"/>
   <int value="-1688631209"
       label="AutofillEnableRankingFormulaAddressProfiles:enabled"/>
   <int value="-1687407363" label="KaleidoscopeModule:disabled"/>
@@ -61266,6 +61437,7 @@
   <int value="-1636188191" label="IncognitoNtpRevamp:enabled"/>
   <int value="-1635048938" label="DetectFormSubmissionOnFormClear:disabled"/>
   <int value="-1634878515" label="ChromeHomeModernLayout:enabled"/>
+  <int value="-1634753928" label="QueryTilesDisableCountryOverride:disabled"/>
   <int value="-1634490190"
       label="AutofillCreditCardLocalCardMigration:disabled"/>
   <int value="-1634154256" label="ZeroSuggestRedirectToChrome:enabled"/>
@@ -61358,6 +61530,8 @@
   <int value="-1596489715" label="AutoScreenBrightness:enabled"/>
   <int value="-1595456861" label="FullscreenPopupWindows:disabled"/>
   <int value="-1594298767" label="FullscreenToolbarReveal:enabled"/>
+  <int value="-1593946814"
+      label="AccountReauthenticationRecentTimeWindow:enabled"/>
   <int value="-1591974904"
       label="SafeBrowsingSeparateNetworkContexts:disabled"/>
   <int value="-1591450227" label="enable-microphone-mute-switch-device"/>
@@ -61436,6 +61610,8 @@
   <int value="-1553477903" label="ash-disable-text-filtering-in-overview-mode"/>
   <int value="-1553280810" label="PromoBrowserCommands:enabled"/>
   <int value="-1552898031" label="SingleTabMode:enabled"/>
+  <int value="-1551839190"
+      label="EarlyDocumentSwapForBackForwardTransitions:enabled"/>
   <int value="-1551197844" label="AssistMultiWord:enabled"/>
   <int value="-1550675387" label="CriticalPersistedTabData:enabled"/>
   <int value="-1550541457" label="DisplayIdentification:disabled"/>
@@ -61443,6 +61619,7 @@
   <int value="-1549356351" label="SyncPseudoUSSExtensionSettings:enabled"/>
   <int value="-1548904154" label="MediaAppMultiWindow:enabled"/>
   <int value="-1547953198" label="FullRestore:enabled"/>
+  <int value="-1547923809" label="JapaneseOSSettings:enabled"/>
   <int value="-1547247328" label="OverrideTranslateTriggerInIndia:disabled"/>
   <int value="-1546903171" label="enable-touch-drag-drop"/>
   <int value="-1546461079" label="CCTResizableForFirstParties:disabled"/>
@@ -61925,6 +62102,7 @@
   <int value="-1318914924" label="OverflowIconsForMediaControls:enabled"/>
   <int value="-1317768255" label="PermissionStorageAccessAPI:enabled"/>
   <int value="-1316769004" label="CrossOriginOpenerPolicyReporting:disabled"/>
+  <int value="-1315631616" label="CustomizeChromeWallpaperSearch:disabled"/>
   <int value="-1315360754" label="WindowLayoutMenu:disabled"/>
   <int value="-1314823250"
       label="OsSettingsDeprecateSyncMetricsToggle:disabled"/>
@@ -61937,6 +62115,8 @@
   <int value="-1311204345" label="FuseBox:disabled"/>
   <int value="-1311133348" label="VrBrowsingNativeAndroidUi:enabled"/>
   <int value="-1310737697" label="MaterialDesignSettings:enabled"/>
+  <int value="-1310387347"
+      label="AccountReauthenticationRecentTimeWindow:disabled"/>
   <int value="-1309955811"
       label="DnsOverHttpsWithIdentifiersReuseOldPolicy:disabled"/>
   <int value="-1309828996"
@@ -62037,12 +62217,12 @@
   <int value="-1267958145" label="disable-pdf-material-ui"/>
   <int value="-1266934701" label="AccessibilityAXModes:enabled"/>
   <int value="-1265627803" label="WebAppEnableManifestId:enabled"/>
+  <int value="-1264634670" label="HideTabOnTabSwitcher:disabled"/>
   <int value="-1262730949" label="EnableDspHotword:enabled"/>
   <int value="-1262303946" label="SubresourceRedirectPreviews:disabled"/>
   <int value="-1262302650" label="StorageBuckets:disabled"/>
   <int value="-1262152606" label="disable-lock-screen-apps"/>
   <int value="-1261972671" label="OmniboxDocumentProvider:disabled"/>
-  <int value="-1261699926" label="DownloadBubbleV2:disabled"/>
   <int value="-1261263046"
       label="RemoveUsageOfDeprecatedGaiaSigninEndpoint:disabled"/>
   <int value="-1261110018" label="AllowDisableTouchpadHapticFeedback:disabled"/>
@@ -62050,7 +62230,6 @@
   <int value="-1259901957" label="VrBrowserKeyboard:disabled"/>
   <int value="-1259809702" label="Enable16Desks:enabled"/>
   <int value="-1259627326" label="AllowRepeatedUpdates:disabled"/>
-  <int value="-1259375364" label="SearchInShortcutsApp:disabled"/>
   <int value="-1258141852" label="ScrollUnification:enabled"/>
   <int value="-1257822114" label="ContextMenuPopupForAllScreenSizes:disabled"/>
   <int value="-1256823053" label="WebRtcHWVP9Encoding:enabled"/>
@@ -62174,6 +62353,7 @@
   <int value="-1202556733" label="PermissionStorageAccessAPI:disabled"/>
   <int value="-1201741587" label="DataReductionProxyDecidesTransform:disabled"/>
   <int value="-1201183153" label="enable-centered-app-list"/>
+  <int value="-1200367345" label="SyncAutofillWalletCredentialData:enabled"/>
   <int value="-1199738132" label="MediaAppMultiWindow:disabled"/>
   <int value="-1199416041"
       label="AutofillEnableGetDetailsForEnrollParsingInUploadCardResponse:enabled"/>
@@ -62190,7 +62370,6 @@
   <int value="-1195034892" label="ContinuousSearch:disabled"/>
   <int value="-1194747282" label="kNearbySharingSelfShare:enabled"/>
   <int value="-1194129602" label="ClientSideDetectionModelOnAndroid:disabled"/>
-  <int value="-1193375480" label="DownloadBubble:enabled"/>
   <int value="-1192790333" label="ArcUseHighMemoryDalvikProfile:disabled"/>
   <int value="-1192334995" label="CrOSLateBootAudioHFPOffload:enabled"/>
   <int value="-1191671217" label="TabGroupsNewBadgePromo:disabled"/>
@@ -62304,6 +62483,7 @@
   <int value="-1141780291" label="DisplayChangeModal:disabled"/>
   <int value="-1140923360" label="DeprecateAssistantStylusFeatures:disabled"/>
   <int value="-1140212005" label="ExtensionWebFileHandlers:enabled"/>
+  <int value="-1139532878" label="PrivacyGuidePreload:disabled"/>
   <int value="-1138851579" label="QuerySearchBurnInPeriod:disabled"/>
   <int value="-1137745598" label="PhoneHubNudge:disabled"/>
   <int value="-1137696948" label="enable-chromeos-account-manager"/>
@@ -62607,6 +62787,7 @@
   <int value="-987191098" label="FontAccessPersistent:disabled"/>
   <int value="-987187004" label="SyncSettingsCategorization:disabled"/>
   <int value="-985964106" label="PriceTrackingIconColors:disabled"/>
+  <int value="-985845117" label="Cardboard:enabled"/>
   <int value="-985445963" label="TabSearchFuzzySearch:disabled"/>
   <int value="-984052166" label="DoodlesOnLocalNtp:enabled"/>
   <int value="-983342281" label="TabSwitcherLongpressMenu:disabled"/>
@@ -62670,6 +62851,7 @@
   <int value="-958159088" label="RestoreTabsOnFRE:enabled"/>
   <int value="-957200826" label="enable-spdy-proxy-auth"/>
   <int value="-956696029" label="scheduler-configuration"/>
+  <int value="-956563847" label="QueryTilesDisableCountryOverride:enabled"/>
   <int value="-955667686"
       label="AutofillSuppressCreditCardSaveForAssistant:enabled"/>
   <int value="-954972757"
@@ -62697,6 +62879,7 @@
   <int value="-943304570" label="PaintHolding:enabled"/>
   <int value="-943223021"
       label="FeatureNotificationGuideSkipCheckForLowEngagedUsers:disabled"/>
+  <int value="-940931658" label="UseDMSAAForTilesAndroidGL:disabled"/>
   <int value="-940915510" label="IgnoreCSPInWebPaymentAPI:disabled"/>
   <int value="-940390151" label="RoundedDisplay:disabled"/>
   <int value="-939676447" label="CrostiniResetLxdDb:enabled"/>
@@ -62789,7 +62972,6 @@
   <int value="-892428689" label="ManualPasswordGenerationAndroid:enabled"/>
   <int value="-892297699" label="EditContext:enabled"/>
   <int value="-891856063" label="MidiManagerAndroid:enabled"/>
-  <int value="-890224928" label="DownloadBubbleV2:enabled"/>
   <int value="-889670978" label="AssistantRoutines:disabled"/>
   <int value="-888336510" label="NtpSingleRowShortcuts:enabled"/>
   <int value="-887101831" label="StoreHoursAndroid:disabled"/>
@@ -62923,6 +63105,7 @@
   <int value="-829498062" label="HttpsFirstModeV2:disabled"/>
   <int value="-826010284" label="EnterpriseReportingUI:disabled"/>
   <int value="-825942229" label="tab-management-experiment-type-elderberry"/>
+  <int value="-825514105" label="TimeOfDayDlc:enabled"/>
   <int value="-825312041" label="CastStreamingAv1:enabled"/>
   <int value="-824199802" label="ContextualSearchSimplifiedServer:enabled"/>
   <int value="-823394398" label="TargetEmbeddingLookalikes:enabled"/>
@@ -62942,6 +63125,7 @@
   <int value="-816404462" label="TabGroupsAutoCreate:disabled"/>
   <int value="-815616832"
       label="OmniboxRemoveExcessiveRecycledViewClearCalls:enabled"/>
+  <int value="-815487797" label="WindowSplitting:enabled"/>
   <int value="-815213125" label="SplitSettings:enabled"/>
   <int value="-814305011" label="BatchFetchRequests:disabled"/>
   <int value="-814097014" label="disable-session-crashed-bubble"/>
@@ -62956,6 +63140,7 @@
   <int value="-809456392" label="WebViewVulkanIntermediateBuffer:enabled"/>
   <int value="-808486493" label="NewWallpaperPicker:disabled"/>
   <int value="-807864284" label="prefer-dcheck"/>
+  <int value="-807352944" label="IppFirstSetupForUsbPrinters:disabled"/>
   <int value="-806549905"
       label="TabbedAppOverflowMenuThreeButtonActionbar:disabled"/>
   <int value="-806480547" label="SyncDeviceInfoInTransportMode:enabled"/>
@@ -63025,6 +63210,8 @@
   <int value="-772040705" label="ChromeWhatsNewInMainMenuNewBadge:disabled"/>
   <int value="-771080109" label="GrantNotificationsToDSE:disabled"/>
   <int value="-770319039" label="enable-touch-editing"/>
+  <int value="-770144964"
+      label="ExperimentalAccessibilityGoogleTtsHighQualityVoices:enabled"/>
   <int value="-769865314" label="AutofillCacheQueryResponses:disabled"/>
   <int value="-768240392" label="CertificateTransparency2022Policy:enabled"/>
   <int value="-767903409" label="EarlyBodyLoad:enabled"/>
@@ -63038,6 +63225,7 @@
   <int value="-763730918" label="CCTTargetTranslateLanguage:disabled"/>
   <int value="-763640405" label="WebXRARModule:enabled"/>
   <int value="-763219650" label="OmniboxDefaultBrowserPedal:enabled"/>
+  <int value="-762787417" label="RestoreSyncedPlaceholderTabs:enabled"/>
   <int value="-762785269"
       label="EnableBackForwardCacheForScreenReader:disabled"/>
   <int value="-762738927" label="LogJsConsoleMessages:enabled"/>
@@ -63083,6 +63271,8 @@
   <int value="-743590125" label="TabEngagementReportingAndroid:enabled"/>
   <int value="-743103250" label="enable-linkable-ephemeral-apps"/>
   <int value="-742469530" label="DriveFS:disabled"/>
+  <int value="-742455458"
+      label="ExperimentalAccessibilityGoogleTtsHighQualityVoices:disabled"/>
   <int value="-741806604" label="DownloadsUi:disabled"/>
   <int value="-741751264" label="SafetyCheckPermissions:disabled"/>
   <int value="-740850824"
@@ -63294,6 +63484,7 @@
   <int value="-638177392" label="FuseBoxDebug:enabled"/>
   <int value="-637297943" label="WebAuthenticationCableSecondFactor:disabled"/>
   <int value="-637215276" label="QuickAnswersOnEditableText:enabled"/>
+  <int value="-636062300" label="BlinkExtensionDiagnostics:disabled"/>
   <int value="-634865673" label="ThemeRefactorAndroid:enabled"/>
   <int value="-634122679" label="GoogleBrandedContextMenu:enabled"/>
   <int value="-634116286"
@@ -63522,6 +63713,7 @@
   <int value="-527050466" label="NavigationRequestPreconnect:disabled"/>
   <int value="-526737102" label="TerminalAlternativeEmulator:disabled"/>
   <int value="-526236814" label="WebAssemblyTiering:enabled"/>
+  <int value="-523224129" label="PwaRestoreUi:disabled"/>
   <int value="-523155003" label="PhoneHubCameraRoll:disabled"/>
   <int value="-523030434" label="EnableBackgroundBlur:enabled"/>
   <int value="-522137246" label="PdfPortfolio:disabled"/>
@@ -63633,6 +63825,7 @@
   <int value="-466704882" label="webview-log-js-console-messages"/>
   <int value="-466164593"
       label="CacheControlNoStoreEnterBackForwardCache:disabled"/>
+  <int value="-466047052" label="EnableRuntimeCountersTelemetry:disabled"/>
   <int value="-465429170" label="BackGestureRefactorActivityAndroid:enabled"/>
   <int value="-465381408" label="Sharesheet:disabled"/>
   <int value="-462554210"
@@ -63679,6 +63872,7 @@
   <int value="-446560063" label="finch-seed-min-update-period"/>
   <int value="-446220201" label="EnableIncognitoShortcutOnDesktop:enabled"/>
   <int value="-444867364" label="Metal:enabled"/>
+  <int value="-444758854" label="CellularCarrierLock:disabled"/>
   <int value="-442352394" label="IframeOneGoogleBar:disabled"/>
   <int value="-441972413" label="OobeJellyModal:disabled"/>
   <int value="-441840790" label="TailoredSecurityUpdatedMessages:disabled"/>
@@ -63714,6 +63908,7 @@
   <int value="-424134004" label="WebPaymentsExperimentalFeatures:disabled"/>
   <int value="-424125732" label="FlossIsAvailabilityCheckNeeded:disabled"/>
   <int value="-423134304" label="VirtualKeyboardMultitouch:disabled"/>
+  <int value="-421655506" label="RedInterstitialFacelift:disabled"/>
   <int value="-421428607" label="InheritNativeThemeFromParentWidget:disabled"/>
   <int value="-421314301" label="ForceShowContinueSection:enabled"/>
   <int value="-420956156" label="WebApkGenerator:disabled"/>
@@ -63733,7 +63928,6 @@
   <int value="-413286115"
       label="DisruptiveNotificationPermissionRevocation:disabled"/>
   <int value="-412736561" label="EnableZeroStateMixedTypesRanker:enabled"/>
-  <int value="-412645531" label="AutofillTokenPrefixMatching:enabled"/>
   <int value="-410852857" label="ImprovedA2HS:disabled"/>
   <int value="-408769228" label="ArcGraphicBuffersVisualizationTool:disabled"/>
   <int value="-406850932" label="EnableEmojiContextMenu:enabled"/>
@@ -63825,6 +64019,7 @@
   <int value="-364325011" label="enable-files-quick-view"/>
   <int value="-364267715" label="disable-native-cups"/>
   <int value="-363885137" label="StoragePressureEvent:disabled"/>
+  <int value="-363145046" label="LegacyTechReportTopLevelUrl:disabled"/>
   <int value="-362821234" label="ExperimentalUi:enabled"/>
   <int value="-362022976" label="disable-quirks-client"/>
   <int value="-361948582" label="material-security-verbose"/>
@@ -63963,9 +64158,13 @@
   <int value="-298243336" label="ChromeOSAmbientModeNewUrl:disabled"/>
   <int value="-297716805"
       label="CrossOriginMediaPlaybackRequiresUserGesture:disabled"/>
+  <int value="-297488523" label="PrivacyGuidePreload:enabled"/>
+  <int value="-297370583" label="RestoreSyncedPlaceholderTabs:disabled"/>
   <int value="-296762162" label="ExoOrdinalMotion:enabled"/>
   <int value="-296493265" label="ProjectorAppDebug:enabled"/>
   <int value="-296208832" label="ServiceWorkerStaticRouter:disabled"/>
+  <int value="-296203212"
+      label="AutofillEnableMerchantDomainInUnmaskCardRequest:enabled"/>
   <int value="-296179618" label="CookiesWithoutSameSiteMustBeSecure:enabled"/>
   <int value="-295237704" label="EnableRemovingAllThirdPartyCookies:enabled"/>
   <int value="-293546827" label="HideIncognitoMediaMetadata:enabled"/>
@@ -64057,6 +64256,7 @@
   <int value="-255157394" label="ButtonARCNetworkDiagnostics:enabled"/>
   <int value="-254887599" label="google-profile-info"/>
   <int value="-254158542" label="SubresourceRedirectPreviews:enabled"/>
+  <int value="-253685023" label="PrivacyGuideAndroid3:enabled"/>
   <int value="-253619457" label="ChromeSharingHubLaunchAdjacent:enabled"/>
   <int value="-252258023" label="ShimlessRMAFlow:enabled"/>
   <int value="-252128826" label="ContextualSearchDelayedIntelligence:enabled"/>
@@ -64233,6 +64433,8 @@
       label="ColorProviderRedirectionForThemeProvider:disabled"/>
   <int value="-163146178" label="NtpRealboxIsTall:disabled"/>
   <int value="-162928621" label="ForceStartupSigninPromo:disabled"/>
+  <int value="-162377456" label="SecurePaymentConfirmationExtensions:enabled"/>
+  <int value="-162294119" label="FeedSportsCard:disabled"/>
   <int value="-161782023" label="AndroidMessagesProdEndpoint:enabled"/>
   <int value="-161284423" label="DesktopSharePreview:enabled"/>
   <int value="-160571071" label="InterestFeedV2:enabled"/>
@@ -64292,6 +64494,7 @@
       label="AutofillEnableManualFallbackForVirtualCards:enabled"/>
   <int value="-128687277"
       label="OmniboxUIExperimentHideSteadyStateUrlPathQueryAndRef:disabled"/>
+  <int value="-128652428" label="PrivacyGuidePreloadAndroid:enabled"/>
   <int value="-128289378" label="EnableFamilyInfoFeedback:disabled"/>
   <int value="-127666141" label="TabGroups:disabled"/>
   <int value="-127231994" label="VrBrowsingNativeAndroidUi:disabled"/>
@@ -64559,6 +64762,7 @@
   <int value="-2953333" label="AndroidHistoryManager:disabled"/>
   <int value="-2512468" label="OmniboxMaterialDesignWeatherIcons:disabled"/>
   <int value="-2371418" label="disable-display-list-2d-canvas"/>
+  <int value="-1978322" label="BlinkExtension:enabled"/>
   <int value="-1164379" label="EnterpriseReportingInChromeOS:disabled"/>
   <int value="0" label="BAD_FLAG_FORMAT">
     Command-line flag doesn't start with two dashes.
@@ -64683,7 +64887,6 @@
   <int value="60023885" label="AutofillNoLocalSaveOnUnmaskSuccess:disabled"/>
   <int value="60442188" label="MultilingualTyping:enabled"/>
   <int value="60461879" label="AppListBubble:enabled"/>
-  <int value="60661012" label="RgbKeyboard:enabled"/>
   <int value="61130490" label="WebViewBrotliSupport:enabled"/>
   <int value="61141457" label="DecodeScriptSourceOffThread:enabled"/>
   <int value="61205887" label="enable-text-input-focus-manager"/>
@@ -64768,6 +64971,7 @@
   <int value="105046382" label="ParallelDownloading:disabled"/>
   <int value="105164136" label="EnterpriseReportingUI:enabled"/>
   <int value="105284154" label="PromiseIcons:enabled"/>
+  <int value="106174755" label="FeedSportsCard:enabled"/>
   <int value="106235373" label="LauncherSystemInfoAnswerCards:enabled"/>
   <int value="106596969" label="HideIncognitoMediaMetadata:disabled"/>
   <int value="106744400" label="OmniboxModernizeVisualUpdate:enabled"/>
@@ -64825,6 +65029,7 @@
   <int value="129458360" label="LiteVideo:disabled"/>
   <int value="130059719" label="ThreadedPreloadScanner:disabled"/>
   <int value="130939792" label="FilesJsModules:disabled"/>
+  <int value="131135725" label="PerformanceSettingsPreloadingSubpage:enabled"/>
   <int value="131881947" label="D3DVsync:enabled"/>
   <int value="132560299"
       label="OmniboxUIExperimentHideSteadyStateUrlScheme:disabled"/>
@@ -65031,6 +65236,8 @@
   <int value="240856309" label="MimeHandlerViewInCrossProcessFrame:enabled"/>
   <int value="241187301" label="BrowserTouchBar:disabled"/>
   <int value="244040049" label="DrawImmediatelyWhenInteractive:disabled"/>
+  <int value="244208319"
+      label="AutofillEnableMerchantDomainInUnmaskCardRequest:disabled"/>
   <int value="244697230" label="enable-theme-color-in-tabbed-mode"/>
   <int value="245100553" label="PcieBillboardNotification:enabled"/>
   <int value="245896533" label="SearchSuggestionsOnLocalNtp:enabled"/>
@@ -65244,6 +65451,7 @@
   <int value="342960463" label="SharingQRCodeGenerator:enabled"/>
   <int value="343286828" label="IgnoreUiGains:disabled"/>
   <int value="343445783" label="AllowScrollSettings:enabled"/>
+  <int value="343815157" label="SafeBrowsingHashPrefixRealTimeLookups:enabled"/>
   <int value="345430155" label="CrOSDspBasedAgcAllowed:enabled"/>
   <int value="345611669"
       label="OmniboxLocalZeroSuggestFrecencyRanking:enabled"/>
@@ -65275,6 +65483,7 @@
   <int value="356453693" label="SystemNudgeV2:disabled"/>
   <int value="357138275" label="enable-floating-virtual-keyboard:disabled"/>
   <int value="357165937" label="ShareToGoogleCollections:enabled"/>
+  <int value="357322724" label="PerformanceSettingsPreloadingSubpage:disabled"/>
   <int value="357832577" label="OmniboxSuggestionHoverFillShape:disabled"/>
   <int value="358399482" label="enable-high-dpi-fixed-position-compositing"/>
   <int value="358493847" label="BackgroundLoader:disabled"/>
@@ -65417,6 +65626,7 @@
   <int value="417742858" label="ImprovedSemanticsActivityIndicators:enabled"/>
   <int value="418769094" label="MixedContentSiteSetting:enabled"/>
   <int value="420160748" label="CornerShortcuts:enabled"/>
+  <int value="420200188" label="JapaneseOSSettings:disabled"/>
   <int value="420356964" label="OobeJelly:enabled"/>
   <int value="420682005" label="AdaptiveButtonInTopToolbar:enabled"/>
   <int value="421986951" label="UseRealColorSpaceForAndroidVideo:disabled"/>
@@ -65526,6 +65736,7 @@
       label="OmniboxClobberIsZeroSuggestEntrypoint:disabled"/>
   <int value="482577697" label="PdfOcr:enabled"/>
   <int value="483155358" label="GlobalMediaControlsForChromeOS:disabled"/>
+  <int value="483173979" label="SecurePaymentConfirmationExtensions:disabled"/>
   <int value="484581911" label="ServiceWorkerSubresourceFilter:disabled"/>
   <int value="484596410" label="EnterpriseRealtimeExtensionRequest:disabled"/>
   <int value="484611531" label="AccessibilityGameFaceIntegration:enabled"/>
@@ -65654,6 +65865,7 @@
   <int value="552158955" label="NotificationPermissionBottomSheet:enabled"/>
   <int value="552317551" label="MediaAppHandlesPdf:disabled"/>
   <int value="552421509" label="AssistMultiWordExpanded:enabled"/>
+  <int value="552724079" label="NotifierCollision:enabled"/>
   <int value="553197994" label="FedCmMetricsEndpoint:enabled"/>
   <int value="555959995" label="ChromeSharingHub:enabled"/>
   <int value="556555487"
@@ -65683,6 +65895,7 @@
   <int value="565406673" label="EnableVirtualKeyboardMdUi:enabled"/>
   <int value="566031886" label="DIPS:disabled"/>
   <int value="567368307" label="enable-experimental-canvas-features"/>
+  <int value="569192576" label="UpstreamTrustedReportsFirmware:enabled"/>
   <int value="570445904" label="WGIGamepadTriggerRumble:disabled"/>
   <int value="570469494" label="LoginDetection:disabled"/>
   <int value="570882482" label="CrOSDspBasedAecAllowed:enabled"/>
@@ -65702,6 +65915,7 @@
   <int value="578695119" label="ImprovedCookieControls:disabled"/>
   <int value="578894559" label="IPH_Snooze:enabled"/>
   <int value="580288865" label="ClipboardMaximumAge:disabled"/>
+  <int value="580546202" label="WindowSplitting:disabled"/>
   <int value="581118445" label="enable-eol-notification"/>
   <int value="581355159" label="ContentSuggestionsCategoryRanker:disabled"/>
   <int value="582187448" label="DontPrefetchLibraries:enabled"/>
@@ -65762,6 +65976,7 @@
   <int value="616609955" label="ActionableContentSettings:enabled"/>
   <int value="616660621" label="ImeInputLogicFst:disabled"/>
   <int value="616717743" label="UIEnableSharedImageCacheForGpu:disabled"/>
+  <int value="617706826" label="ProfilesReordering:disabled"/>
   <int value="617762656" label="FirstScrollLatencyMeasurement:enabled"/>
   <int value="618407424" label="OmniboxRetainSuggestionsWithHeaders:enabled"/>
   <int value="618426510" label="WaylandScreenCoordinatesEnabled:disabled"/>
@@ -65818,6 +66033,7 @@
   <int value="642037198" label="SoleIntegration:disabled"/>
   <int value="642601306" label="ForceInitialSyncWhenDecryptionFails:enabled"/>
   <int value="642678255" label="ExoGamepadVibration:disabled"/>
+  <int value="642996845" label="NotifierCollision:disabled"/>
   <int value="643068614"
       label="CrossOriginOpenerPolicyAccessReporting:enabled"/>
   <int value="643725031" label="disable-touch-feedback"/>
@@ -65839,6 +66055,7 @@
   <int value="651471603" label="MediaFoundationD3D11VideoCapture:enabled"/>
   <int value="651562604" label="RawClipboard:enabled"/>
   <int value="651844675" label="EasyUnlockPromotions:enabled"/>
+  <int value="652149678" label="EnableBoundSessionCredentials:disabled"/>
   <int value="652561231" label="CustomContextMenu:enabled"/>
   <int value="653308913" label="ServiceWorkerSubresourceFilter:enabled"/>
   <int value="653795860" label="HelpAppReleaseNotes:disabled"/>
@@ -65961,6 +66178,8 @@
   <int value="705946076"
       label="ContextMenuPerformanceInfoAndRemoteHintFetching:disabled"/>
   <int value="706280254" label="StoragePressureEvent:enabled"/>
+  <int value="708015891"
+      label="AutofillUpdateChromeSettingsLinkToGPayWeb:enabled"/>
   <int value="708185835" label="WebViewThrottleBackgroundBeginFrame:enabled"/>
   <int value="709138900" label="InstantStart:enabled"/>
   <int value="709850261" label="disable-touch-editing"/>
@@ -66043,6 +66262,7 @@
   <int value="742083923" label="MimeHandlerViewInCrossProcessFrame:disabled"/>
   <int value="742363749" label="OSKResizesVisualViewportByDefault:disabled"/>
   <int value="742797916" label="TabStripRedesign:disabled"/>
+  <int value="743696247" label="RedInterstitialFacelift:enabled"/>
   <int value="743714331" label="HelpAppLauncherSearch:enabled"/>
   <int value="744342941" label="SafetyCheckChromeCleanerChild:enabled"/>
   <int value="745541471" label="PaintHolding:disabled"/>
@@ -66077,6 +66297,7 @@
       label="OverrideLanguagePrefsForHrefTranslate:disabled"/>
   <int value="761815665" label="BlockInsecureDownloads:disabled"/>
   <int value="762030626" label="ViewTransition:disabled"/>
+  <int value="762073261" label="HideTabOnTabSwitcher:enabled"/>
   <int value="762324154" label="ZeroSuggestPrefetchingOnWeb:disabled"/>
   <int value="762700519" label="enable-checker-imaging"/>
   <int value="763667542"
@@ -66155,6 +66376,8 @@
   <int value="799680074" label="ContextualSearchTranslationModel:enabled"/>
   <int value="801865174" label="NetworkServiceInProcess2:enabled"/>
   <int value="802463708" label="WebViewSurfaceControl:enabled"/>
+  <int value="802588165"
+      label="SafeBrowsingHashPrefixRealTimeLookups:disabled"/>
   <int value="802930463" label="ThrottleForegroundTimers:disabled"/>
   <int value="803085289" label="CCTPreventTouches:disabled"/>
   <int value="803282885" label="PreferHtmlOverPlugins:disabled"/>
@@ -66361,6 +66584,8 @@
   <int value="909685129" label="ReduceUserAgentMinorVersion:disabled"/>
   <int value="910363543" label="ArcSyncInstallPriority:disabled"/>
   <int value="910725730" label="WebRtcHWVP9Encoding:disabled"/>
+  <int value="911139083"
+      label="kNewConfirmationBubbleForGeneratedPasswords:enabled"/>
   <int value="911256399" label="GlobalMediaControlsModernUI:enabled"/>
   <int value="912119426" label="InfiniteSessionRestore:disabled"/>
   <int value="913138924" label="RecurrentInterstitialFeature:disabled"/>
@@ -66404,6 +66629,7 @@
   <int value="935655516" label="password-import-export:disabled"/>
   <int value="936341613" label="OfflinePagesCT:disabled"/>
   <int value="936919953" label="bypass-app-banner-engagement-checks"/>
+  <int value="937305086" label="EnableBoundSessionCredentials:enabled"/>
   <int value="937557884" label="PostQuantumKyber:disabled"/>
   <int value="938191241" label="VrShell:enabled"/>
   <int value="939050961" label="OnTheFlyMhtmlHashComputation:disabled"/>
@@ -66412,6 +66638,7 @@
   <int value="939603162" label="BackgroundLoadingForDownloads:disabled"/>
   <int value="940302066" label="OmniboxUniformRowHeight:disabled"/>
   <int value="940705998" label="CrOSLateBootArcSwitchToKeyMintDaemon:disabled"/>
+  <int value="940751405" label="IppFirstSetupForUsbPrinters:enabled"/>
   <int value="941036016" label="ContentSuggestionsSettings:disabled"/>
   <int value="941883332" label="ProactiveTabFreezeAndDiscard:disabled"/>
   <int value="941948340" label="PlaybackSpeedButton:enabled"/>
@@ -66493,6 +66720,7 @@
   <int value="982932009" label="WebContentsCaptureHiDPI:disabled"/>
   <int value="982983280" label="LauncherSearchControl:enabled"/>
   <int value="983084316" label="SyncUSSNigori:disabled"/>
+  <int value="983236654" label="TrackingProtection3pcd:enabled"/>
   <int value="983311394" label="tab-management-experiment-type"/>
   <int value="985127848"
       label="SafeBrowsingPasswordProtectionForSignedInUsers:disabled"/>
@@ -66540,6 +66768,7 @@
   <int value="1004788743" label="ArcIdleManager:disabled"/>
   <int value="1004909189"
       label="ContentSuggestionsThumbnailDominantColor:disabled"/>
+  <int value="1004988656" label="TrackingProtection3pcd:disabled"/>
   <int value="1005684777" label="PictureInPicture:disabled"/>
   <int value="1006080779" label="ForcePreferredIntervalForVideo:disabled"/>
   <int value="1006280999" label="CrOSLateBootArcVmmSwap:enabled"/>
@@ -66547,6 +66776,7 @@
   <int value="1007444341" label="enable-prefixed-encrypted-media"/>
   <int value="1008677979"
       label="AutofillUseImprovedLabelDisambiguation:disabled"/>
+  <int value="1009252543" label="BlinkExtension:disabled"/>
   <int value="1009437086" label="AutofillEnableOfferNotification:disabled"/>
   <int value="1009596554" label="PWAsDefaultOfflinePage:enabled"/>
   <int value="1009713313" label="NtpChromeCartHistoryClusterCoexist:disabled"/>
@@ -66615,7 +66845,6 @@
       label="AllowDownloadResumptionWithoutStrongValidators:enabled"/>
   <int value="1045152062" label="SecurePaymentConfirmationBrowser:enabled"/>
   <int value="1045179357" label="NtpRealboxLensSearch:disabled"/>
-  <int value="1046786976" label="RgbKeyboard:disabled"/>
   <int value="1046878091" label="PasswordForceSaving:enabled"/>
   <int value="1046981538" label="OfflinePagesShowAlternateDinoPage:disabled"/>
   <int value="1047110483" label="ShelfHotseat:disabled"/>
@@ -66943,6 +67172,7 @@
   <int value="1205929554" label="SendTabToSelfOmniboxSendingAnimation:enabled"/>
   <int value="1206140820" label="RelatedSearchesInBar:disabled"/>
   <int value="1206486242" label="UseDnsHttpsSvcbAlpn:enabled"/>
+  <int value="1206725424" label="UpstreamTrustedReportsFirmware:disabled"/>
   <int value="1210118915" label="ShelfAutoHideSeparation:disabled"/>
   <int value="1210298193" label="FontAccessPersistent:enabled"/>
   <int value="1210343926" label="enable-drop-sync-credential"/>
@@ -66995,6 +67225,7 @@
   <int value="1230018793" label="enable-dom-distiller"/>
   <int value="1230555479"
       label="AutofillEnableUnmaskCardRequestSetInstrumentId:disabled"/>
+  <int value="1231489022" label="SyncAutofillWalletCredentialData:disabled"/>
   <int value="1233310128" label="ExoConsumedByImeByFlag:enabled"/>
   <int value="1234601252" label="ForceUseAPDownloadProtection:enabled"/>
   <int value="1234950775" label="FileTransferEnterpriseConnector:enabled"/>
@@ -67080,6 +67311,7 @@
   <int value="1272699563" label="enable-hosted-mode"/>
   <int value="1272923911" label="NewMessageListView:disabled"/>
   <int value="1274277775" label="SimLockPolicy:disabled"/>
+  <int value="1274356506" label="LacrosSharedComponentsDir:disabled"/>
   <int value="1274717741" label="top-chrome-touch-ui"/>
   <int value="1275507565" label="OfflinePagesRenovations:enabled"/>
   <int value="1276120671" label="AutofillEnableOfferNotification:enabled"/>
@@ -67184,6 +67416,7 @@
   <int value="1314681756" label="NoStatePrefetch:disabled"/>
   <int value="1314797690"
       label="CCTRealTimeEngagementSignalsAlternativeImpl:disabled"/>
+  <int value="1315158510" label="CellularCarrierLock:enabled"/>
   <int value="1316142697" label="canvas-2d-layers"/>
   <int value="1316607485" label="MultiProfileAccountConsistency:enabled"/>
   <int value="1316844889" label="ScreenshotsForAndroidV2:disabled"/>
@@ -67289,7 +67522,6 @@
   <int value="1371344350" label="MediaSessionWebRTC:disabled"/>
   <int value="1371907429" label="enable-wallet-card-import"/>
   <int value="1372680885" label="enable-mtp-write-support"/>
-  <int value="1372927890" label="SearchInShortcutsApp:enabled"/>
   <int value="1373777956" label="disable-threaded-gpu-rasterization"/>
   <int value="1374350431" label="WebViewEmptyComponentLoaderPolicy:enabled"/>
   <int value="1375165388" label="LazyFrameLoading:enabled"/>
@@ -67340,7 +67572,6 @@
   <int value="1398333721" label="ForceEnableDevicesPage:disabled"/>
   <int value="1399386367" label="LocalHistoryZeroSuggestBeyondNTP:disabled"/>
   <int value="1399657075" label="IndexedDBCompressValuesWithSnappy:enabled"/>
-  <int value="1399950951" label="AutofillTokenPrefixMatching:disabled"/>
   <int value="1402940985" label="kScrollableTabStripWithDragging:disabled"/>
   <int value="1403195370" label="ArcCupsApi:enabled"/>
   <int value="1403792475" label="ShareMenu:enabled"/>
@@ -67837,6 +68068,7 @@
   <int value="1654949170" label="ArcSwitchToKeyMintOnT:enabled"/>
   <int value="1656768789" label="EnableGetDebugdLogsInParallel:enabled"/>
   <int value="1657713458" label="disable-virtual-keyboard-overscroll"/>
+  <int value="1658361127" label="PerformanceNavigateSystemEntropy:enabled"/>
   <int value="1658644418" label="disable-app-list-voice-search"/>
   <int value="1658656322" label="IncognitoDownloadsWarning:enabled"/>
   <int value="1658676520" label="AsynchronousScannerDiscovery:disabled"/>
@@ -68059,6 +68291,7 @@
   <int value="1762320532" label="AutofillKeyboardAccessory:enabled"/>
   <int value="1762346365"
       label="RevokeNotificationsPermissionIfDisabledOnAppLevel:enabled"/>
+  <int value="1763256921" label="PerformanceNavigateSystemEntropy:disabled"/>
   <int value="1764618580" label="MojoLinuxChannelSharedMem:disabled"/>
   <int value="1765184717"
       label="HighlightManagedPrefDisclaimerAndroid:disabled"/>
@@ -68273,9 +68506,12 @@
   <int value="1854141935" label="EnableCardboard:enabled"/>
   <int value="1854226565" label="AutofillNoLocalSaveOnUnmaskSuccess:enabled"/>
   <int value="1854646491" label="DetailedLanguageSettings:disabled"/>
+  <int value="1855184563"
+      label="EarlyDocumentSwapForBackForwardTransitions:disabled"/>
   <int value="1855524566" label="allow-insecure-websocket-from-https-origin"/>
   <int value="1856270952" label="AutofillAssistantProactiveHelp:disabled"/>
   <int value="1857000695" label="SendWebUIJavaScriptErrorReports:disabled"/>
+  <int value="1858133486" label="UsernameFirstFlowStoreSeveralValues:enabled"/>
   <int value="1858385315" label="ChromeHomeBottomNavLabels:enabled"/>
   <int value="1858523835" label="VerifyDidCommitParams:enabled"/>
   <int value="1859864175" label="AppDeduplicationServiceFondue:enabled"/>
@@ -68315,6 +68551,7 @@
   <int value="1873688130"
       label="ExperimentalAccessibilityDictationMoreCommands:disabled"/>
   <int value="1874050287" label="UploadOfficeToCloud:enabled"/>
+  <int value="1874104910" label="PrivacyGuidePreloadAndroid:disabled"/>
   <int value="1874195462" label="ChromeHomeMenuItemsExpandSheet:disabled"/>
   <int value="1874203133" label="SystemSounds:enabled"/>
   <int value="1874604540" label="UseSuggestionsEvenIfFew:disabled"/>
@@ -68353,6 +68590,7 @@
   <int value="1892201400" label="enable-password-separated-signin-flow"/>
   <int value="1892311584" label="NewStyleNotifications:disabled"/>
   <int value="1892640848" label="third-party-doodle-url"/>
+  <int value="1893163504" label="UsernameFirstFlowStoreSeveralValues:disabled"/>
   <int value="1893317228" label="WebPayments:enabled"/>
   <int value="1893463366" label="EnableHtmlBaseUsernameDetector:enabled"/>
   <int value="1893561439" label="HighEfficiencyModeAvailable:disabled"/>
@@ -68462,6 +68700,7 @@
       label="MagnifierContinuousMouseFollowingModeSetting:disabled"/>
   <int value="1946358032" label="SwapClankShareHubRows:disabled"/>
   <int value="1947350992" label="drop-sync-credential:disabled"/>
+  <int value="1947757329" label="UseDMSAAForTilesAndroidGL:enabled"/>
   <int value="1948509466" label="PasswordChangeAccountStoreUsers:disabled"/>
   <int value="1948753119" label="OmniboxExpandedStateHeight:disabled"/>
   <int value="1948978490" label="PaintPreviewDemo:disabled"/>
@@ -68476,6 +68715,7 @@
   <int value="1951020379" label="ArcRoundedWindowCompat:disabled"/>
   <int value="1951466218" label="enable-data-reduction-proxy-lite-page"/>
   <int value="1951645673" label="PasswordsKeyboardAccessory:disabled"/>
+  <int value="1952183277" label="CrOSLateBootCrOSSOUL:enabled"/>
   <int value="1952339754"
       label="SignedExchangePrefetchCacheForNavigations:enabled"/>
   <int value="1952349593" label="FedCmHostedDomain:disabled"/>
@@ -68546,6 +68786,7 @@
   <int value="1988679118" label="DesktopPWAsSubApps:disabled"/>
   <int value="1988810119" label="AutofillDropdownLayout:enabled"/>
   <int value="1989051182" label="view-passwords:enabled"/>
+  <int value="1989739884" label="CustomizeChromeWallpaperSearch:enabled"/>
   <int value="1989877708" label="PostScriptPrinting:enabled"/>
   <int value="1990528959" label="SchemefulSameSite:disabled"/>
   <int value="1990562608"
@@ -68562,6 +68803,7 @@
       label="enable-experimental-accessibility-switch-access-multistep-automation"/>
   <int value="1993258379" label="enable-icon-ntp"/>
   <int value="1994431722" label="MaterialDesignUserMenu:disabled"/>
+  <int value="1994596820" label="LacrosSharedComponentsDir:enabled"/>
   <int value="1995045836"
       label="AutofillUpstreamAllowAllEmailDomains:disabled"/>
   <int value="1995322219" label="EmojiHandwritingVoiceInput:enabled"/>
@@ -68609,6 +68851,7 @@
   <int value="2009362691" label="AllowStartingServiceManagerOnly:enabled"/>
   <int value="2009697597"
       label="DownloadServiceForegroundSessionIOSFeature:disabled"/>
+  <int value="2013589943" label="CrOSLateBootCrOSSOUL:disabled"/>
   <int value="2013593624"
       label="HappinessTrackingSurveysForDesktopDemo:enabled"/>
   <int value="2014331873" label="NTPDownloadSuggestions:disabled"/>
@@ -68777,6 +69020,8 @@
   <int value="2100547979" label="AdaptiveCharging:enabled"/>
   <int value="2101124624" label="WebUIDownloadShelf:disabled"/>
   <int value="2101151142" label="disable-direct-write"/>
+  <int value="2103384854"
+      label="kNewConfirmationBubbleForGeneratedPasswords:disabled"/>
   <int value="2104245260" label="OmniboxSteadyStateBackgroundColor:disabled"/>
   <int value="2104340988" label="CrostiniUsername:disabled"/>
   <int value="2104439359"
@@ -70548,6 +70793,7 @@
   <int value="767" label="text-autospace"/>
   <int value="768" label="navigation-trigger"/>
   <int value="769" label="dynamic-range-limit"/>
+  <int value="770" label="form-sizing"/>
 </enum>
 
 <enum name="MappedEditingCommands">
@@ -70779,6 +71025,11 @@
   <int value="1" label="Supported"/>
 </enum>
 
+<enum name="MdnsQueryType">
+  <int value="0" label="Initial"/>
+  <int value="1" label="Refresh"/>
+</enum>
+
 <enum name="MdnsResponderServiceError">
   <int value="0" label="Fail to start manager"/>
   <int value="1" label="Fail to create responder"/>
@@ -72025,6 +72276,18 @@
   <int value="4" label="Switch to different webcontents"/>
 </enum>
 
+<enum name="MessageAction">
+  <int value="0" label="Dismiss"/>
+  <int value="1" label="Snooze"/>
+  <int value="2" label="Action"/>
+  <int value="3" label="Cancel"/>
+  <int value="4" label="Timeout"/>
+  <int value="5" label="Abort"/>
+  <int value="6" label="Feature engaged"/>
+  <int value="7" label="Override for UI region conflict"/>
+  <int value="10" label="Override for precedence"/>
+</enum>
+
 <enum name="MessageDismissReason">
   <int value="0" label="Unknown (controlled by client)"/>
   <int value="1" label="Primary action"/>
@@ -72208,6 +72471,9 @@
   <int value="3" label="Migration failed: can't encrypt password with OSCrypt"/>
   <int value="4" label="Migration failed: can't update password value"/>
   <int value="5" label="Migration succeeded"/>
+  <int value="6"
+      label="Migration failed: can't delete missing password from the
+             database"/>
 </enum>
 
 <enum name="MigrationUIFirstScreen">
@@ -72454,6 +72720,25 @@
   <int value="5" label="PLATFORM_FAILURE"/>
 </enum>
 
+<enum name="MobileBookmarkManagerBookmarkRowDisplayPref">
+  <int value="0" label="Compact"/>
+  <int value="1" label="Visual"/>
+</enum>
+
+<enum name="MobileBookmarkManagerBookmarkRowSortOrder">
+  <int value="0" label="Chronological"/>
+  <int value="1" label="Reverse chronological"/>
+  <int value="2" label="Alphabetical"/>
+  <int value="3" label="Reverse alphabetical"/>
+  <int value="4" label="Recently used"/>
+  <int value="5" label="Manual"/>
+</enum>
+
+<enum name="MobileBookmarkManagerFilter">
+  <int value="0" label="Shopping"/>
+  <int value="1" label="Placeholder"/>
+</enum>
+
 <enum name="MobileDefaultBrowserState">
   <int value="0" label="No default"/>
   <int value="1" label="Chrome: System default"/>
@@ -79587,6 +79872,14 @@
   <int value="1" label="Active other profiles."/>
 </enum>
 
+<enum name="OptimizationGuideAccessTokenResult">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Success"/>
+  <int value="2" label="User not signed-in"/>
+  <int value="3" label="Failed with transient error"/>
+  <int value="4" label="Failed with persistent error"/>
+</enum>
+
 <enum name="OptimizationGuideEntityAnnotatorCreationStatus">
   <int value="0" label="Unknown"/>
   <int value="1" label="Success"/>
@@ -79626,6 +79919,29 @@
   <int value="7" label="ErrorCancelled"/>
 </enum>
 
+<enum name="OptimizationGuideFetcherRequestStatus">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Success">Request sent and received response.</int>
+  <int value="2" label="Response Error">
+    Request sent but response not received.
+  </int>
+  <int value="3" label="DEPRECATED - Network Offline">
+    Request not sent because network offline. Deprecated as of 1/2022.
+  </int>
+  <int value="4" label="Fetcher Busy">
+    Request not sent because fetcher busy with another request.
+  </int>
+  <int value="5" label="No Hosts or URLs to Fetch hints">
+    Hints request not sent because no hosts or URLs left after filtering.
+  </int>
+  <int value="6" label="No Supported Optimization Types to Fetch hints">
+    Hints request not sent because there were no supported optimizations types.
+  </int>
+  <int value="7" label="Fetch was canceled">
+    Fetch request was canceled before completion.
+  </int>
+</enum>
+
 <enum name="OptimizationGuideHintCacheLevelDBStoreLoadMetadataResult">
   <int value="0" label="Success"/>
   <int value="1" label="LoadMetadataFailed"/>
@@ -79643,26 +79959,6 @@
   <int value="3" label="Failed"/>
 </enum>
 
-<enum name="OptimizationGuideHintsFetcherRequestStatus">
-  <int value="0" label="Unknown"/>
-  <int value="1" label="Success">Request sent and received response.</int>
-  <int value="2" label="Response Error">
-    Request sent but response not received.
-  </int>
-  <int value="3" label="DEPRECATED - Network Offline">
-    Request not sent because network offline. Deprecated as of 1/2022.
-  </int>
-  <int value="4" label="Fetcher Busy">
-    Request not sent because fetcher busy with another request.
-  </int>
-  <int value="5" label="No Hosts or URLs to Fetch">
-    Request not sent because no hosts or URLs left after filtering.
-  </int>
-  <int value="6" label="No Supported Optimization Types to Fetch">
-    Request not sent because there were no supported optimizations types.
-  </int>
-</enum>
-
 <enum name="OptimizationGuideModelDeliveryEvent">
   <int value="0" label="Unknown"/>
   <int value="1" label="ModelDeliveredAtRegistration">
@@ -80167,6 +80463,7 @@
   <int value="29" label="Deprecated1"/>
   <int value="30" label="PRICE_INSIGHTS"/>
   <int value="31" label="V8_COMPILE_HINTS"/>
+  <int value="32" label="PAGE_INSIGHTS"/>
   <int value="33" label="SHOPPING_PAGE_TYPES"/>
   <int value="34" label="SHOPPING_DISCOUNTS"/>
 </enum>
@@ -80455,6 +80752,7 @@
   <int value="1119" label="Privacy: Lock Screen Notification Switch"/>
   <int value="1120" label="Privacy: Speak-on-mute Detection Software Switch"/>
   <int value="1121" label="Privacy: Local Data Recovery Switch"/>
+  <int value="1122" label="Privacy: Enable/Disable reven hardware data access"/>
   <int value="1200" label="Add Language"/>
   <int value="1201" label="Show Input Options In Shelf"/>
   <int value="1202" label="Show Personal Information Suggestions (Deprecated)"/>
@@ -80468,6 +80766,8 @@
   <int value="1210" label="Show VK Auto-correction"/>
   <int value="1211" label="Show Diacritics"/>
   <int value="1300" label="Google Drive Connection"/>
+  <int value="1301" label="Remove Google Drive access"/>
+  <int value="1302" label="Google Drive File Sync"/>
   <int value="1400" label="Add Printer"/>
   <int value="1401" label="Saved Printers"/>
   <int value="1402" label="Print Jobs"/>
@@ -81044,6 +81344,12 @@
   <int value="11" label="Opened link via context menu"/>
 </enum>
 
+<enum name="OutgoingPasswordSharingInvitationCommitError">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Public key version mismatch"/>
+  <int value="2" label="Not a family member"/>
+</enum>
+
 <enum name="OutputDeviceStatus">
   <int value="0" label="Ok"/>
   <int value="1" label="Not found"/>
@@ -81488,6 +81794,14 @@
   <int value="2" label="Optimization Guide"/>
 </enum>
 
+<enum name="PageImageServiceConsentStatus">
+  <int value="0" label="Success"/>
+  <int value="1" label="Failed">The user is not consented to fetch images.</int>
+  <int value="2" label="Timed out">
+    An image was requested but the request to get the consent status timed out.
+  </int>
+</enum>
+
 <enum name="PageImageServiceResult">
   <int value="0" label="Success"/>
   <int value="1" label="Response missing">
@@ -81813,6 +82127,21 @@
   <int value="8" label="Unknown"/>
 </enum>
 
+<enum name="PageVisitType">
+  <int value="0"
+      label="Independent Visit; the page is opened from UI or in new tab, and
+             not followed by any link navigation."/>
+  <int value="1"
+      label="Origin Visit; the page is opened from UI or in new tab, and
+             followed by a link navigation."/>
+  <int value="2"
+      label="PassingVisit; the page is visited and followed by link
+             navigations."/>
+  <int value="3"
+      label="TerminalVisit; the page is visited by a link navigation, but not
+             followed by any link navigation."/>
+</enum>
+
 <enum name="PageWhitelistingInitiatorCheck">
   <int value="0" label="Initiator absent"/>
   <int value="1" label="Neither candidate matches initiator"/>
@@ -82586,6 +82915,12 @@
   <int value="2" label="User moved or closed the tab, or closed the browser."/>
 </enum>
 
+<enum name="PasswordManager.GroupedPasswordFetchResult">
+  <int value="0" label="No grouped matches"/>
+  <int value="1" label="Grouped matches exist among other matches"/>
+  <int value="2" label="Only grouped matches exist"/>
+</enum>
+
 <enum name="PasswordManager.LoadingDialogOutcome">
   <int value="0" label="Loading finished before dialog">
     The loading dialog was requested but the loading finished before it got
@@ -83740,6 +84075,12 @@
   <int value="12" label="Clicked the link passwords.google.com"/>
 </enum>
 
+<enum name="PasswordMigrationWarningSheetStateAtClosing">
+  <int value="0" label="The sheet was displaying content when it was closed."/>
+  <int value="1" label="An empty sheet was dismissed by user interaction"/>
+  <int value="2" label="An empty sheet was dismissed without user interaction"/>
+</enum>
+
 <enum name="PasswordMigrationWarningTriggers">
   <int value="0" label="Chrome started up"/>
   <int value="1" label="A password was saved or updated"/>
@@ -83758,7 +84099,7 @@
   <int value="4" label="The cancel button was clicked"/>
   <int value="5" label="The sheet with the introduction was dismissed"/>
   <int value="6" label="The sheet with more options was dismissed"/>
-  <int value="7" label="The sheet without content was dismissed"/>
+  <int value="7" label="The sheet without content was dismissed (Obsolete)"/>
 </enum>
 
 <enum name="PasswordNoteAction">
@@ -83777,6 +84118,17 @@
   <int value="4" label="Note did not change"/>
 </enum>
 
+<enum name="PasswordNotesMigrationToOSCryptEnum">
+  <summary>
+    Display migration status of LoginDatabase to OSCrypt on IOS for notes.
+  </summary>
+  <int value="0" label="Migration started"/>
+  <int value="1" label="Migration failed: can't read note from keychain"/>
+  <int value="2" label="Migration failed: can't encrypt note with OSCrypt"/>
+  <int value="3" label="Migration failed: can't update note value"/>
+  <int value="4" label="Migration succeeded"/>
+</enum>
+
 <enum name="PasswordProtectionInterstitialStringType">
   <int value="0" label="Generic string without org name"/>
   <int value="1" label="Generic string with org name"/>
@@ -85763,6 +86115,7 @@
   <int value="46" label="KerberosPrefilledConfig"/>
   <int value="47" label="ThirdPartyStoragePartitioningSettings"/>
   <int value="48" label="MidiSettings"/>
+  <int value="49" label="ProfileSeparation"/>
 </enum>
 
 <enum name="PolicyLoadStatus">
@@ -85774,6 +86127,12 @@
   <int value="2" label="Load Error"/>
 </enum>
 
+<enum name="PolicyTextMessageSuppressionState">
+  <int value="0" label="Unset"/>
+  <int value="1" label="Allow"/>
+  <int value="2" label="Suppress"/>
+</enum>
+
 <enum name="PolicyValidationStatus">
   <obsolete>
     Removed in M91 since the data is not monitored.
@@ -86625,22 +86984,23 @@
 
 <enum name="PreinstalledAppDisabledReason">
   <int value="0" label="kNotDisabled"/>
-  <int value="1" label="kPreinstalledAppsDisabled"/>
-  <int value="2" label="kUserTypeNotAllowed"/>
-  <int value="3" label="kGatedFeatureNotEnabled"/>
-  <int value="4" label="kGatedFeatureNotEnabledAndAppNotInstalled"/>
-  <int value="5" label="kArcAvailable"/>
-  <int value="6" label="kTabletFormFactor"/>
-  <int value="7" label="kNotNewUserAndNotPreviouslyInstalled"/>
-  <int value="8" label="kNotPreviouslyPreinstalled"/>
-  <int value="9" label="kReplacingAppBlockedByPolicy"/>
-  <int value="10" label="kReplacingAppForceInstalled"/>
-  <int value="11" label="kReplacingAppStillInstalled"/>
-  <int value="12" label="kDefaultAppAndAppsToReplaceUninstalled"/>
-  <int value="13" label="kReplacingAppUninstalledByUser"/>
-  <int value="14" label="kStylusRequired"/>
-  <int value="15" label="kPreinstalledAppUninstalledByUserNoOverride"/>
-  <int value="16" label="kStylusRequiredNoDeviceData"/>
+  <int value="1" label="kUninstallPreinstalledAppsNotEnabled"/>
+  <int value="2" label="kUninstallUserTypeNotAllowed"/>
+  <int value="3" label="kUninstallGatedFeatureNotEnabled"/>
+  <int value="4" label="kIgnoreGatedFeatureNotEnabled"/>
+  <int value="5" label="kIgnoreArcAvailable"/>
+  <int value="6" label="kIgnoreTabletFormFactor"/>
+  <int value="7" label="kIgnoreNotNewUser"/>
+  <int value="8" label="kIgnoreNotPreviouslyPreinstalled"/>
+  <int value="9" label="kUninstallReplacingAppBlockedByPolicy"/>
+  <int value="10" label="kUninstallReplacingAppForceInstalled"/>
+  <int value="11" label="kInstallReplacingAppStillInstalled"/>
+  <int value="12" label="kUninstallDefaultAppAndAppsToReplaceUninstalled"/>
+  <int value="13" label="kIgnoreReplacingAppUninstalledByUser"/>
+  <int value="14" label="kIgnoreStylusRequired"/>
+  <int value="15" label="kInstallOverridePreviousUserUninstall"/>
+  <int value="16" label="kIgnoreStylusRequiredNoDeviceData"/>
+  <int value="17" label="kIgnorePreviouslyUninstalledByUser"/>
 </enum>
 
 <enum name="PreloadBookmarkMetricsEvent">
@@ -87906,6 +88266,7 @@
   </summary>
   <int value="-2066290458" label="search.mojom.EmbeddedSearchConnector"/>
   <int value="-2012727489" label="device.mojom.ScreenOrientation"/>
+  <int value="-1398143678" label="blink.mojom.ClipboardHost (Unexpected)"/>
   <int value="-1354302262" label="blink.mojom.BackForwardCacheControllerHost"/>
   <int value="-71187962" label="supervised_user.mojom.SupervisedUserCommands"/>
   <int value="-4973921" label="blink.mojom.AttributionHost"/>
@@ -88082,7 +88443,7 @@
   <int value="18" label="kNavigationBadHttpStatus"/>
   <int value="19" label="kClientCertRequested"/>
   <int value="20" label="kNavigationRequestNetworkFailure"/>
-  <int value="21" label="kMaxNumOfRunningPrerendersExceeded"/>
+  <int value="21" label="kMaxNumOfRunningPrerendersExceeded (obsoleted)"/>
   <int value="22" label="kCancelAllHostsForTesting"/>
   <int value="23" label="kDidFailLoad"/>
   <int value="24" label="kStop"/>
@@ -88100,7 +88461,7 @@
       label="kEmbedderTriggeredAndCrossOriginRedirected (obsoleted)"/>
   <int value="35" label="kEmbedderTriggeredAndDestroyed (obsoleted)"/>
   <int value="36" label="kMemoryLimitExceeded"/>
-  <int value="37" label="kFailToGetMemoryUsage"/>
+  <int value="37" label="kFailToGetMemoryUsage (obsoleted)"/>
   <int value="38" label="kDataSaverEnabled"/>
   <int value="39" label="kHasEffectiveUrl"/>
   <int value="40" label="kActivatedBeforeStarted"/>
@@ -88142,6 +88503,9 @@
   <int value="70" label="kResourceLoadBlockedByClient"/>
   <int value="71" label="kSpeculationRuleRemoved"/>
   <int value="72" label="kActivatedWithAuxiliaryBrowsingContexts"/>
+  <int value="73" label="kMaxNumOfRunningEagerPrerendersExceeded"/>
+  <int value="74" label="kMaxNumOfRunningNonEagerPrerendersExceeded"/>
+  <int value="75" label="kMaxNumOfRunningEmbedderPrerendersExceeded"/>
 </enum>
 
 <enum name="PrerenderHoverEvent">
@@ -89153,14 +89517,21 @@
   <int value="3" label="Failed to create directory"/>
 </enum>
 
-<enum name="PrivacySandboxPrivateAggregationHostSendHistogramReportResult">
-  <int value="0" label="Success"/>
-  <int value="1" label="API disabled in settings"/>
-  <int value="2" label="Success but truncated due to too many contributions"/>
-  <int value="3" label="Debug key present but debug mode not enabled"/>
-  <int value="4" label="Report request creation failed"/>
+<enum name="PrivacySandboxPrivateAggregationHostPipeResult">
+  <int value="0" label="Report success"/>
+  <int value="1"
+      label="Report success but truncated due to too many contributions"/>
+  <int value="2" label="No report, but no error"/>
+  <int value="3" label="API disabled in settings"/>
+  <int value="4" label="Enable debug mode called multiple times"/>
   <int value="5" label="Negative value"/>
-  <int value="6" label="Pipe with context ID reused"/>
+</enum>
+
+<enum name="PrivacySandboxPrivateAggregationHostTimeoutResult">
+  <int value="0" label="Occurred before remote disconnection"/>
+  <int value="1" label="Occurred after remote disconnection"/>
+  <int value="2" label="Canceled due to error"/>
+  <int value="3" label="Still scheduled on shutdown"/>
 </enum>
 
 <enum name="PrivacySandboxReferrer">
@@ -89775,6 +90146,7 @@
   <int value="32" label="kProfileDeletionProcess"/>
   <int value="33" label="kProfileStatistics"/>
   <int value="34" label="kIsolatedWebAppInstall"/>
+  <int value="35" label="kWebAppUninstall"/>
 </enum>
 
 <enum name="ProfileMenuActionableItem">
@@ -89975,6 +90347,9 @@
       label="The flow was skipped because the profile is already syncing."/>
   <int value="14"
       label="The flow was skipped due to the value of some policy(ies)."/>
+  <int value="15"
+      label="The flow got aborted after sync was declined while sign-in is
+             forced by policies."/>
 </enum>
 
 <enum name="ProfileSignInStatus">
@@ -91403,6 +91778,27 @@
   <int value="5" label="Fido Assertion"/>
 </enum>
 
+<enum name="QuickStartScreenName">
+  <int value="0" label="Other"/>
+  <int value="1" label="None"/>
+  <int value="2" label="Welcome Screen"/>
+  <int value="3" label="Network Screen"/>
+  <int value="4" label="Gaia Screen"/>
+  <int value="5" label="Setup Android Phone with Quick Start"/>
+  <int value="6" label="Connecting to Wifi with Quick Start"/>
+  <int value="7"
+      label="Checking for Update and Determining Device Configuration"/>
+  <int value="8" label="Choose Chromebook Setup"/>
+  <int value="9" label="Installing Latest Update"/>
+  <int value="10" label="Resuming Connection After Update"/>
+  <int value="11" label="Getting Google Account Info"/>
+  <int value="12" label="Quick Start Complete"/>
+  <int value="13" label="Setup Device PIN"/>
+  <int value="14" label="Ask for Parent Permission"/>
+  <int value="15" label="Review Privacy and Terms"/>
+  <int value="16" label="Unified Setup"/>
+</enum>
+
 <enum name="QuickStartWifiTransferResultFailureReason">
   <int value="0" label="Connection dropped while attempting transfer"/>
   <int value="1" label="Empty response bytes"/>
@@ -94213,6 +94609,13 @@
   <int value="3" label="Not populated due to SB pref changing"/>
 </enum>
 
+<enum name="SafeBrowsingOhttpFetchKeyTriggerReason">
+  <int value="0" label="DuringHashRealTimeLookup"/>
+  <int value="1" label="AsyncFetch"/>
+  <int value="2" label="KeyRelatedHttpErrorCode"/>
+  <int value="3" label="KeyRotatedHeader"/>
+</enum>
+
 <enum name="SafeBrowsingPageLoadTokenClearReason">
   <int value="0" label="Safe Browsing state changed"/>
   <int value="1" label="Cookies deleted"/>
@@ -94303,6 +94706,15 @@
   <int value="5" label="ClosedByAnotherDialog"/>
 </enum>
 
+<enum name="SafeBrowsingTailoredSecurityShouldRetryOutcome">
+  <int value="0" label="UnknownType"/>
+  <int value="1" label="RetryNeededDoRetry"/>
+  <int value="2" label="RetryNeededKeepWaiting"/>
+  <int value="3" label="UnsetInitializeWaitingPeriod"/>
+  <int value="4" label="UnsetRetryBecauseDoneWaiting"/>
+  <int value="5" label="UnsetStillWaiting"/>
+</enum>
+
 <enum name="SafeBrowsingUrlScheme">
   <int value="0" label="Unknown scheme"/>
   <int value="1" label="about"/>
@@ -96110,6 +96522,14 @@
   <int value="33" label="NONE"/>
 </enum>
 
+<enum name="SearchEngineChoiceScreenEvents">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Choice Screen Was Displayed"/>
+  <int value="2" label="FRE Choice Screen Was Displayed"/>
+  <int value="3" label="Default Was Set"/>
+  <int value="4" label="FRE Default Was Set"/>
+</enum>
+
 <enum name="SearchEntryPoint">
   <int value="0" label="From search widget"/>
   <int value="1" label="From omnibox"/>
@@ -96494,6 +96914,7 @@
   <int value="0" label="Model handler created"/>
   <int value="1" label="Model available"/>
   <int value="2" label="Model metadata invalid"/>
+  <int value="3" label="Model not available"/>
 </enum>
 
 <enum name="SegmentationPlatformFeatureProcessingError">
@@ -97161,6 +97582,8 @@
 <enum name="ServiceWorkerRouterSourceType">
   <int value="0" label="kNetwork"/>
   <int value="1" label="kRace"/>
+  <int value="2" label="kFetchEvent"/>
+  <int value="3" label="kCache"/>
 </enum>
 
 <enum name="ServiceWorkerSite">
@@ -99231,6 +99654,16 @@
     (eg. using history sync promo in recent tabs), but declined history sync
     eventually.
   </int>
+  <int value="28" label="Device lock removed on automotive">
+    If the device lock is removed from an Android automotive device, the current
+    account is automatically signed out.
+  </int>
+  <int value="29" label="User turned off sync from the settings page">
+    User has signed-in previously and sync was turned on. This value is
+    recoreded when the user explicitly turns off sync from the settings page by
+    pressing &quot;Turn off&quot; in the &quot;Sync and Google services&quot;
+    section.
+  </int>
 </enum>
 
 <enum name="SigninSSOIdentityListRequestCacheState">
@@ -99550,6 +99983,18 @@
   <int value="2" label="Spec compliant"/>
 </enum>
 
+<enum name="SingleUsernameVoteDataAvailability">
+  <summary>
+    Whether two existing single username detection mechanisms (UFF and FPF) have
+    data, overlapping or not.
+  </summary>
+  <int value="0" label="None"/>
+  <int value="1" label="Username First only."/>
+  <int value="2" label="Forgot password only."/>
+  <int value="3" label="Both, but for different forms."/>
+  <int value="4" label="Both, and FPF data contains UFF candidate field."/>
+</enum>
+
 <enum name="SingleWebFeedEntryPoint">
   <int value="0" label="Menu"/>
   <int value="1" label="Attribtuion"/>
@@ -103178,7 +103623,7 @@
   <int value="100163" label="PerformanceTracingEnabled"/>
   <int value="100164" label="PluginsAlwaysOpenPdfExternally"/>
   <int value="100165" label="PrivacySandboxApisEnabled"/>
-  <int value="100166" label="PrivacySandboxFirstPartySetsEnabled"/>
+  <int value="100166" label="PrivacySandboxRelatedWebsiteSetsEnabled"/>
   <int value="100167" label="PrivacySandboxManuallyControlled"/>
   <int value="100168" label="PromptForDownload"/>
   <int value="100169" label="ProtectedContentDefault"/>
@@ -103228,6 +103673,11 @@
   <int value="100220" label="BrowserColorVariant"/>
   <int value="100221" label="GrayscaleThemeEnabled"/>
   <int value="100222" label="UserColor"/>
+  <int value="100223" label="BlockAll3pcToggleEnabled"/>
+  <int value="100224" label="TrackingProtectionLevel"/>
+  <int value="100225" label="UserSpeakOnMuteDetectionEnabled"/>
+  <int value="100226" label="ShouldShowSpeakOnMuteOptInNudge"/>
+  <int value="100227" label="SpeakOnMuteOptInNudgeShownCount"/>
   <int value="200000" label="ArticlesForYouEnabled"/>
   <int value="200001" label="ContextualSearchEnabled_IOS"/>
   <int value="200002" label="DefaultCharset_IOS"/>
@@ -103848,6 +104298,12 @@
       label="Notes field is set only in the backup but not decryptable"/>
 </enum>
 
+<enum name="SyncPlaceholderTabResyncResult">
+  <int value="0" label="PLACEHOLDER_TAB_FOUND"/>
+  <int value="1" label="PLACEHOLDER_TAB_RESYNCED"/>
+  <int value="2" label="PLACEHOLDER_TAB_NOT_SYNCED"/>
+</enum>
+
 <enum name="SyncPositioningScheme">
   <int value="0" label="UNIQUE_POSITION"/>
   <int value="1" label="POSITION_IN_PARENT"/>
@@ -107006,16 +107462,21 @@
   <int value="16" label="kSafeBrowsingIncidentReportSent"/>
   <int value="17" label="kSyncRemainingRollbackTries"/>
   <int value="18" label="kSafeBrowsingIncidentsSent"/>
-  <int value="19" label="kSwReporterPromptVersion"/>
-  <int value="20" label="kSwReporterPromptReason"/>
+  <int value="19" label="kSwReporterPromptVersion (Obsolete 9/2023)"/>
+  <int value="20" label="kSwReporterPromptReason (Obsolete 9/2023)"/>
   <int value="21" label="kGoogleServicesUsername (Obsolete 9/2019)"/>
-  <int value="22" label="kSwReporterPromptSeed"/>
+  <int value="22" label="kSwReporterPromptSeed (Obsolete 9/2023)"/>
   <int value="23" label="kGoogleServicesAccountId"/>
   <int value="24" label="kGoogleServicesLastAccountId"/>
-  <int value="25" label="kSettingsResetPromptPromptWave"/>
-  <int value="26" label="kSettingsResetPromptLastTriggeredForDefaultSearch"/>
-  <int value="27" label="kSettingsResetPromptLastTriggeredForStartupUrls"/>
-  <int value="28" label="kSettingsResetPromptLastTriggeredForHomepage"/>
+  <int value="25" label="kSettingsResetPromptPromptWave (Obsolete 9/2023)"/>
+  <int value="26"
+      label="kSettingsResetPromptLastTriggeredForDefaultSearch (Obsolete
+             9/2023)"/>
+  <int value="27"
+      label="kSettingsResetPromptLastTriggeredForStartupUrls (Obsolete
+             9/2023)"/>
+  <int value="28"
+      label="kSettingsResetPromptLastTriggeredForHomepage (Obsolete 9/2023)"/>
   <int value="29" label="kMediaStorageIdSalt"/>
   <int value="30" label="kModuleBlocklistCacheMD5Digest"/>
   <int value="32" label="kMediaCdmOriginData"/>
@@ -107915,6 +108376,7 @@
   <int value="17" label="Privacy Sandbox 4 Notice Ok"/>
   <int value="18" label="Privacy Sandbox 4 Notice Settings"/>
   <int value="19" label="Safe Browsing Interstitial"/>
+  <int value="20" label="Download Warning UI"/>
 </enum>
 
 <enum name="TrustTokenRequestHelperFactoryOutcome">
@@ -109251,6 +109713,11 @@
   <int value="12" label="User Events"/>
 </enum>
 
+<enum name="UserTextMessageSuppressionState">
+  <int value="0" label="Allow"/>
+  <int value="1" label="Suppress"/>
+</enum>
+
 <enum name="UserType">
   <int value="0" label="Regular"/>
   <int value="1" label="Guest"/>
@@ -109453,6 +109920,12 @@
   <int value="7" label="INVALID_HEADER">Invalid header</int>
 </enum>
 
+<enum name="V8CompileHintsModelQuality">
+  <int value="0" label="No model"/>
+  <int value="1" label="Bad model"/>
+  <int value="2" label="Good model"/>
+</enum>
+
 <enum name="V8DebugFeature">
   <int value="1" label="kActive">Debugger has been active</int>
   <int value="2" label="kBreakPoint">
@@ -115034,6 +115507,7 @@
   <int value="2" label="kQuickSettings"/>
   <int value="3" label="kSearch"/>
   <int value="4" label="kSettingsApp"/>
+  <int value="5" label="kExploreApp"/>
 </enum>
 
 <enum name="WelcomeTourPreventedReason">
@@ -115465,6 +115939,12 @@
   <int value="3" label="FailedNoArcAppLaunchHandler"/>
 </enum>
 
+<enum name="WindowPredictorUseCase">
+  <int value="0" label="ArcNotReady"/>
+  <int value="1" label="InstanceResponse"/>
+  <int value="2" label="ArcVmmSwapped"/>
+</enum>
+
 <enum name="WindowsDriveType">
   <int value="0" label="DRIVE_UNKNOWN"/>
   <int value="1" label="DRIVE_NO_ROOT_DIR"/>
@@ -117322,6 +117802,7 @@
   <int value="78" label="Payment methods"/>
   <int value="79" label="Addresses and more"/>
   <int value="80" label="Switch directly to other profile"/>
+  <int value="81" label="Show search companion"/>
 </enum>
 
 <enum name="WrongConfigurationMetric">
diff --git a/tools/metrics/histograms/generate_expired_histograms_array.py b/tools/metrics/histograms/generate_expired_histograms_array.py
index ec5a5c59..bcf026e 100755
--- a/tools/metrics/histograms/generate_expired_histograms_array.py
+++ b/tools/metrics/histograms/generate_expired_histograms_array.py
@@ -35,8 +35,6 @@
 {hashes}
 }};
 
-const size_t kNumExpiredHistograms = {hashes_size};
-
 }}  // namespace {namespace}
 
 #endif  // {include_guard}
@@ -181,13 +179,11 @@
       "  {hash},  // {name}".format(hash=value, name=histograms_map[value])
       for value in sorted(histograms_map.keys())
   ])
-  return _HEADER.format(
-      script_name=_SCRIPT_NAME,
-      include_guard=include_guard,
-      namespace=namespace,
-      hash_datatype=_HASH_DATATYPE,
-      hashes=hashes,
-      hashes_size=len(histograms_map))
+  return _HEADER.format(script_name=_SCRIPT_NAME,
+                        include_guard=include_guard,
+                        namespace=namespace,
+                        hash_datatype=_HASH_DATATYPE,
+                        hashes=hashes)
 
 
 def _GenerateFileContent(descriptions, branch_file_content,
diff --git a/tools/metrics/histograms/generate_expired_histograms_array_unittest.py b/tools/metrics/histograms/generate_expired_histograms_array_unittest.py
index 68375c2..56341ee 100755
--- a/tools/metrics/histograms/generate_expired_histograms_array_unittest.py
+++ b/tools/metrics/histograms/generate_expired_histograms_array_unittest.py
@@ -32,16 +32,12 @@
   0x0557fa92,  // Back
   0x290eb683,  // NewTab
   0x67d2f674,  // Forward
-};
-
-const size_t kNumExpiredHistograms = 3;""")
+};""")
 
 _EXPECTED_EMPTY_ARRAY_DEFINITION = (
     """const uint32_t kExpiredHistogramsHashes[] = {
   0x00000000,  // Dummy.Histogram
-};
-
-const size_t kNumExpiredHistograms = 1;""")
+};""")
 
 
 class ExpiredHistogramsTest(unittest.TestCase):
diff --git a/tools/metrics/histograms/histograms_index.txt b/tools/metrics/histograms/histograms_index.txt
index 5c442b0..c6c24dc9 100644
--- a/tools/metrics/histograms/histograms_index.txt
+++ b/tools/metrics/histograms/histograms_index.txt
@@ -40,7 +40,6 @@
 tools/metrics/histograms/metadata/data/histograms.xml
 tools/metrics/histograms/metadata/dev/histograms.xml
 tools/metrics/histograms/metadata/diagnostics/histograms.xml
-tools/metrics/histograms/metadata/direct/histograms.xml
 tools/metrics/histograms/metadata/disk/histograms.xml
 tools/metrics/histograms/metadata/download/histograms.xml
 tools/metrics/histograms/metadata/enterprise/histograms.xml
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml
index 3f195180..c9b6c207 100644
--- a/tools/metrics/histograms/metadata/accessibility/histograms.xml
+++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -516,7 +516,7 @@
 </histogram>
 
 <histogram name="Accessibility.ATK-APIs" enum="AccessibilityATKAPIEnum"
-    expires_after="2023-11-30">
+    expires_after="2024-03-10">
   <owner>jdiggs@chromium.org</owner>
   <owner>jkim@igalia.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -557,6 +557,16 @@
   </summary>
 </histogram>
 
+<histogram name="Accessibility.Bundle" enum="AccessibilityModeBundleEnum"
+    expires_after="2024-02-01">
+  <owner>kevers@chromium.org</owner>
+  <owner>chrome-a11y-core@chromium.org</owner>
+  <summary>
+    Tracks when combinations of mode flags are set. Records when the mode flag
+    changes and aligns with one of the common (named) flag bundles.
+  </summary>
+</histogram>
+
 <histogram name="Accessibility.CaptionSettingsLoadedFromPrefs"
     enum="BooleanEnabled" expires_after="2024-08-07">
   <owner>evliu@google.com</owner>
@@ -2230,7 +2240,7 @@
 </histogram>
 
 <histogram name="Accessibility.ScreenAI.VisualAnnotator.NodesCount"
-    units="count" expires_after="2023-11-30">
+    units="count" expires_after="2024-03-10">
   <owner>kyungjunlee@google.com</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
@@ -2449,7 +2459,7 @@
 </histogram>
 
 <histogram name="DomDistiller.ReaderShownForPageLoad" enum="Boolean"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>mdjones@chromium.org</owner>
   <summary>
     Records if the panel became visible at any point after a page was navigated.
diff --git a/tools/metrics/histograms/metadata/account_manager/histograms.xml b/tools/metrics/histograms/metadata/account_manager/histograms.xml
index 1535599..a6e65af 100644
--- a/tools/metrics/histograms/metadata/account_manager/histograms.xml
+++ b/tools/metrics/histograms/metadata/account_manager/histograms.xml
@@ -37,7 +37,7 @@
 </histogram>
 
 <histogram name="AccountManager.AccountAdditionSource"
-    enum="AccountManagerAccountAdditionSource" expires_after="2023-12-31">
+    enum="AccountManagerAccountAdditionSource" expires_after="2024-03-03">
   <owner>sinhak@chromium.org</owner>
   <owner>anastasiian@chromium.org</owner>
   <summary>
@@ -160,7 +160,7 @@
 </histogram>
 
 <histogram name="AccountManager.NumAccounts" units="count"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>sinhak@chromium.org</owner>
   <owner>anastasiian@chromium.org</owner>
   <summary>
@@ -170,7 +170,7 @@
 </histogram>
 
 <histogram name="AccountManager.ReportAuthError.IsAccountKeyEmpty"
-    enum="BooleanEmpty" expires_after="2023-12-31">
+    enum="BooleanEmpty" expires_after="2024-03-03">
   <owner>sinhak@chromium.org</owner>
   <owner>anastasiian@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index 58dbc095..d031ed3 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -211,7 +211,7 @@
 </histogram>
 
 <histogram name="Android.AdaptiveToolbarButton.Clicked"
-    enum="AdaptiveToolbarButtonVariant" expires_after="2024-01-07">
+    enum="AdaptiveToolbarButtonVariant" expires_after="2024-03-10">
   <owner>bttk@chromium.org</owner>
   <owner>chrome-segmentation-platform@google.com</owner>
   <summary>
@@ -221,7 +221,7 @@
 </histogram>
 
 <histogram name="Android.AdaptiveToolbarButton.SessionVariant"
-    enum="AdaptiveToolbarButtonVariant" expires_after="2024-01-07">
+    enum="AdaptiveToolbarButtonVariant" expires_after="2024-03-10">
   <owner>bttk@chromium.org</owner>
   <owner>chrome-segmentation-platform@google.com</owner>
   <summary>
@@ -300,23 +300,6 @@
   </summary>
 </histogram>
 
-<histogram name="Android.AppLaunch.DurationDrawWasBlocked" units="ms"
-    expires_after="2022-08-21">
-  <obsolete>
-    Removed 03/2022. Superseded by
-    Android.AppLaunch.DurationDrawWasBlocked.OnInitialTab
-  </obsolete>
-  <owner>sinansahin@google.com</owner>
-  <owner>twellington@chromium.org</owner>
-  <owner>skym@chromium.org</owner>
-  <owner>clank-app-team@google.com</owner>
-  <summary>
-    Records how long the initial tab's draw was blocked, if it was. Recorded
-    when the active tab is restored or an initial tab is created in
-    ChromeTabbedActivity.
-  </summary>
-</histogram>
-
 <histogram name="Android.AppLaunch.DurationDrawWasBlocked.OnIncognitoReauth"
     units="ms" expires_after="2024-02-11">
   <owner>roagarwal@chromium.org</owner>
@@ -530,7 +513,7 @@
 </histogram>
 
 <histogram name="Android.BackPress.Intercept" enum="BackPressConsumer"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>lazzzis@chromium.org</owner>
   <owner>src/chrome/browser/back_press/android/OWNERS</owner>
   <summary>
@@ -539,7 +522,7 @@
 </histogram>
 
 <histogram name="Android.BackPress.Interval" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>lazzzis@chromium.org</owner>
   <owner>src/chrome/browser/back_press/android/OWNERS</owner>
   <summary>
@@ -549,7 +532,7 @@
 </histogram>
 
 <histogram name="Android.BackPress.MinimizeAppAndCloseTab"
-    enum="MinimizeAppAndCloseTabType" expires_after="2024-01-07">
+    enum="MinimizeAppAndCloseTabType" expires_after="2024-03-10">
   <owner>lazzzis@chromium.org</owner>
   <owner>src/chrome/browser/back_press/android/OWNERS</owner>
   <summary>
@@ -559,7 +542,7 @@
 </histogram>
 
 <histogram name="Android.BackPress.SecondaryActivity" enum="SecondaryActivity"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>lazzzis@chromium.org</owner>
   <owner>src/chrome/browser/back_press/android/OWNERS</owner>
   <summary>
@@ -758,6 +741,16 @@
   </summary>
 </histogram>
 
+<histogram name="Android.ContactsPicker.PropertiesUserRejected"
+    enum="ContactsPickerProperties" expires_after="2024-06-01">
+  <owner>finnur@chromium.org</owner>
+  <owner>twellington@chromium.org</owner>
+  <summary>
+    The contact properties requested by the website but rejected by the user.
+    Measured once when the Contacts Picker dialog is dismissed.
+  </summary>
+</histogram>
+
 <histogram name="Android.ContactsPicker.SelectCount" units="Contacts"
     expires_after="2024-06-01">
   <owner>finnur@chromium.org</owner>
@@ -1578,6 +1571,53 @@
   <token key="ActivityType" variants="ActivityType"/>
 </histogram>
 
+<histogram name="Android.FrameTimelineJank.WebScroll.FrameJankStatus"
+    enum="FrameJankStatus" expires_after="2024-04-30">
+  <owner>kartarsingh@chromium.org</owner>
+  <owner>woa-performance@google.com</owner>
+  <summary>
+    Note: This metric doesn't capture web contents scrolling quality on chrome,
+    it is only emitted on Webview. For scroll jank metrics in chrome please
+    check Event.ScrollJank.DelayedFramesPercentage* and
+    Event.ScrollJank.MissedVsyncs* histograms.
+
+    This metric measures jankiness of frames during scrolls according to the
+    Android's FrameMetrics API. Samples are recorded into the Janky bucket for
+    frames for which their total duration exceeded the given deadline and into
+    the NonJanky bucket for all other frames. This metric is recorded at the
+    same time as Android.Jank.FrameDuration histogram.
+
+    Known caveats of this metric: 1) During a staggered scroll where finger
+    could be stationary for some time, any janks during the period when finger
+    was stationary would still be marked as scroll janks even when we wouldn't
+    have been producing frames during that time.
+  </summary>
+</histogram>
+
+<histogram base="true"
+    name="Android.GridTabSwitcher.Animation.FirstFrameLatency" units="ms"
+    expires_after="2024-07-25">
+  <owner>ckitagawa@chromium.org</owner>
+  <owner>clank-isochron-team@google.com</owner>
+  <summary>
+    This histogram records the time taken between the tab and tab switcher
+    layout. Timing starts when the layout transition begins and ends on the
+    first frame. This is recorded each time the layout transition animation
+    occurs.
+  </summary>
+</histogram>
+
+<histogram base="true" name="Android.GridTabSwitcher.Animation.TotalDuration"
+    units="ms" expires_after="2024-07-25">
+  <owner>ckitagawa@chromium.org</owner>
+  <owner>clank-isochron-team@google.com</owner>
+  <summary>
+    This histogram records the time taken between the tab and tab switcher
+    layout. Timing starts when the layout transition begins and ends on the last
+    frame. This is recorded each time the layout transition animation occurs.
+  </summary>
+</histogram>
+
 <histogram name="Android.GridTabSwitcher.ThumbnailFetchingResult"
     enum="GridTabSwitcherThumbnailFetchingResult" expires_after="2024-02-25">
   <owner>ckitagawa@chromium.org</owner>
@@ -2319,14 +2359,12 @@
   <owner>mpearson@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <summary>
-    Records time spent on positioning all suggestions on screen. This histogram
-    is recorded every time a new suggestion list is received.
+    Records thread time spent on positioning all suggestions on screen. This
+    histogram is recorded every time a new suggestion list is received.
 
-    Values recorded here should generally aim to be small, likely below 2ms
-    range. Higher values are an indicator of a performance problem.
-
-    Layout operation should take place just once when suggestion view is shown
-    for the first time.
+    Smaller values are indicative of better performance, but the time taken
+    varies considerably based on, e.g. whether new views need to be inflated and
+    the number of suggestions being rendered.
 
     This metric is reported for all users and uses 100microsecond granularity.
 
@@ -2340,6 +2378,29 @@
   </summary>
 </histogram>
 
+<histogram name="Android.Omnibox.SuggestionList.LayoutTime3" units="ms"
+    expires_after="2024-09-13">
+  <owner>ender@chromium.org</owner>
+  <owner>pnoland@chromium.org</owner>
+  <owner>gangwu@chromium.org</owner>
+  <summary>
+    Replacement for Android.Omnibox.SuggestionList.LayoutTime2 that uses wall
+    time instead of thread time. Records wall time spent positioning suggestion
+    view onto the screen. This histogram is recorded every time a new suggestion
+    list is received, which is typically multiple times per keystroke.
+
+    This metric is reported for all users and uses 1ms granularity.
+
+    When comparing durations measured here, also compare Total Counts for a
+    correct indication of how frequently views are laid out and how the overall
+    time spent performing layout operation changed.
+
+    This histogram is related to Android.Omnibox.SuggestionList.LayoutTime2,
+    Android.Omnibox.SuggestionView.CreateTime3, and
+    Android.Omnibox.SuggestionList.MeasureTime3
+  </summary>
+</histogram>
+
 <histogram name="Android.Omnibox.SuggestionList.MeasureTime" units="ms"
     expires_after="2022-06-19">
   <obsolete>
@@ -2399,6 +2460,30 @@
   </summary>
 </histogram>
 
+<histogram name="Android.Omnibox.SuggestionList.MeasureTime3" units="ms"
+    expires_after="2024-09-13">
+  <owner>ender@chromium.org</owner>
+  <owner>pnoland@chromium.org</owner>
+  <owner>gangwu@chromium.org</owner>
+  <summary>
+    Replacement for Android.Omnibox.SuggestionList.MeasureTime2 that uses wall
+    time instead of thread time. Records wall time spent on measuring all
+    suggestions ahead of positioning them on screen. This histogram is recorded
+    every time a new suggestion list is received, which is typically multiple
+    times per keystroke.
+
+    This metric is reported for all users and uses 1ms granularity.
+
+    When comparing durations measured here, also compare Total Counts for a
+    correct indication of how frequently views are laid out and how the overall
+    time spent performing layout operation changed.
+
+    This histogram is related to Android.Omnibox.SuggestionList.MeasureTime2,
+    Android.Omnibox.SuggestionView.CreateTime3, and
+    Android.Omnibox.SuggestionList.LayoutTime3
+  </summary>
+</histogram>
+
 <histogram name="Android.Omnibox.SuggestionList.RequestToUiModel.First"
     units="ms" expires_after="2024-02-25">
   <owner>ender@google.com</owner>
@@ -2526,6 +2611,29 @@
   </summary>
 </histogram>
 
+<histogram name="Android.Omnibox.SuggestionView.CreateTime3" units="ms"
+    expires_after="2024-09-13">
+  <owner>ender@chromium.org</owner>
+  <owner>pnoland@chromium.org</owner>
+  <owner>gangwu@chromium.org</owner>
+  <summary>
+    Replacement for Android.Omnibox.SuggestionList.CreateTime2 that uses wall
+    time instead of thread time. Records wall time spent on creating a single
+    suggestion view. This histogram is recorded every time a new view is
+    created, but not when a view is recycled.
+
+    This metric is reported for all users and uses 1ms granularity.
+
+    When comparing Durations measured here, also compare Total Counts for a
+    correct indication of how frequently views are created and how the overall
+    time spent creating views changed.
+
+    This histogram is related to Android.Omnibox.SuggestionView.CreateTime2,
+    Android.Omnibox.SuggestionList.LayoutTime3, and
+    Android.Omnibox.SuggestionList.MeasureTime3
+  </summary>
+</histogram>
+
 <histogram name="Android.Omnibox.SuggestionView.Reused" enum="BooleanReused"
     expires_after="M110">
   <obsolete>
@@ -3663,7 +3771,7 @@
 </histogram>
 
 <histogram name="Android.SelectFileDialogContentSelected"
-    enum="SelectFileDialogContent" expires_after="2024-01-07">
+    enum="SelectFileDialogContent" expires_after="2024-03-10">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -3675,7 +3783,7 @@
 </histogram>
 
 <histogram name="Android.SelectFileDialogImgCount" units="images"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -3687,7 +3795,7 @@
 </histogram>
 
 <histogram name="Android.SelectFileDialogScope" enum="SelectFileDialogScope"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>peter@chromium.org</owner>
   <owner>finnur@chromium.org</owner>
   <summary>
@@ -4004,7 +4112,7 @@
 </histogram>
 
 <histogram name="Android.TabStrip.DelayTempStripRemovalTimedOut"
-    enum="BooleanTimedOut" expires_after="2023-12-31">
+    enum="BooleanTimedOut" expires_after="2024-03-03">
   <owner>nemco@google.com</owner>
   <owner>skavuluru@google.com</owner>
   <owner>twellington@chromium.org</owner>
@@ -4103,7 +4211,7 @@
 </histogram>
 
 <histogram name="Android.TabStrip.TimeToBufferSwapAfterInitializeTabState"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>nemco@google.com</owner>
   <owner>skavuluru@google.com</owner>
   <owner>twellington@chromium.org</owner>
@@ -4118,7 +4226,7 @@
 </histogram>
 
 <histogram name="Android.TabStrip.TimeToInitializeTabStateAfterBufferSwap"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>nemco@google.com</owner>
   <owner>skavuluru@google.com</owner>
   <owner>twellington@chromium.org</owner>
@@ -4179,6 +4287,19 @@
   </summary>
 </histogram>
 
+<histogram name="Android.TabSwitcher.TabHidden" units="boolean"
+    expires_after="2023-12-24">
+  <owner>ckitagawa@chromium.org</owner>
+  <owner>clank-isochron-team@google.com</owner>
+  <summary>
+    This histogram records whether the foreground tab was hidden after the tab
+    switcher was shown. This operation is recorded when the foreground tab is
+    attempted to be hidden after its use in animation and thumbnail capture is
+    finished. A value of true indicates the tab was hidden and a value of false
+    indicates the operation was cancelled.
+  </summary>
+</histogram>
+
 <histogram name="Android.ThumbnailCache.InMemoryApproximationCacheEntries"
     units="thumbnails" expires_after="2024-02-04">
   <owner>ckitagawa@chromium.org</owner>
@@ -4944,6 +5065,80 @@
   </summary>
 </histogram>
 
+<histogram name="Android.WebView.HistoricalApplicationExitInfo.Counts"
+    enum="AndroidProcessExitReason" expires_after="2024-01-06">
+  <owner>avvall@chromium.org</owner>
+  <owner>src/android_webview/OWNERS</owner>
+  <summary>
+    Enumerates over the historical list of ApplicationExitInfo and their exit
+    reasons for an application. Records the latest exit reason for the embedding
+    application.
+  </summary>
+</histogram>
+
+<histogram
+    name="Android.WebView.HistoricalApplicationExitInfo.Counts.BACKGROUND"
+    enum="AndroidProcessExitReason" expires_after="2024-01-06">
+  <owner>avvall@chromium.org</owner>
+  <owner>src/android_webview/OWNERS</owner>
+  <summary>
+    Enumerates over the historical list of ApplicationExitInfo and their exit
+    reasons for an application. Records the latest exit reason for the embedding
+    application, specifically when WebView's last recorded state before exiting
+    was the background state.
+  </summary>
+</histogram>
+
+<histogram
+    name="Android.WebView.HistoricalApplicationExitInfo.Counts.DESTROYED"
+    enum="AndroidProcessExitReason" expires_after="2024-01-06">
+  <owner>avvall@chromium.org</owner>
+  <owner>src/android_webview/OWNERS</owner>
+  <summary>
+    Enumerates over the historical list of ApplicationExitInfo and their exit
+    reasons for an application. Records the latest exit reason for the embedding
+    application, specifically when WebView's last recorded state before exiting
+    was the destroyed state.
+  </summary>
+</histogram>
+
+<histogram
+    name="Android.WebView.HistoricalApplicationExitInfo.Counts.FOREGROUND"
+    enum="AndroidProcessExitReason" expires_after="2024-01-06">
+  <owner>avvall@chromium.org</owner>
+  <owner>src/android_webview/OWNERS</owner>
+  <summary>
+    Enumerates over the historical list of ApplicationExitInfo and their exit
+    reasons for an application. Records the latest exit reason for the embedding
+    application, specifically when WebView's last recorded state before exiting
+    was the foreground state.
+  </summary>
+</histogram>
+
+<histogram name="Android.WebView.HistoricalApplicationExitInfo.Counts.UNKNOWN"
+    enum="AndroidProcessExitReason" expires_after="2024-01-06">
+  <owner>avvall@chromium.org</owner>
+  <owner>src/android_webview/OWNERS</owner>
+  <summary>
+    Enumerates over the historical list of ApplicationExitInfo and their exit
+    reasons for an application. Records the latest exit reason for the embedding
+    application, specifically when WebView's last recorded state before exiting
+    was the detached state.
+  </summary>
+</histogram>
+
+<histogram name="Android.WebView.HistoricalApplicationExitInfo.Delta"
+    units="ms" expires_after="2024-01-06">
+  <owner>avvall@chromium.org</owner>
+  <owner>src/android_webview/OWNERS</owner>
+  <summary>
+    Tracks the deltas (in ms) between the current time of recording and the last
+    time of recording historical application exit info data. Only recorded if
+    the last time at recording was non-zero and there was some exit reason
+    recorded.
+  </summary>
+</histogram>
+
 <histogram name="Android.WebView.InputStreamTime" units="ms"
     expires_after="2023-12-04">
   <owner>jam@chromium.org</owner>
@@ -5010,7 +5205,7 @@
 </histogram>
 
 <histogram name="Android.WebView.Metrics.PackagesAllowList.ParseStatus"
-    enum="AppPackageNameAllowlistParseStatus" expires_after="2023-10-23">
+    enum="AppPackageNameAllowlistParseStatus" expires_after="2024-04-01">
   <owner>avvall@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -5037,7 +5232,7 @@
 
 <histogram
     name="Android.WebView.Metrics.PackagesAllowList.ResultReceivingDelay"
-    units="ms" expires_after="2023-10-23">
+    units="ms" expires_after="2024-04-01">
   <owner>avvall@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -5050,7 +5245,7 @@
 </histogram>
 
 <histogram name="Android.WebView.Metrics.PackagesAllowList.ThrottleStatus"
-    enum="Boolean" expires_after="2023-10-23">
+    enum="Boolean" expires_after="2024-04-01">
   <owner>avvall@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -5060,7 +5255,7 @@
 </histogram>
 
 <histogram name="Android.WebView.Metrics.PackagesAllowList.TimeToExpire"
-    units="hours" expires_after="2023-10-23">
+    units="hours" expires_after="2024-04-01">
   <owner>avvall@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -5117,7 +5312,7 @@
 </histogram>
 
 <histogram name="Android.WebView.NonEmbeddedMetrics.HistogramRecordAge"
-    units="minutes" expires_after="2023-12-31">
+    units="minutes" expires_after="2024-03-03">
   <owner>hazems@chromium.org</owner>
   <owner>ntfschr@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
@@ -5131,7 +5326,7 @@
 </histogram>
 
 <histogram name="Android.WebView.NonEmbeddedMetrics.NumHistograms"
-    units="histograms" expires_after="2023-12-31">
+    units="histograms" expires_after="2024-03-03">
   <owner>ntfschr@chromium.org</owner>
   <owner>hazems@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
@@ -5461,6 +5656,19 @@
   </summary>
 </histogram>
 
+<histogram name="Android.WebView.SafeMode.ReceivedFix" enum="BooleanEnabled"
+    expires_after="2024-07-28">
+  <owner>avvall@chromium.org</owner>
+  <owner>src/android_webview/OWNERS</owner>
+  <summary>
+    Records whether or not the WebView nonembedded service receives a SafeMode
+    fix configuration. This is recorded once for each SafeMode config the
+    WebView receives. This only ever logs true since WebView won't need to log
+    anything when safemode is not activated. This is only relevant for the app
+    recovery activation pathway.
+  </summary>
+</histogram>
+
 <histogram name="Android.WebView.SafeMode.SafeModeEnabled"
     enum="BooleanEnabled" expires_after="2024-01-28">
   <owner>ntfschr@chromium.org</owner>
@@ -5539,7 +5747,7 @@
 </histogram>
 
 <histogram name="Android.WebView.Startup.CreationTime.Stage1.FactoryInit"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>torne@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -5561,7 +5769,7 @@
 </histogram>
 
 <histogram name="Android.WebView.Startup.CreationTime.Stage2.ProviderInit.Warm"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>torne@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -5611,6 +5819,30 @@
   </token>
 </histogram>
 
+<histogram name="Android.WebView.SupervisedUser.UrlCheckResult"
+    enum="AndroidWebViewSupervisedUserUrlCheckResult"
+    expires_after="2024-08-28">
+  <owner>jdeabreu@chromium.org</owner>
+  <owner>src/android_webview/OWNERS</owner>
+  <summary>
+    Records whether a given URL is allowed to be loaded by the current device
+    user. This is based on a combination of a call to GMS Core, which checks if
+    the url is allowed, and the setting
+    AwFeatures.WEBVIEW_SUPERVISED_USER_SITE_BLOCK, which determines if we
+    actually block urls or only log the results.
+  </summary>
+</histogram>
+
+<histogram name="Android.WebView.SupervisedUser.UrlCheckTime" units="ms"
+    expires_after="2024-08-28">
+  <owner>jdeabreu@chromium.org</owner>
+  <owner>src/android_webview/OWNERS</owner>
+  <summary>
+    Records the time taken to return from the call to GMS Core that checks if a
+    given URL is allowed to be loaded by the current device user.
+  </summary>
+</histogram>
+
 <histogram name="Android.WebView.SupportLibrary.ClientIsCompat"
     enum="WebViewClientTypeEnum" expires_after="2024-08-23">
   <owner>pbirk@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/apps/histograms.xml b/tools/metrics/histograms/metadata/apps/histograms.xml
index 803b2935..87fc1fc 100644
--- a/tools/metrics/histograms/metadata/apps/histograms.xml
+++ b/tools/metrics/histograms/metadata/apps/histograms.xml
@@ -1192,7 +1192,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.SortOrderOnSessionStart.{TabletOrClamshell}"
-    enum="AppListSortOrder" expires_after="M112">
+    enum="AppListSortOrder" expires_after="M125">
   <owner>andrewxu@chromium.org</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -1249,7 +1249,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.SystemInfoProvider.Error.{ErrorSource}"
-    enum="CrosDiagnosticsDataError" expires_after="2023-10-15">
+    enum="CrosDiagnosticsDataError" expires_after="2024-06-15">
   <owner>laurencom@google.com</owner>
   <owner>tby@google.com</owner>
   <summary>
@@ -1602,7 +1602,7 @@
 </histogram>
 
 <histogram base="true" name="Apps.AppListFolderNameLength" units="characters"
-    expires_after="2023-11-12">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes
      name="TabletOrClamshellMode" -->
 
@@ -1800,25 +1800,6 @@
   <token key="TabletOrClamshell" variants="TabletOrClamshellMode"/>
 </histogram>
 
-<histogram name="Apps.AppListSearchResultInternalApp.Open"
-    enum="AppListInternalAppName" expires_after="2020-12-13">
-  <owner>wutao@chromium.org</owner>
-  <summary>
-    The app list search result of an internal app that was opened by the user.
-    This is gathered per click of a search result.
-  </summary>
-</histogram>
-
-<histogram name="Apps.AppListSearchResultInternalApp.Show"
-    enum="AppListInternalAppName" expires_after="2023-01-15">
-  <owner>wutao@chromium.org</owner>
-  <summary>
-    The app list search result of an internal app that was shown to the user.
-    This is gathered per creation of a search result. Note: Typing a word with
-    multiple letters could trigger multiple creations of the search result.
-  </summary>
-</histogram>
-
 <histogram name="Apps.AppListSearchResultOpenTypeV2" enum="AppListSearchResult"
     expires_after="2024-02-04">
 <!-- Name completed by histogram_suffixes name="TabletOrClamshellMode" -->
@@ -2193,14 +2174,14 @@
 </histogram>
 
 <histogram name="Apps.IconLoadingMethod" enum="IconLoadingMethod"
-    expires_after="2023-10-22">
+    expires_after="2024-10-22">
   <owner>nancylingwang@chromium.org</owner>
   <owner>chromeos-apps-foundation-team@google.com</owner>
   <summary>Records the app icon loading method when loading app icons.</summary>
 </histogram>
 
 <histogram name="Apps.Launcher.AppListSortClearAction.{TabletOrClamshell}"
-    enum="AppListOrderUpdateEvent" expires_after="M112">
+    enum="AppListOrderUpdateEvent" expires_after="M125">
   <owner>andrewxu@chromium.org</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -2212,7 +2193,7 @@
 
 <histogram
     name="Apps.Launcher.DragReorderAnimationSmoothness.{TabletOrClamshell}"
-    units="%" expires_after="M112">
+    units="%" expires_after="M125">
   <owner>mmourgos@chromium.org</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -2224,7 +2205,7 @@
 </histogram>
 
 <histogram name="Apps.Launcher.ProductivityReorderAction.{TabletOrClamshell}"
-    enum="AppListSortOrder" expires_after="M112">
+    enum="AppListSortOrder" expires_after="M125">
   <owner>andrewxu@chromium.org</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -2236,7 +2217,7 @@
 
 <histogram
     name="Apps.Launcher.ProductivityReorderAnimationSmoothness.{TabletOrClamshell}"
-    units="%" expires_after="M112">
+    units="%" expires_after="M125">
   <owner>andrewxu@chromium.org</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -2428,7 +2409,7 @@
 </histogram>
 
 <histogram name="Apps.RestoreArcAppsResult" enum="RestoreResult"
-    expires_after="2023-10-24">
+    expires_after="2024-10-24">
   <owner>nancylingwang@chromium.org</owner>
   <owner>sstan@chromium.org</owner>
   <summary>
@@ -2438,7 +2419,7 @@
 </histogram>
 
 <histogram name="Apps.RestoreArcAppStates" enum="ArcRestoreState"
-    expires_after="2023-10-24">
+    expires_after="2024-10-24">
   <owner>nancylingwang@chromium.org</owner>
   <owner>sstan@chromium.org</owner>
   <summary>
@@ -2448,7 +2429,7 @@
 </histogram>
 
 <histogram name="Apps.RestoreArcWindowCount" units="units"
-    expires_after="2023-12-24">
+    expires_after="2024-12-24">
   <owner>nancylingwang@chromium.org</owner>
   <owner>sstan@chromium.org</owner>
   <summary>
@@ -2459,7 +2440,7 @@
 </histogram>
 
 <histogram name="Apps.RestoreBrowserResult" enum="RestoreTabResult"
-    expires_after="2023-10-24">
+    expires_after="2024-10-24">
   <owner>nancylingwang@chromium.org</owner>
   <owner>sammiequon@chromium.org</owner>
   <summary>
@@ -2591,7 +2572,7 @@
 </histogram>
 
 <histogram name="Apps.SessionRestoreExitResult" enum="SessionRestoreExitResult"
-    expires_after="2023-10-24">
+    expires_after="2024-10-24">
   <owner>nancylingwang@chromium.org</owner>
   <owner>sammiequon@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/arc/histograms.xml b/tools/metrics/histograms/metadata/arc/histograms.xml
index 9e8e327..e85da5e 100644
--- a/tools/metrics/histograms/metadata/arc/histograms.xml
+++ b/tools/metrics/histograms/metadata/arc/histograms.xml
@@ -266,11 +266,14 @@
 </histogram>
 
 <histogram name="Arc.AdbSideloadingEnablingScreen"
-    enum="AdbSideloadingPromptEvent" expires_after="2022-05-01">
+    enum="AdbSideloadingPromptEvent" expires_after="2024-03-01">
   <owner>vraheja@chromium.org</owner>
   <owner>tbuckley@chromium.org</owner>
   <summary>
     Record user's choice or error during ADB sideloading opt-in UI after reboot.
+
+    This histogram was expired between 2022-05-01 and 2023-09-07. Data might be
+    missing or incomplete for this period.
   </summary>
 </histogram>
 
@@ -560,7 +563,7 @@
 </histogram>
 
 <histogram name="Arc.AppShortcutSearchResult.ShortcutStatus"
-    enum="ArcAppShortcutStatus" expires_after="2023-10-15">
+    enum="ArcAppShortcutStatus" expires_after="2024-10-15">
   <owner>batoon@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -571,7 +574,7 @@
 </histogram>
 
 <histogram name="Arc.AppShortcutsRequest.ShortcutStatus"
-    enum="ArcAppShortcutStatus" expires_after="2023-10-15">
+    enum="ArcAppShortcutStatus" expires_after="2024-10-15">
   <owner>batoon@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -696,7 +699,7 @@
 </histogram>
 
 <histogram name="Arc.Auth.MainAccountHashMigration.Status"
-    enum="ArcMainAccountHashMigrationStatus" expires_after="2024-03-31">
+    enum="ArcMainAccountHashMigrationStatus" expires_after="2024-09-11">
   <owner>vsomani@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -707,7 +710,7 @@
 </histogram>
 
 <histogram name="Arc.Auth.MainAccountResolution.Status{ArcUserTypes}"
-    enum="ArcAuthMainAccountResolutionStatus" expires_after="2024-02-20">
+    enum="ArcAuthMainAccountResolutionStatus" expires_after="2024-09-11">
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -731,7 +734,7 @@
   <token key="ArcUserTypes" variants="ArcUserTypes"/>
 </histogram>
 
-<histogram name="Arc.Auth.NumAccounts" units="count" expires_after="2024-01-14">
+<histogram name="Arc.Auth.NumAccounts" units="count" expires_after="2024-09-11">
   <owner>anastasiian@google.com</owner>
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
@@ -741,7 +744,7 @@
   </summary>
 </histogram>
 
-<histogram name="Arc.Auth.PercentAccounts" units="%" expires_after="2024-01-14">
+<histogram name="Arc.Auth.PercentAccounts" units="%" expires_after="2024-09-11">
   <owner>anastasiian@google.com</owner>
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
@@ -766,7 +769,7 @@
 </histogram>
 
 <histogram name="Arc.Auth.RequestAccountInfoResult.Primary"
-    enum="ArcAuthCodeStatus" expires_after="2023-10-24">
+    enum="ArcAuthCodeStatus" expires_after="2024-09-11">
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -777,7 +780,7 @@
 </histogram>
 
 <histogram name="Arc.Auth.RequestAccountInfoResult.Secondary"
-    enum="ArcAuthCodeStatus" expires_after="2024-02-25">
+    enum="ArcAuthCodeStatus" expires_after="2024-09-11">
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -1118,7 +1121,7 @@
 </histogram>
 
 <histogram name="Arc.DelayedActivation.ActivationIsDelayed" enum="Boolean"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hashimoto@chromium.org</owner>
   <owner>yuholong@chromium.org</owner>
   <owner>arcvm-eng@google.com</owner>
@@ -1143,7 +1146,7 @@
 </histogram>
 
 <histogram name="Arc.DelayedActivation.Delay" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hashimoto@chromium.org</owner>
   <owner>yuholong@chromium.org</owner>
   <owner>arcvm-eng@google.com</owner>
@@ -1269,7 +1272,7 @@
 </histogram>
 
 <histogram name="Arc.Fixup.Entire.Failures" units="units"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>arc-storage@google.com</owner>
   <summary>
@@ -1280,7 +1283,7 @@
 </histogram>
 
 <histogram name="Arc.Fixup.{Scale}.Directories" units="units"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>arc-storage@google.com</owner>
   <summary>
@@ -1294,7 +1297,7 @@
 </histogram>
 
 <histogram name="Arc.Fixup.{Scale}.Duration" units="ms"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>arc-storage@google.com</owner>
   <summary>
@@ -1406,7 +1409,7 @@
 </histogram>
 
 <histogram name="Arc.IdleManager.ScreenOffTime" units="ms"
-    expires_after="2023-11-01">
+    expires_after="2024-03-10">
   <owner>raging@google.com</owner>
   <owner>arcvm-eng@google.com</owner>
   <summary>
@@ -1665,7 +1668,7 @@
 </histogram>
 
 <histogram name="Arc.Net.DnsQuery.AndroidApi" enum="BooleanSuccess"
-    expires_after="2024-01-14">
+    expires_after="2024-09-11">
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -1674,7 +1677,7 @@
 </histogram>
 
 <histogram name="Arc.Net.DnsQuery.Other" enum="BooleanSuccess"
-    expires_after="2024-01-14">
+    expires_after="2024-09-11">
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -1761,7 +1764,7 @@
 </histogram>
 
 <histogram name="Arc.OptInResult" enum="ArcOptInResult"
-    expires_after="2024-01-21">
+    expires_after="2024-09-11">
   <owner>mhasank@google.com</owner>
   <owner>khmel@google.com</owner>
   <owner>arc-core@google.com</owner>
@@ -1769,7 +1772,7 @@
 </histogram>
 
 <histogram name="Arc.OptInSilentAuthCode" enum="ArcOptInSilentAuthCode"
-    expires_after="2024-01-30">
+    expires_after="2024-09-11">
   <owner>mhasank@google.com</owner>
   <owner>khmel@google.com</owner>
   <owner>arc-core@google.com</owner>
@@ -1779,7 +1782,7 @@
 </histogram>
 
 <histogram name="Arc.OptInSilentAuthCode.Reauthorization"
-    enum="ArcOptInSilentAuthCode" expires_after="2024-01-10">
+    enum="ArcOptInSilentAuthCode" expires_after="2024-09-11">
   <owner>mhasank@google.com</owner>
   <owner>khmel@google.com</owner>
   <owner>arc-core@google.com</owner>
@@ -1940,7 +1943,7 @@
 </histogram>
 
 <histogram name="Arc.Policy.InstallTypesOnDevice" enum="AppInstallType"
-    expires_after="2024-01-21">
+    expires_after="2024-09-11">
   <owner>batoon@google.com</owner>
   <owner>arc-commercial@google.com</owner>
   <summary>
@@ -1953,7 +1956,7 @@
 </histogram>
 
 <histogram name="Arc.Policy.Keys" enum="ArcPolicyKey"
-    expires_after="2024-01-14">
+    expires_after="2024-09-11">
   <owner>mhasank@google.com</owner>
   <owner>arc-commercial@google.com</owner>
   <summary>
@@ -2079,7 +2082,7 @@
 </histogram>
 
 <histogram name="Arc.Reauthorization.Result{ArcUserTypes}"
-    enum="ArcProvisioningStatus" expires_after="2024-01-01">
+    enum="ArcProvisioningStatus" expires_after="2024-09-11">
   <owner>mhasank@google.com</owner>
   <owner>arc-core@gmail.com</owner>
   <summary>
@@ -2377,7 +2380,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.AutoResumeCount" units="count"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2394,7 +2397,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.BatteryConsumption" units="%"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2408,7 +2411,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.DesiredDiskImageSizeInGB.{SatisfiedOrNot}"
-    units="GB" expires_after="2024-01-01">
+    units="GB" expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2424,7 +2427,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.Duration" units="seconds"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2435,7 +2438,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.EndStatus"
-    enum="CrOSFileSystemMigrationEndStatus" expires_after="2024-01-01">
+    enum="CrOSFileSystemMigrationEndStatus" expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2485,12 +2488,24 @@
   </summary>
 </histogram>
 
-<histogram name="Arc.VmDataMigration.InitialBatteryLevel" units="%"
+<histogram name="Arc.VmDataMigration.GetAndroidDataInfoDuration" units="ms"
     expires_after="2024-01-01">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
   <summary>
+    The time taken for ArcVmDataMigrator's D-Bus method GetAndroidDataInfo to
+    return a result, measured from the caller (Chrome) side. Reported every time
+    the migration welcome screen is being set up.
+  </summary>
+</histogram>
+
+<histogram name="Arc.VmDataMigration.InitialBatteryLevel" units="%"
+    expires_after="2024-03-03">
+  <owner>momohatt@google.com</owner>
+  <owner>youkichihosoi@google.com</owner>
+  <owner>arc-storage@google.com</owner>
+  <summary>
     The battery level when the user enters the UX flow of ARCVM /data migration.
     This is reported for both new migrations and resumed migrations.
   </summary>
@@ -2509,7 +2524,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.MigrationFinishReason{ArcUserTypes}"
-    enum="ArcVmDataMigrationFinishReason" expires_after="2024-01-01">
+    enum="ArcVmDataMigrationFinishReason" expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2520,7 +2535,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.MigrationStatusOnArcStarted{ArcUserTypes}"
-    enum="ArcVmDataMigrationStatus" expires_after="2024-01-01">
+    enum="ArcVmDataMigrationStatus" expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2559,7 +2574,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.NotificationShownForTheFirstTime"
-    enum="BooleanEnabled" expires_after="2024-01-01">
+    enum="BooleanEnabled" expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2571,7 +2586,7 @@
 
 <histogram
     name="Arc.VmDataMigration.RemainingDays.{ArcVmDataMigrationFrontEndEvents}"
-    units="days" expires_after="2024-01-01">
+    units="days" expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2597,7 +2612,7 @@
 
 <histogram
     name="Arc.VmDataMigration.RequiredFreeDiskSpaceInGB.{SatisfiedOrNot}"
-    units="GB" expires_after="2024-01-01">
+    units="GB" expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2613,7 +2628,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.ResumeNotificationShown"
-    enum="BooleanEnabled" expires_after="2024-01-01">
+    enum="BooleanEnabled" expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2627,7 +2642,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.ScreenEvent.On{ArcVmDataMigrationType}"
-    enum="ArcVmDataMigrationScreenEvent" expires_after="2024-01-01">
+    enum="ArcVmDataMigrationScreenEvent" expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2640,7 +2655,7 @@
 
 <histogram
     name="Arc.VmDataMigration.ScreenInitialState.On{ArcVmDataMigrationType}"
-    enum="ArcVmDataMigrationScreenInitialState" expires_after="2024-01-01">
+    enum="ArcVmDataMigrationScreenInitialState" expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2666,7 +2681,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.SetupResult"
-    enum="ArcVmDataMigrationSetupResult" expires_after="2024-01-01">
+    enum="ArcVmDataMigrationSetupResult" expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2677,7 +2692,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.StartStatus"
-    enum="CrOSFileSystemMigrationStartStatus" expires_after="2024-01-01">
+    enum="CrOSFileSystemMigrationStartStatus" expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2688,7 +2703,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.TotalFiles" units="files"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2699,7 +2714,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.TotalSizeMB" units="MB"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2710,7 +2725,7 @@
 </histogram>
 
 <histogram name="Arc.VpnServiceBuilderCompatApisCounter"
-    enum="VpnServiceBuilderCompatApisList" expires_after="2023-10-24">
+    enum="VpnServiceBuilderCompatApisList" expires_after="2024-09-11">
   <owner>mhasank@google.com</owner>
   <owner>preranap@google.com</owner>
   <owner>arc-commercial@google.com</owner>
@@ -2721,7 +2736,7 @@
 </histogram>
 
 <histogram name="Arc.Wayland.LateTiming.Duration{WaylandEventType}" units="ms"
-    expires_after="2023-09-16">
+    expires_after="2024-03-16">
   <owner>alanding@google.com</owner>
   <owner>arc-performance@google.com</owner>
   <summary>
@@ -2735,7 +2750,7 @@
 </histogram>
 
 <histogram name="Arc.Wayland.LateTiming.Event" enum="WaylandTimingEvent"
-    expires_after="2024-01-21">
+    expires_after="2024-03-16">
   <owner>alanding@google.com</owner>
   <owner>arc-performance@google.com</owner>
   <summary>
@@ -2755,6 +2770,16 @@
   </summary>
 </histogram>
 
+<histogram name="Arc.WindowPredictorUseCase" enum="WindowPredictorUseCase"
+    expires_after="2024-02-04">
+  <owner>sstan@google.com</owner>
+  <owner>arc-framework@google.com</owner>
+  <summary>
+    Records the number of each use case of window predictor. Recorded when the
+    window perdictor called to launch ARC ghost window intentionally.
+  </summary>
+</histogram>
+
 </histograms>
 
 </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 536462f..d7861296 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -553,7 +553,7 @@
   <owner>alemate@chromium.org</owner>
   <owner>khmel@chromium.org</owner>
   <owner>arc-performance@google.com</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>cros-sw-perf@google.com</owner>
   <summary>
     For each user after they opted-in into ARC++, records the duration of
     initial apps installation. Duration is measured as an interval between the
@@ -1087,7 +1087,7 @@
 
 <histogram
     name="Ash.BrowserDataMigrator.MoveMigrator.ExtraDiskSpaceOccupied.DiffWithEstimate"
-    units="MB" expires_after="M121">
+    units="MB" expires_after="2024-03-10">
   <owner>ythjkt@chromium.org</owner>
   <owner>hidehiko@chromium.org</owner>
   <summary>
@@ -1119,7 +1119,7 @@
 </histogram>
 
 <histogram name="Ash.BrowserDataMigrator.MoveMigrator.MoveLacrosItemsTime"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>ythjkt@chromium.org</owner>
   <owner>hidehiko@chromium.org</owner>
   <summary>
@@ -1173,7 +1173,7 @@
 </histogram>
 
 <histogram name="Ash.BrowserDataMigrator.MoveMigrator.PreMigrationCleanUpTime"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>ythjkt@chromium.org</owner>
   <owner>hidehiko@chromium.org</owner>
   <summary>
@@ -1209,7 +1209,7 @@
 
 <histogram
     name="Ash.BrowserDataMigrator.MoveMigrator.SetupLacrosDirCopyTargetItemsTime"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>ythjkt@chromium.org</owner>
   <owner>hidehiko@chromium.org</owner>
   <summary>
@@ -1232,7 +1232,7 @@
 </histogram>
 
 <histogram name="Ash.BrowserDataMigrator.MoveMigrator.SuccessfulMigrationTime"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>ythjkt@chromium.org</owner>
   <owner>hidehiko@chromium.org</owner>
   <summary>
@@ -1255,7 +1255,7 @@
 </histogram>
 
 <histogram name="Ash.BrowserDataMigrator.MoveMigrator.TmpProfileDirSize"
-    units="MB" expires_after="M121">
+    units="MB" expires_after="2024-03-10">
   <owner>ythjkt@chromium.org</owner>
   <owner>hidehiko@chromium.org</owner>
   <summary>
@@ -1264,7 +1264,7 @@
 </histogram>
 
 <histogram name="Ash.BrowserDataMigrator.MoveMigrator.TmpSplitDirSize"
-    units="MB" expires_after="M121">
+    units="MB" expires_after="2024-03-10">
   <owner>ythjkt@chromium.org</owner>
   <owner>hidehiko@chromium.org</owner>
   <summary>
@@ -1313,7 +1313,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.CalendarKeyboardNavigationSource"
-    enum="CalendarKeyboardNavigationSource" expires_after="2023-09-18">
+    enum="CalendarKeyboardNavigationSource" expires_after="2024-09-04">
   <owner>kradtke@chromium.org</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1325,7 +1325,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.EventListView.EventDisplayedCount" units="int"
-    expires_after="2024-03-28">
+    expires_after="2024-09-04">
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1337,7 +1337,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.EventListView.JoinMeetingButton.Pressed"
-    enum="CalendarEventSource" expires_after="2024-02-10">
+    enum="CalendarEventSource" expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1349,7 +1349,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.EventsDisplayedToUser" enum="Boolean"
-    expires_after="2024-03-23">
+    expires_after="2024-09-04">
   <owner>samcackett@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1359,7 +1359,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.FetchEvents.FetchDuration" units="ms"
-    expires_after="2024-01-21">
+    expires_after="2024-09-04">
   <owner>rtinkoff@google.com</owner>
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
@@ -1398,7 +1398,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.FetchEvents.PreFetched" units="fetches"
-    expires_after="2023-09-18">
+    expires_after="2024-09-04">
   <owner>rtinkoff@google.com</owner>
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
@@ -1409,7 +1409,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.FetchEvents.Result"
-    enum="CalendarEventFetchApiError" expires_after="2024-01-21">
+    enum="CalendarEventFetchApiError" expires_after="2024-09-04">
   <owner>rtinkoff@google.com</owner>
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
@@ -1420,7 +1420,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.FetchEvents.SingleMonthSize" units="bytes"
-    expires_after="2023-09-18">
+    expires_after="2024-09-04">
   <owner>rtinkoff@google.com</owner>
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
@@ -1431,7 +1431,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.FetchEvents.Timeout" enum="Boolean"
-    expires_after="2023-09-18">
+    expires_after="2024-09-04">
   <owner>rtinkoff@google.com</owner>
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
@@ -1442,7 +1442,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.FetchEvents.TotalCacheSizeMonths" units="months"
-    expires_after="2023-09-18">
+    expires_after="2024-09-04">
   <owner>rtinkoff@google.com</owner>
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
@@ -1453,7 +1453,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.MaxDistanceBrowsed" units="months"
-    expires_after="2023-09-18">
+    expires_after="2024-09-04">
   <owner>newcomer@chromium.org</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1463,7 +1463,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.MonthDwellTime" units="ms"
-    expires_after="2024-01-21">
+    expires_after="2024-09-04">
   <owner>kradtke@chromium.org</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1473,7 +1473,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.ScrollSource" enum="CalendarViewScrollSource"
-    expires_after="2024-01-21">
+    expires_after="2024-09-04">
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1484,7 +1484,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.ShowSource.{ViewShowSource}"
-    enum="CalendarEventSource" expires_after="2023-09-18">
+    enum="CalendarEventSource" expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1498,7 +1498,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.TimeToSeeTodaysEventDots" units="ms"
-    expires_after="2024-01-21">
+    expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1510,7 +1510,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.UpNextView.EventDisplayedCount" units="int"
-    expires_after="2024-01-24">
+    expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1522,7 +1522,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.UpNextView.EventListItem.Pressed"
-    enum="CalendarEventSource" expires_after="2024-01-24">
+    enum="CalendarEventSource" expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1534,7 +1534,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.UpNextView.JoinMeetingButton.Pressed"
-    enum="CalendarEventSource" expires_after="2024-02-10">
+    enum="CalendarEventSource" expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1546,7 +1546,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.UserJourneyTime.{EventLaunchState}" units="ms"
-    expires_after="2023-09-18">
+    expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1561,7 +1561,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.{CalendarChildView}.Activated"
-    enum="CalendarEventSource" expires_after="2023-09-18">
+    enum="CalendarEventSource" expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>Recorded when the {CalendarChildView} is activated.</summary>
@@ -1575,7 +1575,7 @@
 
 <histogram
     name="Ash.CalendarView.CloseEventList.{CalendarChildView}.AnimationSmoothness"
-    units="%" expires_after="2023-09-18">
+    units="%" expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
@@ -1592,7 +1592,7 @@
 </histogram>
 
 <histogram name="Ash.CalendarView.ConstructionTime" units="ms"
-    expires_after="2023-09-18">
+    expires_after="2024-09-04">
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -1603,7 +1603,7 @@
 </histogram>
 
 <histogram name="Ash.CalendarView.OnMonthChanged.AnimationSmoothness" units="%"
-    expires_after="2023-09-18">
+    expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
@@ -1612,7 +1612,7 @@
 
 <histogram
     name="Ash.CalendarView.OpenEventList.{CalendarChildView}.AnimationSmoothness"
-    units="%" expires_after="2024-02-18">
+    units="%" expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
@@ -1636,7 +1636,7 @@
 
 <histogram
     name="Ash.CalendarView.ScrollOneMonth.{CalendarChildView}.AnimationSmoothness"
-    units="%" expires_after="2023-09-18">
+    units="%" expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
@@ -1652,7 +1652,7 @@
 </histogram>
 
 <histogram name="Ash.CalendarView.ShowUpNextView.AnimationSmoothness" units="%"
-    expires_after="2024-02-04">
+    expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>samcackett@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
@@ -1664,7 +1664,7 @@
 
 <histogram
     name="Ash.CalendarView.SmoothScrollToTodaysDateCell.{CalendarChildView}.AnimationSmoothness"
-    units="%" expires_after="2024-05-04">
+    units="%" expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>samcackett@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
@@ -1682,7 +1682,7 @@
 
 <histogram
     name="Ash.CalendarView.{Animation}.{CalendarChildView}.AnimationSmoothness"
-    units="%" expires_after="2023-09-18">
+    units="%" expires_after="2024-09-04">
   <owner>newcomer@google.com</owner>
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
@@ -2040,7 +2040,7 @@
 </histogram>
 
 <histogram name="Ash.CaptureModeController.ScreenshotsPerWeek" units="int"
-    expires_after="2023-12-24">
+    expires_after="2024-03-10">
   <owner>afakhry@chromium.org</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -2204,7 +2204,7 @@
     expires_after="2024-01-14">
   <owner>afakhry@chromium.org</owner>
   <owner>tclaiborne@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>chromeos-wmp@google.com</owner>
   <summary>
     Emitted when the virtual desks activation animation begins, to report the
     latency of starting this animation. In a continuous desk animation, this
@@ -2213,10 +2213,10 @@
 </histogram>
 
 <histogram name="Ash.Desks.AnimationLatency.DeskRemoval" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>afakhry@chromium.org</owner>
   <owner>tclaiborne@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>chromeos-wmp@google.com</owner>
   <summary>
     Emitted when the virtual desks removal animation begins, to report the
     latency of starting this animation. In a continuous desk animation, this
@@ -2225,7 +2225,7 @@
 </histogram>
 
 <histogram name="Ash.Desks.AnimationSmoothness.DeskActivation" units="%"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>afakhry@chromium.org</owner>
   <owner>tclaiborne@chromium.org</owner>
   <summary>
@@ -2249,7 +2249,7 @@
 </histogram>
 
 <histogram name="Ash.Desks.AnimationSmoothness.DeskRemoval" units="%"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>afakhry@chromium.org</owner>
   <owner>tclaiborne@chromium.org</owner>
   <summary>
@@ -2350,7 +2350,7 @@
 </histogram>
 
 <histogram name="Ash.Desks.ConsecutiveDailyVisits" units="days"
-    expires_after="2023-09-03">
+    expires_after="2024-09-03">
   <owner>afakhry@chromium.org</owner>
   <owner>janetmac@chromium.org</owner>
   <summary>
@@ -2564,7 +2564,7 @@
 </histogram>
 
 <histogram name="Ash.Desks.NumberOfWindowsClosed2" units="units"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>aprilzhou@google.com</owner>
   <owner>janetmac@chromium.org</owner>
   <summary>
@@ -2751,7 +2751,7 @@
 </histogram>
 
 <histogram name="Ash.Desks.PresentationTime.UpdateGesture" units="ms"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
   <owner>afakhry@chromium.org</owner>
   <owner>sammiequon@chromium.org</owner>
   <owner>tclaiborne@chromium.org</owner>
@@ -3062,14 +3062,14 @@
 </histogram>
 
 <histogram name="Ash.DeskTemplate.TabCount" units="count"
-    expires_after="2023-12-10">
+    expires_after="2024-03-10">
   <owner>richui@chromium.org</owner>
   <owner>janetmac@chromium.org</owner>
   <summary>Records the number of tabs in a template when it is saved.</summary>
 </histogram>
 
 <histogram name="Ash.DeskTemplate.TemplateSize" units="B"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>zhumatthew@google.com</owner>
   <owner>janetmac@chromium.org</owner>
   <summary>
@@ -3139,7 +3139,7 @@
 </histogram>
 
 <histogram name="Ash.DeskTemplate.WindowCount" units="count"
-    expires_after="2023-12-10">
+    expires_after="2024-03-10">
   <owner>richui@chromium.org</owner>
   <owner>janetmac@chromium.org</owner>
   <summary>
@@ -3148,7 +3148,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveClient.CheckMembershipCases"
-    enum="DeviceActiveCheckMembershipResponseCases" expires_after="2024-02-11">
+    enum="DeviceActiveCheckMembershipResponseCases" expires_after="2024-01-01">
   <owner>qianwan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3158,7 +3158,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveClient.Duration.{DeviceActiveClientState}"
-    units="ms" expires_after="2023-09-01">
+    units="ms" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3170,7 +3170,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveClient.IsPsmOprfResponseBodySet"
-    enum="BooleanSuccess" expires_after="2024-02-04">
+    enum="BooleanSuccess" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3181,7 +3181,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveClient.IsPsmOprfResponseParsedCorrectly"
-    enum="BooleanSuccess" expires_after="2024-02-04">
+    enum="BooleanSuccess" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3192,7 +3192,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveClient.IsPsmQueryResponseBodySet"
-    enum="BooleanSuccess" expires_after="2023-10-01">
+    enum="BooleanSuccess" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3203,7 +3203,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveClient.IsPsmQueryResponseParsedCorrectly"
-    enum="BooleanSuccess" expires_after="2023-10-01">
+    enum="BooleanSuccess" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3214,7 +3214,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveClient.PreservedFileState"
-    enum="DeviceActiveClientPreservedFileState" expires_after="2024-01-14">
+    enum="DeviceActiveClientPreservedFileState" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3225,7 +3225,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveClient.PsmOprfResponseNetErrorCode"
-    enum="NetErrorCodes" expires_after="2024-02-04">
+    enum="NetErrorCodes" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3237,7 +3237,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveClient.PsmQueryResponseNetErrorCode"
-    enum="NetErrorCodes" expires_after="2024-02-04">
+    enum="NetErrorCodes" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3249,7 +3249,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveClient.QueryMembershipResult"
-    enum="BooleanSuccess" expires_after="2024-01-14">
+    enum="BooleanSuccess" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3259,7 +3259,7 @@
 
 <histogram
     name="Ash.DeviceActiveClient.Recorded{DeviceActivityClientTransitionMethod}Minute"
-    units="int" expires_after="2023-09-01">
+    units="int" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3273,7 +3273,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveClient.Response.{DeviceActiveClientState}"
-    enum="DeviceActiveClientPsmResponse" expires_after="2023-09-01">
+    enum="DeviceActiveClientPsmResponse" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3286,7 +3286,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveClient.SavePreservedFileSuccess"
-    enum="BooleanSuccess" expires_after="2024-01-07">
+    enum="BooleanSuccess" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3296,7 +3296,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveClient.StateCount"
-    enum="DeviceActiveClientState" expires_after="2024-01-07">
+    enum="DeviceActiveClientState" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3307,7 +3307,7 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveController.IsTestImageDevice"
-    enum="BooleanSuccess" expires_after="2024-01-14">
+    enum="BooleanSuccess" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3318,14 +3318,14 @@
 </histogram>
 
 <histogram name="Ash.DeviceActiveController.PsmDeviceActiveSecretIsSet"
-    enum="BooleanSuccess" expires_after="2023-09-01">
+    enum="BooleanSuccess" expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>Whether the PSM derived active secret is set (non empty).</summary>
 </histogram>
 
 <histogram name="Ash.DeviceActivity.MethodCalled" enum="DeviceActivityMethod"
-    expires_after="2024-01-14">
+    expires_after="2024-01-01">
   <owner>hirthanan@google.com</owner>
   <owner>chromeos-data-team@google.com</owner>
   <summary>
@@ -3466,7 +3466,7 @@
     expires_after="2023-12-31">
   <owner>xiyuan@chromium.org</owner>
   <owner>yichenz@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>cros-sw-perf@google.com</owner>
   <summary>
     Similar to &quot;Ash.EventLatency.Core.TotalLatency&quot; that tracks total
     latency of 5 core events
@@ -3483,10 +3483,10 @@
 </histogram>
 
 <histogram name="Ash.EventLatency.Core.TotalLatency" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>xiyuan@chromium.org</owner>
   <owner>yichenz@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>cros-sw-perf@google.com</owner>
   <summary>
     Similar to &quot;Ash.EventLatency.TotalLatency&quot; but tracks total
     latency of 5 core events
@@ -3500,10 +3500,10 @@
 </histogram>
 
 <histogram name="Ash.EventLatency.TotalLatency" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>xiyuan@chromium.org</owner>
   <owner>yichenz@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>cros-sw-perf@google.com</owner>
   <summary>
     Tracks total latency of all types of event for ash UI, from when the user
     input causing the event is generated until the frame caused by the event is
@@ -3706,8 +3706,61 @@
   <summary>Record the floating workspace template upload status.</summary>
 </histogram>
 
+<histogram name="Ash.Frame.ColorChangeCount.{AppType}" units="count"
+    expires_after="2024-09-01">
+  <owner>lingyufeng@google.com</owner>
+  <owner>arc-framework@google.com</owner>
+  <summary>
+    Tracks the number of frame color changes when a {AppType} is launched. The
+    data is collected once per app launching.
+  </summary>
+  <token key="AppType">
+    <variant name="ArcApp"/>
+    <variant name="Browser"/>
+    <variant name="ChromeApp"/>
+    <variant name="CrostiniApp"/>
+    <variant name="Others"/>
+    <variant name="SystemApp"/>
+  </token>
+</histogram>
+
+<histogram
+    name="Ash.Glanceables.Api.Classroom.CourseWorkItemsPerStudentCourseCount"
+    units="course work items" expires_after="2024-03-01">
+  <owner>amitrokhin@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    Recorded whenever glanceables UI fetches data from Google Classroom API. The
+    recorded value indicates the number of course work items fetched for a
+    course, where the current user is enrolled as a student.
+  </summary>
+</histogram>
+
+<histogram name="Ash.Glanceables.Api.Classroom.IsStudentRoleActiveResult"
+    enum="BooleanEnabled" expires_after="2024-03-01">
+  <owner>amitrokhin@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    Recorded whenever glanceables UI fetches data from Google Classroom API. The
+    recorded value indicates whether the current user is enrolled in at least
+    one classroom course.
+  </summary>
+</histogram>
+
+<histogram
+    name="Ash.Glanceables.Api.Classroom.StudentSubmissionsPerStudentCourseCount"
+    units="student submissions" expires_after="2024-03-01">
+  <owner>amitrokhin@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    Recorded whenever glanceables UI fetches data from Google Classroom API. The
+    recorded value indicates the number of student submissions fetched for a
+    course, where the current user is enrolled as a student.
+  </summary>
+</histogram>
+
 <histogram name="Ash.Glanceables.Api.Classroom.{Role}CoursesCount"
-    units="courses" expires_after="2024-01-01">
+    units="courses" expires_after="2024-03-01">
   <owner>amitrokhin@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -3723,7 +3776,7 @@
 </histogram>
 
 <histogram name="Ash.Glanceables.Api.Classroom.{Role}DataFetchTime" units="ms"
-    expires_after="2024-01-01">
+    expires_after="2024-03-01">
   <owner>amitrokhin@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -3737,8 +3790,54 @@
   </token>
 </histogram>
 
+<histogram name="Ash.Glanceables.Api.Tasks.ProcessedTasksCount" units="tasks"
+    expires_after="2024-03-01">
+  <owner>amitrokhin@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    Recorded whenever glanceables UI fetches data from Google Tasks API. The
+    recorded value indicates the number of tasks in a task list after processing
+    (only not completed root tasks).
+  </summary>
+</histogram>
+
+<histogram name="Ash.Glanceables.Api.Tasks.RawTasksCount" units="tasks"
+    expires_after="2024-03-01">
+  <owner>amitrokhin@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    Recorded whenever glanceables UI fetches data from Google Tasks API. The
+    recorded value indicates the number of fetched raw tasks in a task list. Raw
+    - means all individual tasks before processing, including all subtasks,
+    since the API returns them as a flat array.
+  </summary>
+</histogram>
+
+<histogram
+    name="Ash.Glanceables.Api.Tasks.SimultaneousMarkAsCompletedRequestsCount"
+    units="requests" expires_after="2024-03-01">
+  <owner>amitrokhin@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    Recorded whenever glanceables UI submits changes to Google Tasks API after
+    closing the bubble. The recorded value indicates the number of completed
+    tasks that require individiual requests to update their status.
+  </summary>
+</histogram>
+
+<histogram name="Ash.Glanceables.Api.Tasks.TaskListsCount" units="task lists"
+    expires_after="2024-03-01">
+  <owner>amitrokhin@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    Recorded whenever glanceables UI fetches data from Google Tasks API. The
+    recorded value indicates the number of task lists fetched for the current
+    user.
+  </summary>
+</histogram>
+
 <histogram name="Ash.Glanceables.Api.{Method}.Latency" units="ms"
-    expires_after="2024-01-01">
+    expires_after="2024-03-01">
   <owner>amitrokhin@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -3757,7 +3856,7 @@
 </histogram>
 
 <histogram name="Ash.Glanceables.Api.{Method}.PagesCount" units="pages"
-    expires_after="2024-01-01">
+    expires_after="2024-03-01">
   <owner>amitrokhin@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -3774,7 +3873,7 @@
 </histogram>
 
 <histogram name="Ash.Glanceables.Api.{Method}.Status" enum="ApiErrorCode"
-    expires_after="2024-01-01">
+    expires_after="2024-03-01">
   <owner>amitrokhin@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -3792,6 +3891,133 @@
   </token>
 </histogram>
 
+<histogram
+    name="Ash.Glanceables.Classroom.Student.AssignmentListShownTime.{OccurrenceType}.{AssignmentListType}"
+    units="ms" expires_after="2024-08-29">
+  <owner>mmourgos@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    The amount of time that the user had the student assignment list selected
+    and shown. This metric is split between the default list which is shown when
+    the bubble is first opened and assignment lists which are shown after
+    chaning the selection. The time is measured from the moment that the list is
+    shown to the moment that either the selection is changed or the bubble is
+    closed.
+  </summary>
+  <token key="AssignmentListType">
+    <variant name="Assigned"/>
+    <variant name="Done"/>
+    <variant name="Missing"/>
+    <variant name="NoDueDate"/>
+  </token>
+  <token key="OccurrenceType">
+    <variant name="ChangedList"/>
+    <variant name="DefaultList"/>
+  </token>
+</histogram>
+
+<histogram name="Ash.Glanceables.Classroom.Student.ListSelected"
+    enum="GlanceableStudentAssignmentList" expires_after="2024-08-29">
+  <owner>mmourgos@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    The number of times that the assignment list has been selected. Recorded
+    every time a new assignment list is selected.
+  </summary>
+</histogram>
+
+<histogram name="Ash.Glanceables.Classroom.Student.SelectedListChangeCount"
+    units="int" expires_after="2024-08-29">
+  <owner>mmourgos@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    The total number of times that a new student assignment list is selected.
+    The total count is recorded when the glanceable bubble is closed.
+  </summary>
+</histogram>
+
+<histogram name="Ash.Glanceables.TimeManagement.LoginToShowTime" units="ms"
+    expires_after="2024-08-31">
+  <owner>anasalazar@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    The amount of time that the user spent between login and opening the
+    glanceables time management bubble. The time is measured from the moment the
+    user logs in and the time the glanceables bubble is created.
+  </summary>
+</histogram>
+
+<histogram name="Ash.Glanceables.TimeManagement.Tasks.TasksListChangeCount"
+    units="int" expires_after="2024-08-31">
+  <owner>mmourgos@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    Records the total number of times the selected tasks list is changed. The
+    total count is recorded when the glanceable bubble is closed.
+  </summary>
+</histogram>
+
+<histogram name="Ash.Glanceables.TimeManagement.TasksCountInDefaultTaskList"
+    units="tasks" expires_after="2024-03-01">
+  <owner>amitrokhin@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    Records the total number of tasks shown in the default (initially selected)
+    task list.
+  </summary>
+</histogram>
+
+<histogram name="Ash.Glanceables.TimeManagement.TotalShowTime" units="ms"
+    expires_after="2024-08-29">
+  <owner>anasalazar@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    The amount of time that the user kept the glanceables time management bubble
+    open. The time is measured from the moment the glanceables bubble is created
+    until said bubble is destroyed.
+  </summary>
+</histogram>
+
+<histogram
+    name="Ash.Glanceables.TimeManagement.{GlanceableBubble}.ChangeListToLoadTime.{Status}"
+    units="ms" expires_after="2024-08-31">
+  <owner>anasalazar@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    The amount of time in ms that the glanceables bubble takes to load up the
+    data from the API after the user triggered an update. Split by bubble type
+    and query status.
+  </summary>
+  <token key="GlanceableBubble">
+    <variant name="Classroom"/>
+    <variant name="Tasks"/>
+  </token>
+  <token key="Status">
+    <variant name="Fail"/>
+    <variant name="Success"/>
+  </token>
+</histogram>
+
+<histogram
+    name="Ash.Glanceables.TimeManagement.{GlanceableBubble}.OpenToInitialLoadTime.{Occurrence}"
+    units="ms" expires_after="2024-08-29">
+  <owner>anasalazar@google.com</owner>
+  <owner>chromeos-launcher@google.com</owner>
+  <summary>
+    The amount of time in ms that the glanceables bubble takes to load up the
+    initial data from the API after opened. Split by bubble type and whether the
+    time represent the first time the bubble was opened in the session or not.
+  </summary>
+  <token key="GlanceableBubble">
+    <variant name="Classroom"/>
+    <variant name="Tasks"/>
+  </token>
+  <token key="Occurrence">
+    <variant name="FirstOcurrence"/>
+    <variant name="SubsequentOccurence"/>
+  </token>
+</histogram>
+
 <histogram name="Ash.Homescreen.AnimationSmoothness" units="%"
     expires_after="2024-01-10">
   <owner>sammiequon@chromium.org</owner>
@@ -3967,7 +4193,7 @@
 </histogram>
 
 <histogram name="Ash.LacrosMigrationStatus" enum="LacrosMigrationStatus"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>ythjkt@chromium.org</owner>
   <owner>hidehiko@chromium.org</owner>
   <summary>
@@ -4144,7 +4370,7 @@
 <histogram name="Ash.Login.TimeUntilGoodADF" units="microseconds"
     expires_after="2024-07-09">
   <owner>xiyuan@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>cros-sw-perf@google.com</owner>
   <summary>
     Time between user logged in (i.e. a successful cryptohome mount) and when
     good ADF (&lt;= 20%) is observed for more than 5 seconds.
@@ -4609,7 +4835,7 @@
 </histogram>
 
 <histogram name="Ash.NotificationView.ImageDrag.EndState"
-    enum="NotificationImageDragEndState" expires_after="M121">
+    enum="NotificationImageDragEndState" expires_after="2024-03-10">
   <owner>andrewxu@chromium.org</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -4619,7 +4845,7 @@
 </histogram>
 
 <histogram name="Ash.NotificationView.ImageDrag.Start"
-    enum="NotificationCatalogName" expires_after="M121">
+    enum="NotificationCatalogName" expires_after="2024-03-10">
   <owner>andrewxu@chromium.org</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -4902,9 +5128,8 @@
 
 <histogram name="Ash.Overview.AnimationSmoothness.Enter{OverviewAnimationMode}"
     units="%" expires_after="2024-02-07">
-  <owner>omrilio@chromium.org</owner>
-  <owner>oshima@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>achuith@chromium.org</owner>
+  <owner>cros-sw-perf@google.com</owner>
   <summary>
     Relative smoothness of animations when entering overview mode, recorded when
     the animation completes. 100% represents ideally smooth 60 frames per
@@ -4915,9 +5140,8 @@
 
 <histogram name="Ash.Overview.AnimationSmoothness.Exit{OverviewAnimationMode}"
     units="%" expires_after="2024-02-07">
-  <owner>omrilio@chromium.org</owner>
-  <owner>oshima@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>achuith@chromium.org</owner>
+  <owner>cros-sw-perf@google.com</owner>
   <summary>
     Relative smoothness of animations when exiting overview mode, recorded when
     the animation completes. 100% represents ideally smooth 60 frames per
@@ -5175,7 +5399,7 @@
 </histogram>
 
 <histogram name="Ash.Personalization.AmbientMode.AnimationTheme2"
-    enum="AmbientModeAnimationTheme" expires_after="2023-10-22">
+    enum="AmbientModeAnimationTheme" expires_after="2024-03-03">
   <owner>jasontt@chromium.org</owner>
   <owner>assistive-eng@google.com</owner>
   <summary>
@@ -5208,7 +5432,7 @@
 </histogram>
 
 <histogram name="Ash.Personalization.AmbientMode.Video2"
-    enum="AmbientModeVideo" expires_after="2023-10-22">
+    enum="AmbientModeVideo" expires_after="2024-03-12">
   <owner>jasontt@chromium.org</owner>
   <owner>esum@google.com</owner>
   <owner>assistive-eng@google.com</owner>
@@ -5414,7 +5638,7 @@
 </histogram>
 
 <histogram name="Ash.Pip.AndroidPipUseTime" units="ms"
-    expires_after="2024-01-06">
+    expires_after="2024-03-10">
   <owner>takise@chromium.org</owner>
   <owner>linben@chromium.org</owner>
   <summary>
@@ -5425,7 +5649,7 @@
   </summary>
 </histogram>
 
-<histogram name="Ash.Pip.Events" enum="AshPipEvents" expires_after="2024-01-06">
+<histogram name="Ash.Pip.Events" enum="AshPipEvents" expires_after="2024-03-10">
   <owner>takise@chromium.org</owner>
   <owner>linben@chromium.org</owner>
   <summary>
@@ -5552,7 +5776,7 @@
 </histogram>
 
 <histogram name="Ash.PrivacyIndicators.Source" enum="PrivacyIndicatorsSource"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>leandre@chromium.org</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -5794,7 +6018,7 @@
 <histogram name="Ash.Rotation.AnimationSmoothness" units="%"
     expires_after="2024-04-16">
   <owner>xiyuan@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>cros-sw-perf@google.com</owner>
   <summary>
     Relative smoothness of animations when rotating screen. 100% represents
     ideally smooth 60 frames per second. 50% represents only 30 frames per
@@ -6094,17 +6318,6 @@
   </summary>
 </histogram>
 
-<histogram name="Ash.Shelf.Palette.Usage" enum="PaletteTrayOptions"
-    expires_after="2022-04-17">
-  <owner>amehfooz@chromium.org</owner>
-  <owner>cros-status-area@google.com</owner>
-  <owner>gzadina@chromium.org</owner>
-  <summary>
-    Recorded every time that the palette option has been selected from the
-    palette that has been opened manually (not via a stylus eject event).
-  </summary>
-</histogram>
-
 <histogram name="Ash.Shelf.Palette.Usage.AutoOpened" enum="PaletteTrayOptions"
     expires_after="2021-12-12">
   <obsolete>
@@ -6236,7 +6449,7 @@
 <histogram name="Ash.Smoothness.PercentDroppedFrames_1sWindow2{Stage}"
     units="%" expires_after="2024-01-29">
   <owner>xiyuan@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>cros-sw-perf@google.com</owner>
   <summary>
     Tracks the percent of dropped frames in a 1 second sliding window.
 
@@ -6266,7 +6479,7 @@
     deprecated in favor of Ash.Smoothness.PercentDroppedFrames_1sWindow2.
   </obsolete>
   <owner>xiyuan@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>cros-sw-perf@google.com</owner>
   <summary>
     Tracks the percent of dropped frames in a 1 second sliding window.
 
@@ -6458,7 +6671,7 @@
   <owner>xdai@chromium.org</owner>
   <owner>omrilio@chromium.org</owner>
   <owner>oshima@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>chromeos-wmp@google.com</owner>
   <summary>
     Maximum latency of the presentation time while resizing one or two split
     view windows. {SplitViewResizeModes}
@@ -6471,7 +6684,7 @@
   <owner>xdai@chromium.org</owner>
   <owner>omrilio@chromium.org</owner>
   <owner>oshima@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>chromeos-wmp@google.com</owner>
   <summary>
     Presentation time while resizing one or two split view windows.
     {SplitViewResizeModes}
@@ -6874,7 +7087,7 @@
 </histogram>
 
 <histogram name="Ash.UserDataStatsRecorder.DataSize.{ItemName}" units="MB"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>ythjkt@chromium.org</owner>
   <owner>hidehiko@chromium.org</owner>
   <summary>
@@ -7320,8 +7533,13 @@
     <variant name="Customized"/>
     <variant name="Daily"/>
     <variant name="DailyGooglePhotos"/>
+    <variant name="Default"/>
+    <variant name="Device"/>
     <variant name="OnceGooglePhotos"/>
     <variant name="Online"/>
+    <variant name="Oobe"/>
+    <variant name="Policy"/>
+    <variant name="ThirdParty"/>
   </token>
 </histogram>
 
@@ -7385,7 +7603,7 @@
     expires_after="2024-07-24">
   <owner>oshima@chromium.org</owner>
   <owner>sammiequon@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>chromeos-wmp@google.com</owner>
   <summary>
     Relative smoothness of minimizing window animation. 100% represents ideally
     smooth 60 frames per second. 50% represents when only 30 frames per second
@@ -7399,7 +7617,7 @@
     expires_after="2024-05-15">
   <owner>oshima@chromium.org</owner>
   <owner>sammiequon@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>chromeos-wmp@google.com</owner>
   <summary>
     Relative smoothness of snapping window animation. 100% represents ideally
     smooth 60 frames per second. 50% represents when only 30 frames per second
@@ -7414,7 +7632,7 @@
     expires_after="2024-05-15">
   <owner>oshima@chromium.org</owner>
   <owner>sammiequon@chromium.org</owner>
-  <owner>chromeos-perfmetrics-eng@google.com</owner>
+  <owner>chromeos-wmp@google.com</owner>
   <summary>
     Relative smoothness of unminimizing window animation. 100% represents
     ideally smooth 60 frames per second. 50% represents when only 30 frames per
diff --git a/tools/metrics/histograms/metadata/ash_user_education/histograms.xml b/tools/metrics/histograms/metadata/ash_user_education/histograms.xml
index 4363bf0..1db46b3cb8 100644
--- a/tools/metrics/histograms/metadata/ash_user_education/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash_user_education/histograms.xml
@@ -29,7 +29,7 @@
 </variants>
 
 <histogram name="Ash.WelcomeTour.Aborted.Reason"
-    enum="WelcomeTourAbortedReason" expires_after="2024-01-01">
+    enum="WelcomeTourAbortedReason" expires_after="2024-03-03">
   <owner>angusmclean@google.com</owner>
   <owner>dmblack@google.com</owner>
   <summary>
@@ -38,7 +38,7 @@
 </histogram>
 
 <histogram name="Ash.WelcomeTour.Prevented.Reason"
-    enum="WelcomeTourPreventedReason" expires_after="2024-01-01">
+    enum="WelcomeTourPreventedReason" expires_after="2024-03-03">
   <owner>angusmclean@google.com</owner>
   <owner>dmblack@google.com</owner>
   <summary>
@@ -75,7 +75,7 @@
 </histogram>
 
 <histogram name="Ash.WelcomeTour.Step.Shown" enum="WelcomeTourStep"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>angusmclean@google.com</owner>
   <owner>dmblack@google.com</owner>
   <summary>
@@ -118,6 +118,7 @@
   </summary>
   <token key="Completion" variants="Completion"/>
   <token key="Interaction">
+    <variant name="ExploreApp" summary="the Explore app"/>
     <variant name="FilesApp" summary="the Files app"/>
     <variant name="Launcher" summary="the Launcher"/>
     <variant name="QuickSettings" summary="Quick Settings"/>
diff --git a/tools/metrics/histograms/metadata/assistant/histograms.xml b/tools/metrics/histograms/metadata/assistant/histograms.xml
index f2ce862..6a6dac7 100644
--- a/tools/metrics/histograms/metadata/assistant/histograms.xml
+++ b/tools/metrics/histograms/metadata/assistant/histograms.xml
@@ -65,7 +65,7 @@
 </histogram>
 
 <histogram name="Assistant.DspHotwordDetection"
-    enum="DspHotwordDetectionStatus" expires_after="2024-01-07">
+    enum="DspHotwordDetectionStatus" expires_after="2024-03-10">
   <owner>xiaohuic@chromium.org</owner>
   <owner>croissant-eng@chromium.org</owner>
   <summary>
@@ -165,7 +165,7 @@
 </histogram>
 
 <histogram name="Assistant.QueryCountPerEntryPoint" enum="AssistantEntryPoint"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>xiaohuic@chromium.org</owner>
   <owner>croissant-eng@chromium.org</owner>
   <summary>Number of queries fired for each entry point.</summary>
@@ -201,7 +201,7 @@
 </histogram>
 
 <histogram name="Assistant.ServiceReadyTime" units="ms"
-    expires_after="2023-12-17">
+    expires_after="2024-03-10">
   <owner>xiaohuic@chromium.org</owner>
   <owner>assistive-eng@google.com</owner>
   <summary>
@@ -219,7 +219,7 @@
 </histogram>
 
 <histogram name="Assistant.ServiceState" enum="AssistantServiceState"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>wutao@chromium.org</owner>
   <owner>assistive-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/auto/histograms.xml b/tools/metrics/histograms/metadata/auto/histograms.xml
index 38c17ff..f6b30fa 100644
--- a/tools/metrics/histograms/metadata/auto/histograms.xml
+++ b/tools/metrics/histograms/metadata/auto/histograms.xml
@@ -115,7 +115,7 @@
 </histogram>
 
 <histogram name="AutoScreenBrightness.AlsReaderStatus"
-    enum="AutoScreenBrightnessAlsReaderStatus" expires_after="2023-12-31">
+    enum="AutoScreenBrightnessAlsReaderStatus" expires_after="2024-03-03">
   <owner>thanhdng@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <summary>
@@ -192,7 +192,7 @@
 </histogram>
 
 <histogram name="AutoScreenBrightness.DailyUserAdjustment.Kohaku" units="count"
-    expires_after="2023-12-31">
+    expires_after="2024-03-10">
   <owner>thanhdng@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <summary>
@@ -290,7 +290,7 @@
 </histogram>
 
 <histogram name="AutoScreenBrightness.GlobalCurveResetOnInitialization"
-    enum="Boolean" expires_after="2023-12-31">
+    enum="Boolean" expires_after="2024-03-03">
   <owner>thanhdng@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <summary>Whether the global curve is reset at initialization.</summary>
@@ -486,7 +486,7 @@
 </histogram>
 
 <histogram name="AutoScreenBrightness.UserAdjustmentEffect"
-    enum="AutoScreenBrightnessUserAdjustmentEffect" expires_after="2023-12-31">
+    enum="AutoScreenBrightnessUserAdjustmentEffect" expires_after="2024-03-03">
   <owner>thanhdng@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml
index ff630d7..ea79e9c 100644
--- a/tools/metrics/histograms/metadata/autofill/histograms.xml
+++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -98,6 +98,8 @@
 </variants>
 
 <variants name="Autofill.MandatoryReauth.Source">
+  <variant name="CheckoutFullServerCard"
+      summary="Feature is trying to be updated from full server card checkout"/>
   <variant name="CheckoutLocalCard"
       summary="Feature is trying to be updated from local card checkout"/>
   <variant name="CheckoutVirtualCard"
@@ -380,7 +382,7 @@
 
 <histogram name="Autofill.Address.IsEnabled.PageLoad" enum="BooleanEnabled"
     expires_after="2024-02-20">
-  <owner>jsaul@google.com</owner>
+  <owner>koerber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
     Tracks whether Profile (Address) Autofill is enabled on page load for a page
@@ -390,7 +392,7 @@
 
 <histogram name="Autofill.Address.IsEnabled.Startup" enum="BooleanEnabled"
     expires_after="2024-02-25">
-  <owner>jsaul@google.com</owner>
+  <owner>koerber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
     Tracks whether Profile (Address) Autofill is enabled when Chrome launches.
@@ -486,7 +488,7 @@
 
 <histogram
     name="Autofill.Autocomplete.NotOff.EditedAutofilledFieldAtSubmission2{AutofillFormType}"
-    enum="AutofilledFieldUserEditingStatus" expires_after="2024-01-09">
+    enum="AutofilledFieldUserEditingStatus" expires_after="2024-03-10">
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -501,7 +503,7 @@
 
 <histogram
     name="Autofill.Autocomplete.NotOff.EditedAutofilledFieldAtSubmission{AutofillFormType}"
-    enum="AutofilledFieldUserEditingStatus" expires_after="2024-01-09">
+    enum="AutofilledFieldUserEditingStatus" expires_after="2024-03-10">
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -516,7 +518,7 @@
 
 <histogram
     name="Autofill.Autocomplete.NotOff.FillingAcceptance{AutofillFormType}"
-    enum="BooleanAutofillFillingAcceptance" expires_after="2024-01-09">
+    enum="BooleanAutofillFillingAcceptance" expires_after="2024-03-10">
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -531,7 +533,7 @@
 
 <histogram
     name="Autofill.Autocomplete.Off.EditedAutofilledFieldAtSubmission2{AutofillFormType}"
-    enum="AutofilledFieldUserEditingStatus" expires_after="2024-01-09">
+    enum="AutofilledFieldUserEditingStatus" expires_after="2024-03-10">
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -560,7 +562,7 @@
 </histogram>
 
 <histogram name="Autofill.Autocomplete.Off.FillingAcceptance{AutofillFormType}"
-    enum="BooleanAutofillFillingAcceptance" expires_after="2024-01-09">
+    enum="BooleanAutofillFillingAcceptance" expires_after="2024-03-10">
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -574,7 +576,7 @@
 </histogram>
 
 <histogram name="Autofill.Autocomplete.PredictionCollisionState"
-    enum="PredictionStateAutocompleteStatePair" expires_after="2023-12-31">
+    enum="PredictionStateAutocompleteStatePair" expires_after="2024-03-03">
   <owner>koerber@google.com</owner>
   <owner>fleimgruber@google.com</owner>
   <owner>chrome-autofill-team@google.com</owner>
@@ -660,7 +662,7 @@
 <histogram
     name="Autofill.AutocompleteAttributeForFieldsWith.{FieldType}.{PredictionType}.Prediction"
     enum="AutocompleteValueForStructuredAddressPredictedFields"
-    expires_after="2023-09-13">
+    expires_after="2024-03-30">
   <owner>jihadghanna@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -694,7 +696,7 @@
 </histogram>
 
 <histogram name="Autofill.BetterAuth.CardUnmaskDuration.Fido" units="ms"
-    expires_after="2024-05-01">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -706,7 +708,7 @@
 
 <histogram
     name="Autofill.BetterAuth.CardUnmaskDuration.Fido.{CardType}.{Result}"
-    units="ms" expires_after="2024-05-01">
+    units="ms" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -741,7 +743,7 @@
 
 <histogram
     name="Autofill.BetterAuth.CardUnmaskPreflightCalledWithFidoOptInStatus"
-    enum="Boolean" expires_after="2024-05-01">
+    enum="Boolean" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -762,7 +764,7 @@
 </histogram>
 
 <histogram name="Autofill.BetterAuth.CardUnmaskPreflightDuration" units="ms"
-    expires_after="2024-05-01">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -775,7 +777,7 @@
 </histogram>
 
 <histogram name="Autofill.BetterAuth.CardUnmaskPreflightInitiated"
-    enum="Boolean" expires_after="2024-05-01">
+    enum="Boolean" expires_after="2024-07-01">
   <owner>vinnypersky@google.com</owner>
   <owner>autofill-auth-team@google.com</owner>
   <summary>
@@ -787,7 +789,7 @@
 </histogram>
 
 <histogram name="Autofill.BetterAuth.CardUnmaskTypeDecision"
-    enum="AutofillCreditCardUnmaskDecisionMetric" expires_after="2024-05-01">
+    enum="AutofillCreditCardUnmaskDecisionMetric" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -801,7 +803,7 @@
 
 <histogram
     name="Autofill.BetterAuth.FlowEvents.{BetterAuthFlowType}.{CardType}"
-    enum="AutofillCreditCardAuthenticationEvents" expires_after="2024-05-01">
+    enum="AutofillCreditCardAuthenticationEvents" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -816,7 +818,7 @@
 
 <histogram
     name="Autofill.BetterAuth.FlowEvents{AutofillCreditCardAuthenticationFlows}"
-    enum="AutofillCreditCardAuthenticationEvents" expires_after="2024-05-01">
+    enum="AutofillCreditCardAuthenticationEvents" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -837,7 +839,7 @@
 
 <histogram
     name="Autofill.BetterAuth.OptInCalled{AutofillCreditCardWebauthnOptInOrigin}"
-    enum="AutofillCreditCardWebauthnOptInParameters" expires_after="2024-05-01">
+    enum="AutofillCreditCardWebauthnOptInParameters" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -853,7 +855,7 @@
 </histogram>
 
 <histogram name="Autofill.BetterAuth.OptInPromoNotOfferedReason"
-    enum="WebauthnOptInPromoNotOfferedReason" expires_after="2024-05-01">
+    enum="WebauthnOptInPromoNotOfferedReason" expires_after="2024-07-01">
   <owner>vinnypersky@google.com</owner>
   <owner>shgar@google.com</owner>
   <summary>
@@ -867,7 +869,7 @@
 
 <histogram
     name="Autofill.BetterAuth.OptInPromoShown{AutofillCreditCardWebauthnOptInOrigin}"
-    enum="BooleanHit" expires_after="2024-05-01">
+    enum="BooleanHit" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -890,7 +892,7 @@
 
 <histogram
     name="Autofill.BetterAuth.OptInPromoUserDecision{AutofillCreditCardWebauthnOptInOrigin}"
-    enum="AutofillWebauthnOptInPromoUserDecision" expires_after="2024-05-01">
+    enum="AutofillWebauthnOptInPromoUserDecision" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -906,7 +908,7 @@
 </histogram>
 
 <histogram name="Autofill.BetterAuth.OptOutCalled.FromSettingsPage"
-    enum="BooleanHit" expires_after="2024-05-01">
+    enum="BooleanHit" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -923,7 +925,7 @@
 
 <histogram
     name="Autofill.BetterAuth.UserPerceivedLatencyOnCardSelection.OptedIn.Duration"
-    units="ms" expires_after="2024-05-01">
+    units="ms" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -939,7 +941,7 @@
 <histogram
     name="Autofill.BetterAuth.UserPerceivedLatencyOnCardSelection.OptedIn.TimedOutCvcFallback"
     enum="AutofillCreditCardUserPerceivedLatencyFollowUp"
-    expires_after="2024-05-01">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -954,7 +956,7 @@
 
 <histogram
     name="Autofill.BetterAuth.UserPerceivedLatencyOnCardSelection{AutofillFidoAuthenticationEnabledState}"
-    enum="AutofillCreditCardPreflightCallEvent" expires_after="2024-05-01">
+    enum="AutofillCreditCardPreflightCallEvent" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -972,7 +974,7 @@
 </histogram>
 
 <histogram name="Autofill.BetterAuth.UserVerifiabilityCheckDuration" units="ms"
-    expires_after="2024-05-01">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -985,7 +987,7 @@
 
 <histogram
     name="Autofill.BetterAuth.WebauthnResult{AutofillFidoUserVerificationFlow}"
-    enum="AutofillCreditCardWebauthnResultMetric" expires_after="2024-05-01">
+    enum="AutofillCreditCardWebauthnResultMetric" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>autofill-auth-team@google.com</owner>
@@ -1006,7 +1008,7 @@
 </histogram>
 
 <histogram name="Autofill.CardholderNameFixFlowPrompt.Events"
-    enum="AutofillCardholderNameFixFlowPromptEvent" expires_after="2024-05-01">
+    enum="AutofillCardholderNameFixFlowPromptEvent" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -1018,7 +1020,7 @@
 </histogram>
 
 <histogram name="Autofill.CardUnmask.ScreenLockCheckBox.InitialState"
-    enum="CheckBoxStatus" expires_after="2024-03-01">
+    enum="CheckBoxStatus" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siashah@chromium.org</owner>
   <owner>longsheng@chromium.org</owner>
@@ -1032,7 +1034,7 @@
 </histogram>
 
 <histogram name="Autofill.CardUnmask.ScreenLockCheckBox.UserChecked"
-    enum="Boolean" expires_after="2024-03-01">
+    enum="Boolean" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siashah@chromium.org</owner>
   <owner>longsheng@chromium.org</owner>
@@ -1047,7 +1049,7 @@
 
 <histogram name="Autofill.CardUnmaskAuthenticationSelectionDialog.Result"
     enum="AutofillCardUnmaskAuthenticationSelectionDialogResult"
-    expires_after="2024-02-25">
+    expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <owner>siashah@chromium.org</owner>
@@ -1076,7 +1078,7 @@
 </histogram>
 
 <histogram name="Autofill.CardUnmaskAuthenticationSelectionDialog.Shown2"
-    units="challenge_options" expires_after="2024-01-14">
+    units="challenge_options" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <owner>siashah@chromium.org</owner>
@@ -1090,7 +1092,7 @@
 </histogram>
 
 <histogram name="Autofill.CardUploadDecisionMetric"
-    enum="AutofillCardUploadDecisionMetric" expires_after="2024-01-07">
+    enum="AutofillCardUploadDecisionMetric" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -1102,9 +1104,10 @@
 </histogram>
 
 <histogram name="Autofill.CardUploadEnabled" enum="AutofillCardUploadEnabled"
-    expires_after="2024-02-20">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>aneeshali@google.com</owner>
+  <owner>payments-autofill-team@google.com</owner>
   <summary>
     Detailed reasons why (or why not) card upload was enabled. When a user
     submits a form, this check is triggered to decide whether to ask the user if
@@ -1113,7 +1116,7 @@
 </histogram>
 
 <histogram name="Autofill.CreditCard.IsEnabled.PageLoad" enum="BooleanEnabled"
-    expires_after="2024-02-25">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -1123,7 +1126,7 @@
 </histogram>
 
 <histogram name="Autofill.CreditCard.IsEnabled.Startup" enum="BooleanEnabled"
-    expires_after="2024-01-14">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -1202,7 +1205,7 @@
 
 <histogram
     name="Autofill.CreditCard.SelectionLatencySinceShown.CardWithIssuerId.{CardMetadataVisible}.{CardIssuerId}"
-    units="ms" expires_after="2024-03-01">
+    units="ms" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -1219,7 +1222,7 @@
 
 <histogram
     name="Autofill.CreditCard.SelectionLatencySinceShown.{CardMetadataVisible}"
-    units="ms" expires_after="2024-03-01">
+    units="ms" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -1255,7 +1258,7 @@
 </histogram>
 
 <histogram name="Autofill.CreditCard.{CardIssuer}.{FormEventWithMetadata}"
-    enum="Boolean" expires_after="2024-03-01">
+    enum="Boolean" expires_after="2024-07-01">
   <owner>vishwasuppoor@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -1301,7 +1304,7 @@
 </histogram>
 
 <histogram name="Autofill.CreditCardFillingInfoBar"
-    enum="AutofillCreditCardInfoBar" expires_after="2023-12-12">
+    enum="AutofillCreditCardInfoBar" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -1312,7 +1315,7 @@
 </histogram>
 
 <histogram name="Autofill.CreditCardInfoBar{AutofillCreditCardInfoBarSaveType}"
-    enum="AutofillCreditCardInfoBar" expires_after="2024-02-20">
+    enum="AutofillCreditCardInfoBar" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -1413,20 +1416,20 @@
 </histogram>
 
 <histogram name="Autofill.CreditCardsDeletedForDisuse" units="units"
-    expires_after="2023-12-12">
+    expires_after="2024-02-11">
   <owner>battre@chromium.org</owner>
-  <owner>jsaul@google.com</owner>
+  <owner>koerber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
-    The number of credit card deleted during a major version upgrade because
-    they have not been used recently enough and are expired.
+    The number of local credit cards deleted during a major version upgrade
+    because they have not been used recently enough and are expired.
   </summary>
 </histogram>
 
 <histogram name="Autofill.CreditCardsSuppressedForDisuse" units="units"
     expires_after="2024-02-11">
   <owner>battre@chromium.org</owner>
-  <owner>jsaul@google.com</owner>
+  <owner>koerber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
     The number of credit card suggestions not shown in the Autofill popup
@@ -1450,7 +1453,7 @@
 </histogram>
 
 <histogram name="Autofill.CvcAuth.{CardType}.Attempt" enum="BooleanAttempted"
-    expires_after="2024-02-20">
+    expires_after="2024-07-01">
   <owner>vinnypersky@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -1462,7 +1465,7 @@
 </histogram>
 
 <histogram name="Autofill.CvcAuth.{CardType}.Result"
-    enum="AutofillCvcAuthEvent" expires_after="2024-02-20">
+    enum="AutofillCvcAuthEvent" expires_after="2024-07-01">
   <owner>vinnypersky@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -1476,7 +1479,7 @@
 </histogram>
 
 <histogram name="Autofill.CvcAuth.{CardType}.RetryableError"
-    enum="AutofillCvcAuthEvent" expires_after="2023-11-01">
+    enum="AutofillCvcAuthEvent" expires_after="2024-07-01">
   <owner>vinnypersky@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -1520,7 +1523,7 @@
 </histogram>
 
 <histogram name="Autofill.DaysSinceLastUse.StoredIban{IbanTypeToBeSaved}"
-    units="days" expires_after="2024-02-20">
+    units="days" expires_after="2024-07-01">
   <owner>qihuizhao@google.com</owner>
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -1617,28 +1620,36 @@
 </histogram>
 
 <histogram name="Autofill.ErrorDialogShown" enum="AutofillErrorDialogType"
-    expires_after="2023-09-01">
+    expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>siashah@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <summary>
     Log when an autofill error dialog is shown to the user along with its type.
+    The type here denotes the flows in which the dialog is shown. Such flows
+    include virtual card retrieval, masked server card risk based authentication
+    and etc. See &quot;AutofillErrorDialogType&quot; for details.
   </summary>
 </histogram>
 
 <histogram name="Autofill.ErrorDialogShown.WithServerText"
-    enum="AutofillErrorDialogType" expires_after="2023-09-01">
+    enum="AutofillErrorDialogType" expires_after="2024-07-01">
   <owner>vinnypersky@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
-    Logs when an autofill error dialog is shown to the user with server returned
-    text, along with its type.
+    Logs when an autofill error dialog is shown along with its type. The type
+    here denotes the flows in which the dialog is shown. Such flows include
+    virtual card retrieval, masked server card risk based authentication and
+    etc. See &quot;AutofillErrorDialogType&quot; for details. This is a
+    secondary histogram to the &quot;Autofill.ErrorDialogShown&quot; and it is
+    logged when server side returns text to override the static client-side
+    error messages to be shown in the dialog.
   </summary>
 </histogram>
 
 <histogram name="Autofill.ExpirationDateFixFlowPrompt.Events"
-    enum="AutofillExpirationDateFixFlowPromptEvent" expires_after="2024-05-01">
+    enum="AutofillExpirationDateFixFlowPromptEvent" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siashah@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -1650,7 +1661,7 @@
 </histogram>
 
 <histogram name="Autofill.ExpirationDateFixFlowPromptShown" enum="Boolean"
-    expires_after="2024-05-01">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siashah@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -2049,7 +2060,8 @@
 <histogram name="Autofill.FormEvents.Address{AutofillDataAvailability}"
     enum="AutofillFormEvent" expires_after="2024-02-20">
   <owner>battre@chromium.org</owner>
-  <owner>jsaul@google.com</owner>
+  <owner>koerber@google.com</owner>
+  <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
     Autofill form events for address forms. These are recorded when the user
     interacts with a form requesting an address. {AutofillDataAvailability}
@@ -2070,7 +2082,7 @@
 </histogram>
 
 <histogram name="Autofill.FormEvents.CreditCard.WithOffer"
-    enum="AutofillFormEvent" expires_after="2023-09-01">
+    enum="AutofillFormEvent" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <summary>
@@ -2081,7 +2093,7 @@
 </histogram>
 
 <histogram name="Autofill.FormEvents.CreditCard{AutofillDataAvailability}"
-    enum="AutofillFormEvent" expires_after="2024-02-20">
+    enum="AutofillFormEvent" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>battre@chromium.org</owner>
   <summary>
@@ -2103,6 +2115,45 @@
   </token>
 </histogram>
 
+<histogram name="Autofill.FormFillingComplexScore.{AutofillFormType}"
+    units="complex filling score" expires_after="2024-08-20">
+  <owner>koerber@google.com</owner>
+  <owner>chrome-autofill-alerts@google.com</owner>
+  <summary>
+    For {AutofillFormType} logs a filling complex score on form submission that
+    is calculated as following:
+
+    Score = 10 * number_of_accepted_fields + number_of_corrected_fields
+
+    The score resembles a two dimensional histogram to evaluate the number of
+    accepted fields against the number of corrected ones. Both number of fields
+    used in the score are limited to 9 to guaranteed that the score will be
+    within 0 and 99 and that the significant digit corresponds to the number of
+    accepted fields while the least significant digit corresponds to the number
+    of corrected fields.
+
+    The score is only emitted when there is at least one correct or accepted
+    field.
+  </summary>
+  <token key="AutofillFormType" variants="AutofillFormType"/>
+</histogram>
+
+<histogram name="Autofill.FormFillingScore.{AutofillFormType}"
+    units="filling score" expires_after="2024-08-20">
+  <owner>koerber@google.com</owner>
+  <owner>chrome-autofill-alerts@google.com</owner>
+  <summary>
+    For {AutofillFormType} logs a filling score on form submission that is
+    calculated as following:
+
+    Score = 2 * number_of_accepted_fields - 3 * number_of_corrected_fields + 100
+
+    The score is only emitted when there is at least one correct or accepted
+    field.
+  </summary>
+  <token key="AutofillFormType" variants="AutofillFormType"/>
+</histogram>
+
 <histogram name="Autofill.FormFillSuccessIOS"
     enum="BooleanAutofillFormFillSuccessIOS" expires_after="2023-02-12">
   <owner>tmartino@chromium.org</owner>
@@ -2347,7 +2398,7 @@
 </histogram>
 
 <histogram name="Autofill.Iban.Suggestions" enum="IbanSuggestionsEvent"
-    expires_after="2024-03-01">
+    expires_after="2024-07-01">
   <owner>qihuizhao@google.com</owner>
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -2363,7 +2414,7 @@
 <histogram name="Autofill.Iframes.NumberOfFramesWithAutofilledCreditCardFields"
     units="frames" expires_after="2023-01-01">
   <obsolete>
-    The metric has been not produced meaningful results.
+    The metric has not produced meaningful results.
   </obsolete>
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -2382,7 +2433,7 @@
 <histogram name="Autofill.Iframes.NumberOfFramesWithDetectedCreditCardFields"
     units="frames" expires_after="2023-01-01">
   <obsolete>
-    The metric has been not produced meaningful results.
+    The metric has not produced meaningful results.
   </obsolete>
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -2401,7 +2452,7 @@
 <histogram name="Autofill.Iframes.NumberOfFramesWithDetectedFields"
     units="frames" expires_after="2023-01-01">
   <obsolete>
-    The metric has been not produced meaningful results.
+    The metric has not produced meaningful results.
   </obsolete>
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -2418,7 +2469,7 @@
 </histogram>
 
 <histogram name="Autofill.ImageFetcher.RequestLatency" units="ms"
-    expires_after="2024-06-01">
+    expires_after="2024-07-01">
   <owner>vishwasuppoor@chromium.org</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -2429,7 +2480,7 @@
 </histogram>
 
 <histogram name="Autofill.ImageFetcher.Result" enum="BooleanSuccess"
-    expires_after="2024-06-01">
+    expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -2440,8 +2491,8 @@
 
 <histogram name="Autofill.IsEnabled.PageLoad" enum="BooleanEnabled"
     expires_after="2024-02-11">
-  <owner>jsaul@google.com</owner>
   <owner>battre@chromium.org</owner>
+  <owner>jsaul@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
     This includes Autofill.Address.IsEnabled.PageLoad and
@@ -2454,8 +2505,8 @@
 
 <histogram name="Autofill.IsEnabled.Startup" enum="BooleanEnabled"
     expires_after="2024-02-11">
-  <owner>jsaul@google.com</owner>
   <owner>battre@chromium.org</owner>
+  <owner>jsaul@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
     This includes Autofill.Address.IsEnabled.Startup and
@@ -2612,36 +2663,14 @@
   <token key="AutofillFormType" variants="AutofillFormType"/>
 </histogram>
 
-<histogram name="Autofill.LabelInference.AssignedLabelSource"
-    enum="AssignedLabelSource" expires_after="2024-02-25">
-  <owner>fleimgruber@google.com</owner>
-  <owner>chrome-autofill-team@google.com</owner>
-  <summary>
-    Logs how a &lt;label for=x&gt; element was assigned to an input. Emitted
-    once per inferred label (and thus potentially multiple times per field)
-    during label inference.
-  </summary>
-</histogram>
-
-<histogram name="Autofill.LabelInference.InferredLabelSource"
-    enum="InferredLabelSource" expires_after="2024-02-25">
-  <owner>fleimgruber@google.com</owner>
-  <owner>chrome-autofill-team@google.com</owner>
-  <summary>
-    Logs how/if the label of an input was derived. Emitted once per field during
-    label inference.
-  </summary>
-</histogram>
-
-<histogram name="Autofill.LabelInference.InferredLabelSource.AtSubmission"
+<histogram name="Autofill.LabelInference.InferredLabelSource.AtSubmission2"
     enum="InferredLabelSource" expires_after="2024-01-28">
   <owner>fleimgruber@google.com</owner>
   <owner>chrome-autofill-team@google.com</owner>
   <summary>
     Logs how/if the label of an input was derived. Emitted at form submission
     for every field where the data the user entered matches some stored Autofill
-    data. This is in contrast to Autofill.LabelInference.InferredLabelSource,
-    which is emitted for every extracted field.
+    data.
   </summary>
 </histogram>
 
@@ -2693,7 +2722,7 @@
 </histogram>
 
 <histogram name="Autofill.LocalCardMigrationBubbleOffer.{ShowType}"
-    enum="AutofillLocalCardMigrationBubbleOffer" expires_after="2023-09-01">
+    enum="AutofillLocalCardMigrationBubbleOffer" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <summary>
@@ -2704,7 +2733,7 @@
 </histogram>
 
 <histogram name="Autofill.LocalCardMigrationBubbleResult.{ShowType}"
-    enum="AutofillLocalCardMigrationBubbleResult" expires_after="2023-09-01">
+    enum="AutofillLocalCardMigrationBubbleResult" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <summary>
@@ -2716,14 +2745,14 @@
 
 <histogram name="Autofill.LocalCardMigrationBubbleUserInteraction"
     enum="AutofillLocalCardMigrationBubbleUserInteraction"
-    expires_after="2023-09-01">
+    expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <summary>Record how bubble is closed by different user interactions.</summary>
 </histogram>
 
 <histogram name="Autofill.LocalCardMigrationDecision"
-    enum="AutofillLocalCardMigrationDecisionMetric" expires_after="2024-01-21">
+    enum="AutofillLocalCardMigrationDecisionMetric" expires_after="2024-07-01">
   <owner>sujiezhu@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
@@ -2735,7 +2764,7 @@
 
 <histogram
     name="Autofill.LocalCardMigrationDialogActiveDuration{AutofillLocalCardMigrationDialogDurationWithCloseEvent}"
-    units="ms" expires_after="2023-09-01">
+    units="ms" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <summary>
@@ -2757,7 +2786,7 @@
 </histogram>
 
 <histogram name="Autofill.LocalCardMigrationDialogOffer"
-    enum="AutofillLocalCardMigrationDialogOffer" expires_after="2023-09-01">
+    enum="AutofillLocalCardMigrationDialogOffer" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <summary>
@@ -2767,7 +2796,7 @@
 
 <histogram name="Autofill.LocalCardMigrationDialogUserInteraction"
     enum="AutofillLocalCardMigrationDialogUserInteraction"
-    expires_after="2024-01-14">
+    expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <summary>
@@ -2776,7 +2805,7 @@
 </histogram>
 
 <histogram name="Autofill.LocalCardMigrationDialogUserSelectionPercentage"
-    units="%" expires_after="2023-09-01">
+    units="%" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <summary>
@@ -2786,7 +2815,7 @@
 
 <histogram
     name="Autofill.LocalCardMigrationOrigin{AutofillLocalCardMigrationOrigin}"
-    enum="LocalCardMigrationPrompt" expires_after="2023-09-01">
+    enum="LocalCardMigrationPrompt" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <summary>
@@ -2804,7 +2833,7 @@
 </histogram>
 
 <histogram name="Autofill.LogEvent.{LogEventTypes}" units="units"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -2838,7 +2867,7 @@
 </histogram>
 
 <histogram name="Autofill.ManageCardsPrompt{AutofillManageCardsPrompt}"
-    enum="AutofillManageCardsPrompt" expires_after="2024-04-01">
+    enum="AutofillManageCardsPrompt" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <summary>
@@ -2906,7 +2935,7 @@
 </histogram>
 
 <histogram name="Autofill.NewerStreetAddressWithSameStatusIsChosen"
-    enum="Boolean" expires_after="2023-12-04">
+    enum="Boolean" expires_after="2024-03-30">
   <owner>jihadghanna@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -3209,7 +3238,7 @@
 
 <histogram
     name="Autofill.OfferNotificationBubblePromoCodeButtonClicked.{BubbleType}"
-    enum="BooleanClicked" expires_after="2024-04-01">
+    enum="BooleanClicked" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -3223,7 +3252,7 @@
 
 <histogram
     name="Autofill.OfferNotificationBubbleResult.{BubbleType}.{ShowType}"
-    enum="AutofillOfferNotificationBubbleResult" expires_after="2024-04-01">
+    enum="AutofillOfferNotificationBubbleResult" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -3236,7 +3265,7 @@
 </histogram>
 
 <histogram name="Autofill.OfferNotificationBubbleSuppressed.{BubbleType}"
-    enum="BooleanSuppressed" expires_after="2024-04-01">
+    enum="BooleanSuppressed" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>yuezhanggg@chromium.org</owner>
   <owner>siyua@chromium.org</owner>
@@ -3252,7 +3281,7 @@
 </histogram>
 
 <histogram name="Autofill.OfferNotificationInfoBarOffer.{OfferType}"
-    enum="BooleanShown" expires_after="2024-04-01">
+    enum="BooleanShown" expires_after="2024-07-01">
   <owner>siashah@chromium.org</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -3264,7 +3293,7 @@
 </histogram>
 
 <histogram name="Autofill.OfferNotificationInfoBarResult.{OfferType}"
-    enum="AutofillOfferNotificationInfoBarResult" expires_after="2024-04-01">
+    enum="AutofillOfferNotificationInfoBarResult" expires_after="2024-07-01">
   <owner>siashah@chromium.org</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -3276,7 +3305,7 @@
 </histogram>
 
 <histogram name="Autofill.OtpAuth.{OtpAuthType}.Attempt"
-    enum="BooleanAttempted" expires_after="2024-03-01">
+    enum="BooleanAttempted" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3288,7 +3317,7 @@
 
 <histogram
     name="Autofill.OtpAuth.{OtpAuthType}.RequestLatency.SelectChallengeOptionRequest"
-    units="ms" expires_after="2024-03-01">
+    units="ms" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3300,7 +3329,7 @@
 
 <histogram
     name="Autofill.OtpAuth.{OtpAuthType}.RequestLatency.UnmaskCardRequest"
-    units="ms" expires_after="2024-03-01">
+    units="ms" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3311,7 +3340,7 @@
 </histogram>
 
 <histogram name="Autofill.OtpAuth.{OtpAuthType}.Result"
-    enum="AutofillOtpAuthEvent" expires_after="2024-03-01">
+    enum="AutofillOtpAuthEvent" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>Logs the result of the OTP authentication.</summary>
@@ -3319,7 +3348,7 @@
 </histogram>
 
 <histogram name="Autofill.OtpAuth.{OtpAuthType}.RetriableError"
-    enum="AutofillOtpAuthEvent" expires_after="2024-03-01">
+    enum="AutofillOtpAuthEvent" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3329,7 +3358,7 @@
 </histogram>
 
 <histogram name="Autofill.OtpInputDialog.{OtpAuthType}.ErrorMessageShown"
-    enum="AutofillOtpInputDialogError" expires_after="2024-03-01">
+    enum="AutofillOtpInputDialogError" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3340,7 +3369,7 @@
 </histogram>
 
 <histogram name="Autofill.OtpInputDialog.{OtpAuthType}.NewOtpRequested"
-    enum="BooleanRequested" expires_after="2024-03-01">
+    enum="BooleanRequested" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3351,7 +3380,7 @@
 </histogram>
 
 <histogram name="Autofill.OtpInputDialog.{OtpAuthType}.Result"
-    enum="AutofillOtpInputDialogResult" expires_after="2024-03-01">
+    enum="AutofillOtpInputDialogResult" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3361,7 +3390,7 @@
 </histogram>
 
 <histogram name="Autofill.OtpInputDialog.{OtpAuthType}.Result.{WithError}"
-    enum="AutofillOtpInputDialogResult" expires_after="2024-03-01">
+    enum="AutofillOtpInputDialogResult" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3374,7 +3403,7 @@
 </histogram>
 
 <histogram name="Autofill.OtpInputDialog.{OtpAuthType}.Shown"
-    enum="BooleanShown" expires_after="2024-03-01">
+    enum="BooleanShown" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3408,7 +3437,7 @@
 
 <histogram
     name="Autofill.PaymentMethods.CheckoutFlow.ReauthUsage.{CardType}.{AuthenticationMethod}"
-    enum="MandatoryReauthAuthEvent" expires_after="2024-04-01">
+    enum="MandatoryReauthAuthEvent" expires_after="2024-07-01">
   <owner>sujiezhu@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3428,7 +3457,7 @@
 
 <histogram
     name="Autofill.PaymentMethods.MandatoryReauth.AuthEvent.SettingsPage.EditCard"
-    enum="MandatoryReauthAuthEvent" expires_after="2024-04-01">
+    enum="MandatoryReauthAuthEvent" expires_after="2024-07-01">
   <owner>koulvipul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3442,8 +3471,9 @@
 </histogram>
 
 <histogram
-    name="Autofill.PaymentMethods.MandatoryReauth.CheckoutFlow.ReauthOfferOptInDecision"
-    enum="MandatoryReauthOfferOptInDecision" expires_after="2024-04-01">
+    name="Autofill.PaymentMethods.MandatoryReauth.CheckoutFlow.ReauthOfferOptInDecision2"
+    enum="MandatoryReauthOfferOptInDecision" expires_after="2024-07-01">
+  <owner>vinnypersky@google.com</owner>
   <owner>sujiezhu@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3456,7 +3486,7 @@
 
 <histogram
     name="Autofill.PaymentMethods.MandatoryReauth.OptChangeEvent.{Source}.{ChangingStatus}"
-    enum="MandatoryReauthAuthEvent" expires_after="2024-04-01">
+    enum="MandatoryReauthAuthEvent" expires_after="2024-07-01">
   <owner>koulvipul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3474,7 +3504,7 @@
 
 <histogram
     name="Autofill.PaymentMethods.MandatoryReauth.OptInBubbleOffer.{ShowType}"
-    enum="MandatoryReauthOptInBubbleOffer" expires_after="2024-04-01">
+    enum="MandatoryReauthOptInBubbleOffer" expires_after="2024-07-01">
   <owner>justinleewells@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3489,7 +3519,7 @@
 
 <histogram
     name="Autofill.PaymentMethods.MandatoryReauth.OptInBubbleResult.{ShowType}"
-    enum="MandatoryReauthOptInBubbleResult" expires_after="2024-04-01">
+    enum="MandatoryReauthOptInBubbleResult" expires_after="2024-07-01">
   <owner>justinleewells@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3504,7 +3534,7 @@
 <histogram
     name="Autofill.PaymentMethods.MandatoryReauth.OptInConfirmationBubble"
     enum="MandatoryReauthOptInConfirmationBubbleMetric"
-    expires_after="2024-04-01">
+    expires_after="2024-07-01">
   <owner>justinleewells@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3624,7 +3654,7 @@
 </histogram>
 
 <histogram name="Autofill.ProfileImport.NewProfileDecision"
-    enum="AutofillProfileImportDecision" expires_after="2024-01-07">
+    enum="AutofillProfileImportDecision" expires_after="2024-03-10">
   <owner>koerber@google.com</owner>
   <owner>src/components/autofill/OWNERS</owner>
   <summary>
@@ -3745,7 +3775,7 @@
 </histogram>
 
 <histogram name="Autofill.ProfileImport.UpdateProfileDecision"
-    enum="AutofillProfileImportDecision" expires_after="2024-01-07">
+    enum="AutofillProfileImportDecision" expires_after="2024-03-10">
   <owner>koerber@google.com</owner>
   <owner>src/components/autofill/OWNERS</owner>
   <summary>
@@ -3770,7 +3800,7 @@
 
 <histogram
     name="Autofill.ProfileImport.UpdateProfileNumberOfAffectedFields.{Decision}"
-    units="fields" expires_after="2023-10-30">
+    units="fields" expires_after="2024-09-30">
   <owner>koerber@google.com</owner>
   <owner>src/components/autofill/OWNERS</owner>
   <summary>
@@ -3824,7 +3854,7 @@
 </histogram>
 
 <histogram name="Autofill.ProfileImport.UpdateProfileNumberOfEditedFields"
-    units="fields" expires_after="2023-09-11">
+    units="fields" expires_after="2024-09-01">
   <owner>koerber@google.com</owner>
   <owner>src/components/autofill/OWNERS</owner>
   <summary>
@@ -3848,7 +3878,7 @@
 </histogram>
 
 <histogram name="Autofill.ProgressDialog.{FlowType}.Result"
-    enum="BooleanCanceled" expires_after="2024-03-01">
+    enum="BooleanCanceled" expires_after="2024-07-01">
   <owner>siashah@chromium.org</owner>
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
@@ -3867,7 +3897,7 @@
 </histogram>
 
 <histogram name="Autofill.ProgressDialog.{FlowType}.Shown" enum="BooleanShown"
-    expires_after="2024-03-01">
+    expires_after="2024-07-01">
   <owner>siashah@chromium.org</owner>
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
@@ -3956,7 +3986,7 @@
 </histogram>
 
 <histogram name="Autofill.SaveCardCardholderNamePrefilled" enum="Boolean"
-    expires_after="2024-04-01">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3967,7 +3997,7 @@
 </histogram>
 
 <histogram name="Autofill.SaveCardCardholderNameWasEdited" enum="Boolean"
-    expires_after="2024-04-01">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -3991,7 +4021,7 @@
 
 <histogram
     name="Autofill.SaveCreditCardPromptOffer{AutofillSaveCreditCardPromptDestination}"
-    enum="AutofillSavePaymentMethodPromptOfferEnum" expires_after="2023-11-01">
+    enum="AutofillSavePaymentMethodPromptOfferEnum" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -4008,7 +4038,7 @@
 
 <histogram
     name="Autofill.SaveCreditCardPromptResult{AutofillSaveCreditCardPromptDestination}"
-    enum="AutofillSavePaymentMethodPromptResultEnum" expires_after="2023-11-01">
+    enum="AutofillSavePaymentMethodPromptResultEnum" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -4025,7 +4055,7 @@
 
 <histogram
     name="Autofill.SaveCvcPromptOffer{AutofillSaveCreditCardPromptDestination}.{ShowType}"
-    enum="AutofillSavePaymentMethodPromptOfferEnum" expires_after="2024-08-01">
+    enum="AutofillSavePaymentMethodPromptOfferEnum" expires_after="2024-07-01">
   <owner>vishwasuppoor@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -4041,7 +4071,7 @@
 
 <histogram
     name="Autofill.SaveCvcPromptResult{AutofillSaveCreditCardPromptDestination}.{ShowType}"
-    enum="AutofillSavePaymentMethodPromptResultEnum" expires_after="2024-08-01">
+    enum="AutofillSavePaymentMethodPromptResultEnum" expires_after="2024-07-01">
   <owner>vishwasuppoor@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -4117,7 +4147,7 @@
 <histogram name="Autofill.ScanCreditCardPrompt"
     enum="AutofillScanCreditCardPrompt" expires_after="2024-02-11">
   <owner>battre@chromium.org</owner>
-  <owner>jsaul@chromium.org</owner>
+  <owner>koerber@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>Usage of the &quot;Scan card&quot; control item.</summary>
 </histogram>
@@ -4151,7 +4181,7 @@
 </histogram>
 
 <histogram name="Autofill.ServerCardLinkClicked" enum="AutofillSyncState"
-    expires_after="2024-02-11">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -4162,7 +4192,7 @@
 </histogram>
 
 <histogram name="Autofill.ServerCardUnmask.{CardType}.Attempt"
-    enum="BooleanAttempted" expires_after="2024-05-01">
+    enum="BooleanAttempted" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -4173,7 +4203,7 @@
 </histogram>
 
 <histogram name="Autofill.ServerCardUnmask.{CardType}.FormSubmission"
-    enum="BooleanSubmitted" expires_after="2024-05-01">
+    enum="BooleanSubmitted" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -4184,7 +4214,7 @@
 </histogram>
 
 <histogram name="Autofill.ServerCardUnmask.{CardType}.Result.{FlowType}"
-    enum="AutofillServerCardUnmaskResult" expires_after="2024-05-01">
+    enum="AutofillServerCardUnmaskResult" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -4237,7 +4267,7 @@
 </histogram>
 
 <histogram name="Autofill.SettingsPage.ButtonClicked.{CardType}.{Button}"
-    enum="BooleanAttempted" expires_after="2023-12-01">
+    enum="BooleanAttempted" expires_after="2024-07-01">
   <owner>vishwasuppoor@chromium.org</owner>
   <owner>siashah@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -4277,7 +4307,7 @@
 </histogram>
 
 <histogram name="Autofill.Snackbar.{SnackbarType}.ActionClicked"
-    enum="BooleanShown" expires_after="2024-02-20">
+    enum="BooleanShown" expires_after="2024-07-01">
   <owner>siashah@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -4289,7 +4319,7 @@
 </histogram>
 
 <histogram name="Autofill.Snackbar.{SnackbarType}.Shown" enum="BooleanShown"
-    expires_after="2024-02-20">
+    expires_after="2024-07-01">
   <owner>siashah@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -4301,7 +4331,8 @@
 </histogram>
 
 <histogram name="Autofill.StoredCreditCardCount" units="cards"
-    expires_after="2024-02-11">
+    expires_after="2024-07-01">
+  <owner>jsaul@google.com</owner>
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
 <!-- Name completed by histogram_suffixes name="AutofillCreditCardType" -->
@@ -4313,7 +4344,7 @@
 </histogram>
 
 <histogram name="Autofill.StoredCreditCardCount.Server.WithCardArtImage"
-    units="units" expires_after="2024-04-01">
+    units="units" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -4323,7 +4354,7 @@
 </histogram>
 
 <histogram name="Autofill.StoredCreditCardCount.Server.WithVirtualCardMetadata"
-    units="units" expires_after="2024-04-01">
+    units="units" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -4664,7 +4695,7 @@
 </histogram>
 
 <histogram name="Autofill.SubmittedCardState" enum="AutofillSubmittedCardState"
-    expires_after="2024-02-20">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -4675,7 +4706,7 @@
 
 <histogram name="Autofill.SubmittedServerCardExpirationStatus"
     enum="AutofillSubmittedServerCardExpirationStatus"
-    expires_after="2024-02-20">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -4937,7 +4968,7 @@
 
 <histogram
     name="Autofill.UnmaskPrompt.Duration{AutofillUnmaskPromptCloseReasonEvents}"
-    units="ms" expires_after="2024-05-01">
+    units="ms" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <summary>
@@ -4968,7 +4999,7 @@
 </histogram>
 
 <histogram name="Autofill.UnmaskPrompt.GetRealPanDuration" units="ms"
-    expires_after="2024-02-05">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <summary>
@@ -4979,7 +5010,7 @@
 </histogram>
 
 <histogram name="Autofill.UnmaskPrompt.GetRealPanDuration.{CardType}.{Result}"
-    units="ms" expires_after="2024-02-20">
+    units="ms" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -4993,7 +5024,7 @@
 </histogram>
 
 <histogram name="Autofill.UnmaskPrompt.GetRealPanResult"
-    enum="AutofillGetRealPanResult" expires_after="2024-05-01">
+    enum="AutofillGetRealPanResult" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <summary>
@@ -5004,7 +5035,7 @@
 </histogram>
 
 <histogram name="Autofill.UnmaskPrompt.GetRealPanResult.{CardType}"
-    enum="AutofillGetRealPanResult" expires_after="2024-05-01">
+    enum="AutofillGetRealPanResult" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -5018,7 +5049,7 @@
 </histogram>
 
 <histogram name="Autofill.UnmaskPrompt.TimeBeforeAbandonUnmasking" units="ms"
-    expires_after="2024-05-01">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <summary>
@@ -5031,7 +5062,7 @@
 </histogram>
 
 <histogram name="Autofill.UnmaskPrompt.UnmaskingDuration" units="ms"
-    expires_after="2024-05-01">
+    expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <summary>
@@ -5042,7 +5073,7 @@
 </histogram>
 
 <histogram name="Autofill.UnmaskPrompt.UnmaskingDuration.{CardType}.{Result}"
-    units="ms" expires_after="2024-05-01">
+    units="ms" expires_after="2024-07-01">
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <summary>
@@ -5056,7 +5087,7 @@
 </histogram>
 
 <histogram name="Autofill.UnmaskPrompt.{CardType}.Events"
-    enum="AutofillUnmaskPromptEvent" expires_after="2024-02-20">
+    enum="AutofillUnmaskPromptEvent" expires_after="2024-07-01">
   <owner>vinnypersky@google.com</owner>
   <owner>jsaul@google.com</owner>
   <owner>siyua@chromium.org</owner>
@@ -5115,6 +5146,7 @@
 <!-- expires-never: https://crbug.com/975713 -->
 
   <owner>jsaul@google.com</owner>
+  <owner>payments-autofill-team@google.com</owner>
   <summary>
     Measures if a card for which upload was accepted is already stored as a
     local card on the device or if it has not yet been seen.
@@ -5147,6 +5179,7 @@
 <!-- expires-never: https://crbug.com/975713 -->
 
   <owner>jsaul@google.com</owner>
+  <owner>payments-autofill-team@google.com</owner>
   <summary>
     Measures if a card for which upload was offered is already stored as a local
     on the device or if it has not yet been seen.
@@ -5154,7 +5187,7 @@
 </histogram>
 
 <histogram name="Autofill.UsedCachedServerCard" units="uses"
-    expires_after="2024-05-01">
+    expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -5167,7 +5200,7 @@
 </histogram>
 
 <histogram name="Autofill.UsedCachedVirtualCard" units="uses"
-    expires_after="2024-01-21">
+    expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -5194,7 +5227,7 @@
 </histogram>
 
 <histogram name="Autofill.VirtualCard.Enroll.Attempt.{Source}"
-    enum="BooleanAttempted" expires_after="2024-06-01">
+    enum="BooleanAttempted" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -5205,7 +5238,7 @@
 </histogram>
 
 <histogram name="Autofill.VirtualCard.Enroll.Result.{Source}"
-    enum="BooleanSuccess" expires_after="2024-06-01">
+    enum="BooleanSuccess" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -5217,7 +5250,7 @@
 </histogram>
 
 <histogram name="Autofill.VirtualCard.GetDetailsForEnrollment.Attempt.{Source}"
-    enum="BooleanAttempted" expires_after="2024-06-01">
+    enum="BooleanAttempted" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -5230,7 +5263,7 @@
 
 <histogram
     name="Autofill.VirtualCard.GetDetailsForEnrollment.Latency.{Source}.{Result}"
-    units="ms" expires_after="2024-06-01">
+    units="ms" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -5243,7 +5276,7 @@
 </histogram>
 
 <histogram name="Autofill.VirtualCard.GetDetailsForEnrollment.Result.{Source}"
-    enum="BooleanSuccess" expires_after="2024-06-01">
+    enum="BooleanSuccess" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -5255,7 +5288,7 @@
 </histogram>
 
 <histogram name="Autofill.VirtualCard.MetadataSynced" enum="BooleanExists"
-    expires_after="2023-09-03">
+    expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -5266,7 +5299,7 @@
 </histogram>
 
 <histogram name="Autofill.VirtualCard.Unenroll.Attempt.{Source}"
-    enum="BooleanAttempted" expires_after="2024-06-01">
+    enum="BooleanAttempted" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -5278,7 +5311,7 @@
 </histogram>
 
 <histogram name="Autofill.VirtualCard.Unenroll.Result.{Source}"
-    enum="BooleanSuccess" expires_after="2024-06-01">
+    enum="BooleanSuccess" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -5290,7 +5323,7 @@
 </histogram>
 
 <histogram name="Autofill.VirtualCard.{Dialog}" enum="BooleanAccepted"
-    expires_after="2023-12-01">
+    expires_after="2024-07-01">
   <owner>vishwasuppoor@chromium.org</owner>
   <owner>siashah@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -5302,7 +5335,7 @@
 </histogram>
 
 <histogram name="Autofill.VirtualCard.{Dialog}.LinkClicked"
-    enum="AutofillVirtualCardDialogLinkClicked" expires_after="2023-12-01">
+    enum="AutofillVirtualCardDialogLinkClicked" expires_after="2024-07-01">
   <owner>vishwasuppoor@chromium.org</owner>
   <owner>siashah@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -5316,7 +5349,7 @@
 
 <histogram
     name="Autofill.VirtualCardEnroll.CardArtImageAvailable.{EnrollmentSource}"
-    enum="BooleanAvailable" expires_after="2024-04-01">
+    enum="BooleanAvailable" expires_after="2024-07-01">
   <owner>alexandertekle@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -5330,7 +5363,7 @@
 
 <histogram
     name="Autofill.VirtualCardEnroll.LinkClicked.{EnrollmentSource}.{LinkType}"
-    enum="BooleanClicked" expires_after="2024-04-01">
+    enum="BooleanClicked" expires_after="2024-07-01">
   <owner>alexandertekle@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -5343,7 +5376,7 @@
 </histogram>
 
 <histogram name="Autofill.VirtualCardEnrollBubble.LatencySinceUpstream"
-    units="ms" expires_after="2024-04-01">
+    units="ms" expires_after="2024-07-01">
   <owner>vinnypersky@google.com</owner>
   <owner>alexandertekle@google.com</owner>
   <owner>siyua@chromium.org</owner>
@@ -5358,7 +5391,7 @@
 </histogram>
 
 <histogram name="Autofill.VirtualCardEnrollBubble.MaxStrikesLimitReached"
-    enum="AutofillVirtualCardEnrollmentSource" expires_after="2024-04-01">
+    enum="AutofillVirtualCardEnrollmentSource" expires_after="2024-07-01">
   <owner>vinnypersky@google.com</owner>
   <owner>alexandertekle@google.com</owner>
   <owner>siyua@chromium.org</owner>
@@ -5374,7 +5407,7 @@
 
 <histogram
     name="Autofill.VirtualCardEnrollBubble.Result.{EnrollmentSource}.{ShowType}{PreviousStrikes}"
-    enum="AutofillVirtualCardEnrollBubbleResult" expires_after="2024-04-01">
+    enum="AutofillVirtualCardEnrollBubbleResult" expires_after="2024-07-01">
   <owner>alexandertekle@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -5392,7 +5425,7 @@
 </histogram>
 
 <histogram name="Autofill.VirtualCardEnrollBubble.Shown.{EnrollmentSource}"
-    enum="BooleanPreviouslyShown" expires_after="2024-04-01">
+    enum="BooleanPreviouslyShown" expires_after="2024-07-01">
   <owner>alexandertekle@google.com</owner>
   <owner>siyua@chromium.org</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -5409,7 +5442,7 @@
 <histogram
     name="Autofill.VirtualCardEnrollmentStrikeDatabase.{EnrollmentSource}"
     enum="AutofillVirtualCardEnrollmentStrikeDatabaseEvent"
-    expires_after="2024-04-01">
+    expires_after="2024-07-01">
   <owner>alexandertekle@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -5423,7 +5456,7 @@
 
 <histogram name="Autofill.VirtualCardManualFallbackBubble.FieldClicked"
     enum="AutofillVirtualCardManualFallbackBubbleFieldClicked"
-    expires_after="2024-04-01">
+    expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -5436,7 +5469,7 @@
 
 <histogram name="Autofill.VirtualCardManualFallbackBubble.Result.{ShowType}"
     enum="AutofillVirtualCardManualFallbackBubbleResult"
-    expires_after="2024-04-01">
+    expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -5448,7 +5481,7 @@
 </histogram>
 
 <histogram name="Autofill.VirtualCardManualFallbackBubble.Shown"
-    enum="BooleanPreviouslyShown" expires_after="2024-04-01">
+    enum="BooleanPreviouslyShown" expires_after="2024-07-01">
   <owner>siyua@chromium.org</owner>
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
@@ -5788,7 +5821,7 @@
 
 <histogram
     name="Autofill.{PrecedenceType}Precedence.OverAutocompleteForStructuredAddressFields.{FieldType}.AutocompleteIs.{AutocompleteStatus}"
-    enum="AutofilledFieldUserEditingStatus" expires_after="2023-09-13">
+    enum="AutofilledFieldUserEditingStatus" expires_after="2024-03-30">
   <owner>jihadghanna@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index f97feef..89cdece 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -95,6 +95,29 @@
   <variant name="XSLStyleSheet" summary="XSL Style Sheet"/>
 </variants>
 
+<histogram name="Blink.Accessibility.Bundle" enum="AccessibilityModeBundleEnum"
+    expires_after="2024-02-01">
+  <owner>kevers@chromium.org</owner>
+  <owner>chrome-a11y-core@chromium.org</owner>
+  <summary>
+    Tracks when combinations of mode flags are set. Records when the
+    accessibility mode flag changes and aligns with one of the common (named)
+    flag bundles. Bundles that do not match a named set fall into the unnamed
+    bucket.
+  </summary>
+</histogram>
+
+<histogram name="Blink.Accessibility.ModeFlag" enum="AccessibilityModeFlagEnum"
+    expires_after="2024-02-01">
+  <owner>kevers@chromium.org</owner>
+  <owner>chrome-a11y-core@chromium.org</owner>
+  <summary>
+    Tracks whether individual accessibility mode flags are set. Recorded when
+    each mode flag is flipped from false to true. Only tracks usage within web
+    content.
+  </summary>
+</histogram>
+
 <histogram name="Blink.Accessibility.NumTreeUpdatesQueuedBeforeLayout"
     units="updates" expires_after="2023-03-05">
   <owner>aleventhal@chromium.org</owner>
@@ -184,7 +207,7 @@
 </histogram>
 
 <histogram name="Blink.Animation.CompositedAnimationFailureReason"
-    enum="CompositorAnimationsFailureReason" expires_after="2023-10-01">
+    enum="CompositorAnimationsFailureReason" expires_after="2024-03-01">
   <owner>smcgruer@chromium.org</owner>
   <owner>animations-dev@chromium.org</owner>
   <summary>
@@ -986,6 +1009,44 @@
   </summary>
 </histogram>
 
+<histogram name="Blink.DecodedImage.WebPDensity.Count.{ImageArea}"
+    units="0.01 bits per pixel" expires_after="2024-01-31">
+  <owner>wtc@google.com</owner>
+  <owner>jzern@google.com</owner>
+  <owner>src/third_party/blink/renderer/platform/image-decoders/OWNERS</owner>
+  <summary>
+    The number of images per image density measured in 0.01 bits per pixel for
+    image size in {ImageArea} megapixels. This is logged once per image load
+    after the whole image is loaded and only for WebP lossy still images without
+    alpha.
+  </summary>
+  <token key="ImageArea">
+    <variant name="0.1MP" summary="(0.0, 0.1]"/>
+    <variant name="0.2MP" summary="(0.1, 0.2]"/>
+    <variant name="0.3MP" summary="(0.2, 0.3]"/>
+    <variant name="0.4MP" summary="(0.3, 0.4]"/>
+    <variant name="0.5MP" summary="(0.4, 0.5]"/>
+    <variant name="0.6MP" summary="(0.5, 0.6]"/>
+    <variant name="0.7MP" summary="(0.6, 0.7]"/>
+    <variant name="0.8MP" summary="(0.7, 0.8]"/>
+    <variant name="0.9MP" summary="(0.8, 0.9]"/>
+    <variant name="01MP" summary="(0.9, 1]"/>
+    <variant name="02MP" summary="(1, 2]"/>
+    <variant name="03MP" summary="(2, 3]"/>
+    <variant name="04MP" summary="(3, 4]"/>
+    <variant name="05MP" summary="(4, 5]"/>
+    <variant name="06MP" summary="(5, 6]"/>
+    <variant name="07MP" summary="(6, 7]"/>
+    <variant name="08MP" summary="(7, 8]"/>
+    <variant name="09MP" summary="(8, 9]"/>
+    <variant name="10MP" summary="(9, 10]"/>
+    <variant name="11MP" summary="(10, 11]"/>
+    <variant name="12MP" summary="(11, 12]"/>
+    <variant name="13MP" summary="(12, 13]"/>
+    <variant name="14+MP" summary="(13, inf)"/>
+  </token>
+</histogram>
+
 <histogram name="Blink.DecodedImage.WebPDensity.KiBWeighted2"
     units="0.01 bits per pixel" expires_after="2024-02-04">
   <owner>wtc@google.com</owner>
@@ -1340,7 +1401,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.IsAfterWindowOnload" enum="Boolean"
-    expires_after="2024-01-14">
+    expires_after="M125">
   <owner>tanzachary@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1415,7 +1476,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.SignInStatusSetToSignout.NetError"
-    enum="NetErrorCodes" expires_after="2024-01-07">
+    enum="NetErrorCodes" expires_after="2024-03-10">
   <owner>npm@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1446,7 +1507,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.Status.AccountsResponseInvalidReason"
-    enum="FedCmAccountsResponseInvalidReason" expires_after="2023-11-19">
+    enum="FedCmAccountsResponseInvalidReason" expires_after="2023-12-19">
   <owner>yigu@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1463,7 +1524,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.Status.IdpSigninMatch"
-    enum="FedCmIdpSigninMatchStatus" expires_after="2023-12-31">
+    enum="FedCmIdpSigninMatchStatus" expires_after="2024-03-03">
   <owner>pkotwicz@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1506,7 +1567,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.Status.SignInStateMatch"
-    enum="FedCmSignInStateMatchStatus" expires_after="2023-10-15">
+    enum="FedCmSignInStateMatchStatus" expires_after="M125">
   <owner>tanzachary@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1557,7 +1618,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.Timing.IdTokenResponse" units="ms"
-    expires_after="2023-10-16">
+    expires_after="2023-12-16">
   <owner>yigu@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1581,7 +1642,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.Timing.PostTaskDelayDuration" units="ms"
-    expires_after="2024-01-21">
+    expires_after="M125">
   <owner>tanzachary@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1617,7 +1678,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.Timing.WindowOnloadDelayDuration" units="ms"
-    expires_after="2024-01-14">
+    expires_after="M125">
   <owner>tanzachary@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1664,7 +1725,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.WebContentsVisible" enum="Boolean"
-    expires_after="2023-11-19">
+    expires_after="2023-12-19">
   <owner>yigu@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -2112,7 +2173,7 @@
 </histogram>
 
 <histogram name="Blink.HTMLParsing.ParsingTimeMax4" units="microseconds"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>masonf@chromium.org</owner>
   <owner>dom-dev@chromium.org</owner>
   <summary>
@@ -2142,7 +2203,7 @@
 </histogram>
 
 <histogram name="Blink.HTMLParsing.ParsingTimeTotal4" units="microseconds"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>masonf@chromium.org</owner>
   <owner>dom-dev@chromium.org</owner>
   <summary>
@@ -2157,7 +2218,7 @@
 </histogram>
 
 <histogram name="Blink.HTMLParsing.TimeToDeferredPumpTokenizer4"
-    units="microseconds" expires_after="2024-01-07">
+    units="microseconds" expires_after="2024-03-10">
   <owner>sky@chromium.org</owner>
   <owner>dom-dev@chromium.org</owner>
   <summary>
@@ -2375,6 +2436,61 @@
   <summary>Records if a GestureScrollBegin is for cursor control.</summary>
 </histogram>
 
+<histogram name="Blink.IntersectionObseration.FrameMinScrollDeltaToUpdateX"
+    units="pixels" expires_after="2023-11-04">
+  <owner>wangxianzhu@chromium.org</owner>
+  <owner>paint-dev@chromium.org</owner>
+  <summary>
+    Reports LocalFrameView::min_scroll_delta_to_update_intersection_.x() after
+    an intersection observation update. The frequency is the same as
+    Blink.UpdateViewportIntersection.UpdateTime.
+  </summary>
+</histogram>
+
+<histogram name="Blink.IntersectionObseration.MinScrollDeltaToUpdateX"
+    units="pixels" expires_after="2023-11-04">
+  <owner>wangxianzhu@chromium.org</owner>
+  <owner>paint-dev@chromium.org</owner>
+  <summary>
+    Reports IntersectionGeometry::min_scroll_delta_to_update_.x() after an
+    intersection observation update. The frequency is number of geometry
+    observers per frame times the frequency of
+    Blink.UpdateViewportIntersection.UpdateTime.
+  </summary>
+</histogram>
+
+<histogram name="Blink.IntersectionObservation.FrameMinScrollDeltaToUpdateY"
+    units="pixels" expires_after="2023-10-31">
+  <owner>wangxianzhu@chromium.org</owner>
+  <owner>paint-dev@chromium.org</owner>
+  <summary>
+    Reports LocalFrameView::min_scroll_delta_to_update_intersection_.y() after
+    an intersection observation update. The frequency is the same as
+    Blink.UpdateViewportIntersection.UpdateTime.
+  </summary>
+</histogram>
+
+<histogram name="Blink.IntersectionObservation.MinScrollDeltaToUpdateY"
+    units="pixels" expires_after="2023-10-31">
+  <owner>wangxianzhu@chromium.org</owner>
+  <owner>paint-dev@chromium.org</owner>
+  <summary>
+    Reports IntersectionGeometry::min_scroll_delta_to_update_.y() after an
+    intersection observation update. The frequency is the same as
+    Blink.IntersectionObservation.MinScrollDeltaToUpdateY.
+  </summary>
+</histogram>
+
+<histogram name="Blink.IntersectionObservation.StateOnScroll"
+    enum="IntersectionObservationStateOnScroll" expires_after="2023-10-31">
+  <owner>wangxianzhu@chromium.org</owner>
+  <owner>paint-dev@chromium.org</owner>
+  <summary>
+    Reports LocalFrameView::IntersectionObservationState after a scroll. This is
+    reported on each scroll of any scroller.
+  </summary>
+</histogram>
+
 <histogram base="true" name="Blink.IntersectionObservation.UpdateTime"
     units="microseconds" expires_after="2024-06-01">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" -->
@@ -2400,6 +2516,16 @@
   </summary>
 </histogram>
 
+<histogram name="Blink.IntersectionObservation.UsesCachedRects" enum="Boolean"
+    expires_after="2023-10-31">
+  <owner>wangxianzhu@chromium.org</owner>
+  <owner>paint-dev@chromium.org</owner>
+  <summary>
+    Reports if an intersection observer update uses cached rects. The frequency
+    is the same as Blink.IntersectionObservation.MinScrollDeltaToUpdateY.
+  </summary>
+</histogram>
+
 <histogram base="true"
     name="Blink.IntersectionObservationInternalCount.UpdateTime" units="count"
     expires_after="2024-06-01">
@@ -2509,7 +2635,7 @@
 </histogram>
 
 <histogram name="Blink.Layout.RebuildFragmentTreeSpine" units="microseconds"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>tkent@chromium.org</owner>
   <owner>layout-dev@chromium.org</owner>
   <summary>
@@ -2519,7 +2645,7 @@
 </histogram>
 
 <histogram name="Blink.Layout.UpdateLayerPositionsAfterLayout"
-    units="microseconds" expires_after="2023-12-17">
+    units="microseconds" expires_after="2024-03-03">
   <owner>pdr@chromium.org</owner>
   <owner>ikilpatrick@chromium.org</owner>
   <owner>layout-dev@chromium.org</owner>
@@ -2619,6 +2745,66 @@
   </summary>
 </histogram>
 
+<histogram name="Blink.LCPP.LCPInfluencerUrlsCount" units="count"
+    expires_after="2024-01-27">
+  <owner>alexnj@chromium.org</owner>
+  <owner>
+    src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
+  </owner>
+  <summary>
+    Measures the number of resources identified to be influencing the load of
+    the LCP element.
+
+    The metric is emitted before the influencer list is serialized to the LCP
+    Critical Path Predictor (LCPP) database.
+  </summary>
+</histogram>
+
+<histogram name="Blink.LCPP.LCPInfluencerUrlsMaxLength" units="bytes"
+    expires_after="2024-01-27">
+  <owner>alexnj@chromium.org</owner>
+  <owner>
+    src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
+  </owner>
+  <summary>
+    Measures the size of the longest URL influencing the load of the LCP
+    element.
+
+    The metric is emitted before the influencer list is serialized to the LCP
+    Critical Path Predictor (LCPP) database.
+  </summary>
+</histogram>
+
+<histogram name="Blink.LCPP.LCPInfluencerUrlsPredictionMatchCount"
+    units="count" expires_after="2024-01-27">
+  <owner>alexnj@chromium.org</owner>
+  <owner>
+    src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
+  </owner>
+  <summary>
+    Counts the number of URLs matched during a subsequent page load, from the
+    set of URLs identified to be influencing the load of the LCP element.
+
+    The metric is emitted as LCP Critical Path Predictor calculates dependencies
+    of the current LCP candidate.
+  </summary>
+</histogram>
+
+<histogram name="Blink.LCPP.LCPInfluencerUrlsPredictionMatchPercent" units="%"
+    expires_after="2024-01-27">
+  <owner>alexnj@chromium.org</owner>
+  <owner>
+    src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
+  </owner>
+  <summary>
+    Measures the percent of matched LCP influencer URLs against the predicted
+    set of URLs.
+
+    The metric is emitted as LCP Critical Path Predictor calculates dependencies
+    of the current LCP candidate.
+  </summary>
+</histogram>
+
 <histogram name="Blink.LCPP.PotentiallyLCPResourcePriorityBoosts" units="count"
     expires_after="2024-01-27">
   <owner>kouhei@chromium.org</owner>
@@ -2730,7 +2916,7 @@
 </histogram>
 
 <histogram name="Blink.MemoryCache.CrossDocumentCachedResource2"
-    enum="ResourceType" expires_after="2023-12-31">
+    enum="ResourceType" expires_after="2024-03-03">
   <owner>gjc@chromium.org</owner>
   <owner>blink-network-dev@chromium.org</owner>
   <summary>
@@ -3742,7 +3928,7 @@
 </histogram>
 
 <histogram name="Blink.UseCounter.FencedFrames.MainFrame.Features"
-    enum="FeatureObserver" expires_after="2023-12-31">
+    enum="FeatureObserver" expires_after="2024-03-03">
   <owner>toyoshim@chromium.org</owner>
   <owner>mparc-dev@chromium.org</owner>
   <summary>
@@ -3809,7 +3995,7 @@
 </histogram>
 
 <histogram name="Blink.UseCounter.File.Features" enum="FeatureObserver"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>yhirano@chromium.org</owner>
   <owner>mkwst@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/bluetooth/histograms.xml b/tools/metrics/histograms/metadata/bluetooth/histograms.xml
index a6d4707..b502db1 100644
--- a/tools/metrics/histograms/metadata/bluetooth/histograms.xml
+++ b/tools/metrics/histograms/metadata/bluetooth/histograms.xml
@@ -1812,7 +1812,7 @@
 
 <histogram name="Bluetooth.Linux.ConnectToService.Bonded.FailureReason"
     enum="BluetoothDeviceConnectToServiceFailureReason"
-    expires_after="2023-10-22">
+    expires_after="2024-06-01">
   <owner>hansenmichael@google.com</owner>
   <owner>nearby-share-chromeos-eng@google.com</owner>
   <summary>
@@ -1824,7 +1824,7 @@
 
 <histogram name="Bluetooth.Linux.ConnectToService.FailureReason"
     enum="BluetoothDeviceConnectToServiceFailureReason"
-    expires_after="2023-10-22">
+    expires_after="2024-06-01">
   <owner>hansenmichael@google.com</owner>
   <owner>nearby-share-chromeos-eng@google.com</owner>
   <summary>
@@ -1835,7 +1835,7 @@
 
 <histogram name="Bluetooth.Linux.ConnectToServiceInsecurelyResult"
     enum="BluetoothAdapterConnectToServiceInsecurelyResult"
-    expires_after="2024-01-14">
+    expires_after="2024-06-01">
   <owner>hansenmichael@google.com</owner>
   <owner>nearby-share-chromeos-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/bookmarks/histograms.xml b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
index eb9a31f0..6eeeca08 100644
--- a/tools/metrics/histograms/metadata/bookmarks/histograms.xml
+++ b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
@@ -252,6 +252,40 @@
   <summary>Logs a UI location from which a bookmark is launched.</summary>
 </histogram>
 
+<histogram name="Bookmarks.MobileBookmarkManager.DisplayOptionUsed"
+    enum="MobileBookmarkManagerBookmarkRowDisplayPref"
+    expires_after="2024-01-14">
+  <owner>wylieb@chromium.org</owner>
+  <owner>chrome-collections@google.com</owner>
+  <component>UI&gt;Browser&gt;Bookmarks</component>
+  <summary>
+    Records when a user interacts with the display options in the mobile
+    bookmarks manager.
+  </summary>
+</histogram>
+
+<histogram name="Bookmarks.MobileBookmarkManager.FilterUsed"
+    enum="MobileBookmarkManagerFilter" expires_after="2024-01-14">
+  <owner>wylieb@chromium.org</owner>
+  <owner>chrome-collections@google.com</owner>
+  <component>UI&gt;Browser&gt;Bookmarks</component>
+  <summary>
+    Records when a user interacts with the filter options in the mobile
+    bookmarks manager.
+  </summary>
+</histogram>
+
+<histogram name="Bookmarks.MobileBookmarkManager.SortOptionUsed"
+    enum="MobileBookmarkManagerBookmarkRowSortOrder" expires_after="2024-01-14">
+  <owner>wylieb@chromium.org</owner>
+  <owner>chrome-collections@google.com</owner>
+  <component>UI&gt;Browser&gt;Bookmarks</component>
+  <summary>
+    Records when a user interacts with the sort options in the mobile bookmarks
+    manager.
+  </summary>
+</histogram>
+
 <histogram
     name="Bookmarks.MultipleOpened.OpenBookmarkTimeInterval2.{BookmarkType}"
     units="ms" expires_after="2024-01-20">
@@ -353,7 +387,7 @@
 </histogram>
 
 <histogram name="Bookmarks.ParentFolderType" enum="BookmarkFolderType"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>emshack@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <component>UI&gt;Browser&gt;Bookmarks</component>
diff --git a/tools/metrics/histograms/metadata/borealis/histograms.xml b/tools/metrics/histograms/metadata/borealis/histograms.xml
index a5d9c0ae..d707cd5d 100644
--- a/tools/metrics/histograms/metadata/borealis/histograms.xml
+++ b/tools/metrics/histograms/metadata/borealis/histograms.xml
@@ -153,7 +153,7 @@
 </histogram>
 
 <histogram name="Borealis.Install.NumAttempts" enum="BooleanAttempted"
-    expires_after="2023-12-10">
+    expires_after="2024-03-10">
   <owner>danielng@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>
@@ -199,7 +199,7 @@
 </histogram>
 
 <histogram name="Borealis.Install.Result" enum="BorealisInstallResult"
-    expires_after="2023-10-09">
+    expires_after="2024-04-09">
   <owner>danielng@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>
@@ -209,23 +209,8 @@
   </summary>
 </histogram>
 
-<histogram name="Borealis.Install.Retries" units="retries"
-    expires_after="2023-10-09">
-  <obsolete>
-    Code moved to GuestOs, no longer recorded.
-  </obsolete>
-  <owner>hollingum@google.com</owner>
-  <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
-  <summary>
-    The number of times the borealis DLC installation was retried by the
-    installer. The main use of this is to determine if 1 and 2 appear often, and
-    significantly more often than 3 (the maximum), i.e. to see whether retrying
-    leads to success or changes nothing.
-  </summary>
-</histogram>
-
 <histogram name="Borealis.Shutdown.Attempt" enum="BooleanAttempted"
-    expires_after="2023-10-09">
+    expires_after="2024-04-09">
   <owner>lqu@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>
@@ -266,7 +251,7 @@
 </histogram>
 
 <histogram name="Borealis.Startup.NumAttempts" enum="BooleanAttempted"
-    expires_after="2023-10-09">
+    expires_after="2024-04-09">
   <owner>danielng@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>Recording every attempt to start Borealis (via the UI).</summary>
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml
index 8776c8c9..ce5174a 100644
--- a/tools/metrics/histograms/metadata/browser/histograms.xml
+++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -704,7 +704,7 @@
 </histogram>
 
 <histogram name="Browser.Tabs.SelectionToVisibilityRequestTime"
-    units="microseconds" expires_after="2023-12-31">
+    units="microseconds" expires_after="2024-03-03">
   <owner>jonross@chromium.org</owner>
   <owner>sky@chromium.org</owner>
   <summary>
@@ -1018,7 +1018,7 @@
 </histogram>
 
 <histogram name="BrowserServices.VerificationTime.Online" units="ms"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>peconn@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/chrome/histograms.xml b/tools/metrics/histograms/metadata/chrome/histograms.xml
index af40b8a..006df61 100644
--- a/tools/metrics/histograms/metadata/chrome/histograms.xml
+++ b/tools/metrics/histograms/metadata/chrome/histograms.xml
@@ -32,6 +32,17 @@
   </summary>
 </histogram>
 
+<histogram name="Chrome.Frame.MouseDownCaptionHitTestInReservedGrabHandleSpace"
+    enum="Boolean" expires_after="2023-12-04">
+  <owner>robliao@chromium.org</owner>
+  <owner>pkasting@chromium.org</owner>
+  <summary>
+    Recorded only for Windows on every primary button mouse down determined to
+    be in the caption area of Chrome. True if the primary button mouse down was
+    in the reserved grab handle space, false otherwise.
+  </summary>
+</histogram>
+
 <histogram name="Chrome.Headless.Action" enum="HeadlessChromeAction"
     expires_after="2023-12-31">
   <owner>kvitekp@chromium.org</owner>
@@ -368,7 +379,7 @@
 </histogram>
 
 <histogram name="ChromeColors.DynamicColorOnLoad"
-    enum="DynamicChromeColorsInfo" expires_after="2023-12-24">
+    enum="DynamicChromeColorsInfo" expires_after="2024-03-10">
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index 9876f76..2a4c4a5 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -368,7 +368,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Camera.Effects.SelectedEffect"
-    enum="CameraEffectType" expires_after="2024-01-01">
+    enum="CameraEffectType" expires_after="2024-03-10">
   <owner>jmpollock@chromium.org</owner>
   <owner>chromeos-camera-eng@google.com</owner>
   <summary>
@@ -409,7 +409,7 @@
 
 <histogram
     name="ChromeOS.Camera.Effects.{EffectType}.{StreamType}.AvgProcessingLatency"
-    units="microseconds" expires_after="2024-01-01">
+    units="microseconds" expires_after="2024-03-10">
   <owner>jmpollock@chromium.org</owner>
   <owner>chromeos-camera-eng@google.com</owner>
   <summary>
@@ -514,7 +514,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Camera.GcamAutoExposure.AverageConvergenceLatency"
-    units="frames" expires_after="2023-10-01">
+    units="frames" expires_after="2024-10-01">
   <owner>jcliang@chromium.org</owner>
   <owner>chromeos-camera-eng@google.com</owner>
   <summary>
@@ -525,7 +525,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Camera.GcamAutoExposure.AverageHdrRatio"
-    units="ratio" expires_after="2023-10-01">
+    units="ratio" expires_after="2024-10-01">
   <owner>jcliang@chromium.org</owner>
   <owner>chromeos-camera-eng@google.com</owner>
   <summary>
@@ -535,7 +535,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Camera.GcamAutoExposure.AverageTet" units="TET"
-    expires_after="2023-10-01">
+    expires_after="2024-10-01">
   <owner>jcliang@chromium.org</owner>
   <owner>chromeos-camera-eng@google.com</owner>
   <summary>
@@ -546,7 +546,7 @@
 
 <histogram base="true"
     name="ChromeOS.Camera.HDRnet.AverageLatency.{ProcessingType}"
-    units="microseconds" expires_after="2023-10-01">
+    units="microseconds" expires_after="2024-10-01">
   <owner>jcliang@chromium.org</owner>
   <owner>chromeos-camera-eng@google.com</owner>
   <summary>
@@ -567,7 +567,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Camera.HDRnet.Error" enum="HdrnetError"
-    expires_after="2024-02-04">
+    expires_after="2024-10-01">
   <owner>jcliang@chromium.org</owner>
   <owner>chromeos-camera-eng@google.com</owner>
   <summary>
@@ -579,7 +579,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Camera.HDRnet.MaxOutputBuffersRendered"
-    units="buffers" expires_after="2024-01-21">
+    units="buffers" expires_after="2024-10-01">
   <owner>jcliang@chromium.org</owner>
   <owner>chromeos-camera-eng@google.com</owner>
   <summary>
@@ -591,7 +591,7 @@
 </histogram>
 
 <histogram base="true" name="ChromeOS.Camera.HDRnet.MaxStreamSize.{StreamType}"
-    units="pixels" expires_after="2023-10-01">
+    units="pixels" expires_after="2024-10-01">
   <owner>jcliang@chromium.org</owner>
   <owner>chromeos-camera-eng@google.com</owner>
   <summary>
@@ -606,7 +606,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Camera.HDRnet.NumConcurrentStreams" units="streams"
-    expires_after="2023-10-01">
+    expires_after="2024-10-01">
   <owner>jcliang@chromium.org</owner>
   <owner>chromeos-camera-eng@google.com</owner>
   <summary>
@@ -616,7 +616,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Camera.HDRnet.NumStillShotsTaken" units="captures"
-    expires_after="2023-10-01">
+    expires_after="2024-10-01">
   <owner>jcliang@chromium.org</owner>
   <owner>chromeos-camera-eng@google.com</owner>
   <summary>
@@ -626,7 +626,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Camera.HDRnet.StreamConfiguration"
-    enum="HdrnetStreamConfiguration" expires_after="2023-12-04">
+    enum="HdrnetStreamConfiguration" expires_after="2024-10-01">
   <owner>jcliang@chromium.org</owner>
   <owner>chromeos-camera-eng@google.com</owner>
   <summary>
@@ -1312,6 +1312,7 @@
     <variant name="CameraApp"/>
     <variant name="General"/>
     <variant name="GeneralCamera"/>
+    <variant name="GeneralWithLocaleForTest"/>
     <variant name="Performance"/>
     <variant name="Peripherals"/>
     <variant name="Stability"/>
@@ -1319,7 +1320,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Healthd.DiagnosticResult.{Routine}"
-    enum="CrosHealthdDiagnosticResult" expires_after="2023-12-31">
+    enum="CrosHealthdDiagnosticResult" expires_after="2024-03-03">
   <owner>weiluanwang@google.com</owner>
   <owner>dennyh@google.com</owner>
   <owner>cros-tdm-tpe-eng@google.com</owner>
@@ -1386,7 +1387,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Healthd.TelemetryResult.{Category}"
-    enum="CrosHealthdTelemetryResult" expires_after="2023-12-31">
+    enum="CrosHealthdTelemetryResult" expires_after="2024-03-03">
   <owner>weiluanwang@google.com</owner>
   <owner>dennyh@google.com</owner>
   <owner>cros-tdm-tpe-eng@google.com</owner>
@@ -1525,7 +1526,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Inputs.AutoRepeatUsage" units="key_event"
-    expires_after="2024-01-05">
+    expires_after="2024-03-10">
   <owner>dpad@chromium.org</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>
@@ -1552,7 +1553,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Inputs.EventRewriter.KeyRewriteLatency"
-    units="microseconds" expires_after="2024-01-05">
+    units="microseconds" expires_after="2024-03-10">
   <owner>wangdanny@chromium.org</owner>
   <owner>dpad@chromium.org</owner>
   <owner>cros-peripherals@google.com</owner>
@@ -1565,7 +1566,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Inputs.Keyboard.ModifierPressed.{KeyboardType}"
-    enum="ModifierKeyDomCodes" expires_after="2024-01-05">
+    enum="ModifierKeyDomCodes" expires_after="2024-03-10">
   <owner>dpad@google.com</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>
@@ -1582,7 +1583,7 @@
 
 <histogram
     name="ChromeOS.Inputs.Keyboard.RemappedModifierPressed.{KeyboardType}"
-    enum="ModifierKeyDomCodes" expires_after="2024-01-05">
+    enum="ModifierKeyDomCodes" expires_after="2024-03-10">
   <owner>dpad@google.com</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>
@@ -1864,58 +1865,8 @@
   </summary>
 </histogram>
 
-<histogram name="ChromeOS.LanguagePacks.Mojo.BasePackStateResponse"
-    enum="LanguagePackMojoPackState" expires_after="2023-07-01">
-  <owner>mlcui@google.com</owner>
-  <owner>cros-borders-eng@google.com</owner>
-  <summary>
-    Records the state of what state a base pack is in (whether it's installed or
-    not) when the language packs Mojo interface responds to an IPC.
-  </summary>
-</histogram>
-
-<histogram name="ChromeOS.LanguagePacks.Mojo.GetPackInfo.Feature"
-    enum="LanguagePackMojoFeatureId" expires_after="2023-11-19">
-  <owner>mlcui@google.com</owner>
-  <owner>cros-borders-eng@google.com</owner>
-  <summary>
-    Records which feature was requested by callers of the language packs Mojo
-    interface's &quot;GetPackInfo&quot; IPC call.
-  </summary>
-</histogram>
-
-<histogram name="ChromeOS.LanguagePacks.Mojo.InstallBasePack.Feature"
-    enum="LanguagePackMojoFeatureId" expires_after="2023-07-01">
-  <owner>mlcui@google.com</owner>
-  <owner>cros-borders-eng@google.com</owner>
-  <summary>
-    Records which feature was requested by callers of the language packs Mojo
-    interface's &quot;InstallBasePack&quot; IPC call.
-  </summary>
-</histogram>
-
-<histogram name="ChromeOS.LanguagePacks.Mojo.InstallPack.Feature"
-    enum="LanguagePackMojoFeatureId" expires_after="2024-01-21">
-  <owner>mlcui@google.com</owner>
-  <owner>cros-borders-eng@google.com</owner>
-  <summary>
-    Records which feature was requested by callers of the language packs Mojo
-    interface's &quot;InstallPack&quot; IPC call.
-  </summary>
-</histogram>
-
-<histogram name="ChromeOS.LanguagePacks.Mojo.PackStateResponse"
-    enum="LanguagePackMojoPackState" expires_after="2024-01-14">
-  <owner>mlcui@google.com</owner>
-  <owner>cros-borders-eng@google.com</owner>
-  <summary>
-    Records the state of what state a language pack is in (whether it's
-    installed or not) when the language packs Mojo interface responds to an IPC.
-  </summary>
-</histogram>
-
 <histogram name="ChromeOS.LanguagePacks.Oobe.ValidLocale" enum="BooleanSuccess"
-    expires_after="2024-01-07">
+    expires_after="2024-02-20">
   <owner>claudiomagni@chromium.org</owner>
   <owner>mlcui@google.com</owner>
   <owner>dvallet@chromium.org</owner>
@@ -1926,7 +1877,7 @@
 </histogram>
 
 <histogram name="ChromeOS.LanguagePacks.UninstallComplete.Success"
-    enum="BooleanSuccess" expires_after="2023-09-01">
+    enum="BooleanSuccess" expires_after="2024-02-20">
   <owner>claudiomagni@chromium.org</owner>
   <owner>mlcui@google.com</owner>
   <owner>dvallet@chromium.org</owner>
@@ -2167,7 +2118,7 @@
 </histogram>
 
 <histogram name="ChromeOS.SAML.InSessionPasswordSyncEvent"
-    enum="SamlInSessionPasswordSyncEvent" expires_after="2023-12-10">
+    enum="SamlInSessionPasswordSyncEvent" expires_after="2024-03-10">
   <owner>mslus@chromium.org</owner>
   <owner>mohammedabdon@chromium.org</owner>
   <summary>
@@ -2387,7 +2338,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Secagentd.Redaction" units="position"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>rborzello@google.com</owner>
   <owner>cros-enterprise-security@google.com</owner>
   <summary>
@@ -3055,7 +3006,7 @@
 </histogram>
 
 <histogram base="true" name="ChromeOS.SystemTray.AnimationSmoothness" units="%"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
 <!-- Name completed by histogram suffixes
      name="SystemTrayTransitionType" -->
 
@@ -3447,7 +3398,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Zram.{CountMetric}" units="count"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
   <owner>ctshao@google.com</owner>
   <owner>bgeffon@chromium.org</owner>
   <owner>chromeos-memory@google.com</owner>
@@ -3499,7 +3450,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Zram.{PctMetric}" units="%"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
   <owner>ctshao@google.com</owner>
   <owner>bgeffon@chromium.org</owner>
   <owner>chromeos-memory@google.com</owner>
@@ -3518,7 +3469,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Zram.{SizeMetric}" units="MB"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
   <owner>ctshao@google.com</owner>
   <owner>bgeffon@chromium.org</owner>
   <owner>chromeos-memory@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
index db2011e..d7a0612d 100644
--- a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
@@ -77,7 +77,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.Apps.DoNotDisturbOnOff"
-    enum="BooleanToggled" expires_after="2023-12-31">
+    enum="BooleanToggled" expires_after="2024-03-03">
   <owner>hsuregan@chromium.org</owner>
   <owner>jimmyxgong@chromium.org</owner>
   <summary>
@@ -119,7 +119,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.Device.KeyboardAutoRepeatEnabled"
-    enum="BooleanEnabled" expires_after="2023-12-31">
+    enum="BooleanEnabled" expires_after="2024-03-03">
   <owner>ckincaid@chromium.org</owner>
   <owner>dmblack@google.com</owner>
   <owner>cros-settings@google.com</owner>
@@ -465,6 +465,18 @@
   </summary>
 </histogram>
 
+<histogram name="ChromeOS.Settings.RevenEnableHwDataUsage"
+    enum="BooleanToggled" expires_after="2024-09-06">
+  <owner>tinghaolin@google.com</owner>
+  <owner>chromeos-flex-eng@google.com</owner>
+  <summary>
+    Records the result of whether users agree to send hardware data through the
+    settings screen on unmanaged ChromeOS Flex devices. This metric is logged
+    when &quot;ChromeOS Flex hardware support and stability&quot; setting is
+    enabled or disabled.
+  </summary>
+</histogram>
+
 <histogram name="ChromeOS.Settings.SearchLatency" units="ms"
     expires_after="2024-02-04">
   <owner>wesokuhara@google.com</owner>
@@ -599,7 +611,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.Wifi.AddNetwork"
-    enum="NetworkDiscoveryState" expires_after="2023-10-22">
+    enum="NetworkDiscoveryState" expires_after="2024-09-22">
   <owner>jonmann@chromium.org</owner>
   <owner>khorimoto@chromium.org</owner>
   <owner>tnagel@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/commerce/histograms.xml b/tools/metrics/histograms/metadata/commerce/histograms.xml
index 6e91ff6..c7c3cba 100644
--- a/tools/metrics/histograms/metadata/commerce/histograms.xml
+++ b/tools/metrics/histograms/metadata/commerce/histograms.xml
@@ -482,7 +482,7 @@
 </histogram>
 
 <histogram name="Commerce.PriceInsights.OmniboxIconClickedAfterLabelShown"
-    enum="PriceInsightsIconLabelType" expires_after="2024-01-03">
+    enum="PriceInsightsIconLabelType" expires_after="2024-03-10">
   <owner>zhiyuancai@chromium.org</owner>
   <owner>ayman@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
@@ -494,7 +494,7 @@
 </histogram>
 
 <histogram name="Commerce.PriceInsights.OmniboxIconShownLabel"
-    enum="PriceInsightsIconLabelType" expires_after="2024-01-03">
+    enum="PriceInsightsIconLabelType" expires_after="2024-03-10">
   <owner>zhiyuancai@chromium.org</owner>
   <owner>ayman@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
@@ -505,7 +505,7 @@
 </histogram>
 
 <histogram name="Commerce.PriceInsights.SidePanelOpenWithMultipleCatalogs"
-    enum="Boolean" expires_after="2024-01-03">
+    enum="Boolean" expires_after="2024-03-10">
   <owner>zhiyuancai@chromium.org</owner>
   <owner>ayman@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
@@ -619,7 +619,7 @@
 </histogram>
 
 <histogram name="Commerce.ShoppingService.ProductInfo.FallbackDataUsed"
-    enum="Boolean" expires_after="2023-12-31">
+    enum="Boolean" expires_after="2024-03-03">
   <owner>ayman@chromium.org</owner>
   <owner>mdjones@chromium.org</owner>
   <summary>
@@ -630,7 +630,7 @@
 </histogram>
 
 <histogram name="Commerce.ShoppingService.ProductInfo.ImageAvailability"
-    enum="ProductImageAvailability" expires_after="2023-12-31">
+    enum="ProductImageAvailability" expires_after="2024-03-03">
   <owner>ayman@chromium.org</owner>
   <owner>mdjones@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/companion/histograms.xml b/tools/metrics/histograms/metadata/companion/histograms.xml
index e2be5fbd..1b0d12a 100644
--- a/tools/metrics/histograms/metadata/companion/histograms.xml
+++ b/tools/metrics/histograms/metadata/companion/histograms.xml
@@ -47,7 +47,7 @@
 </histogram>
 
 <histogram name="Companion.FullLoad.Latency" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>src/chrome/browser/companion/OWNERS</owner>
   <summary>
@@ -57,7 +57,7 @@
 </histogram>
 
 <histogram name="Companion.HasNavigatedToExpsSuccessPagePref.OnChanged"
-    enum="Boolean" expires_after="2024-01-07">
+    enum="Boolean" expires_after="2024-03-10">
   <owner>tbansal@chromium.org</owner>
   <owner>src/chrome/browser/companion/OWNERS</owner>
   <summary>
@@ -68,7 +68,7 @@
 </histogram>
 
 <histogram name="Companion.HasNavigatedToExpsSuccessPagePref.Status"
-    enum="Boolean" expires_after="2023-12-31">
+    enum="Boolean" expires_after="2024-03-03">
   <owner>tbansal@chromium.org</owner>
   <owner>src/chrome/browser/companion/OWNERS</owner>
   <summary>
@@ -87,7 +87,7 @@
 </histogram>
 
 <histogram name="Companion.NavigationLoad.Latency" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>src/chrome/browser/companion/OWNERS</owner>
   <summary>
@@ -244,7 +244,7 @@
 </histogram>
 
 <histogram name="Companion.VisualQuery.EligibilityStatus.NumSensitive"
-    units="images" expires_after="2023-10-20">
+    units="images" expires_after="2024-03-03">
   <owner>srna@google.com</owner>
   <owner>pstjuste@google.com</owner>
   <owner>src/chrome/browser/companion/OWNERS</owner>
diff --git a/tools/metrics/histograms/metadata/compositing/histograms.xml b/tools/metrics/histograms/metadata/compositing/histograms.xml
index 0e7c22e..3890097 100644
--- a/tools/metrics/histograms/metadata/compositing/histograms.xml
+++ b/tools/metrics/histograms/metadata/compositing/histograms.xml
@@ -1035,7 +1035,7 @@
 </histogram>
 
 <histogram name="Graphics.Exo.Smoothness.DidNotProduceToFrameArrival"
-    units="microseconds" expires_after="2023-12-31">
+    units="microseconds" expires_after="2024-03-03">
   <owner>jonross@chromium.org</owner>
   <owner>yzshen@chromium.org</owner>
   <owner>graphics-dev@chromium.org</owner>
@@ -1048,12 +1048,13 @@
     frames is reasonable. Please note that a value is reported for each
     DidNotProduceFrame. If (1) DidNotProduceFrame is issued when there are
     already queued BeginFrame requests; or (2) a new BeginFrame request arrives
-    before the next frame, then the value reported is 0.
+    before the next frame; or (3) BeginFrame requests are paused, then the value
+    reported is 0.
   </summary>
 </histogram>
 
 <histogram name="Graphics.Exo.Smoothness.PercentDidNotProduceFrame" units="%"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jonross@chromium.org</owner>
   <owner>yzshen@chromium.org</owner>
   <owner>graphics-dev@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml
index 6faa0bc..4fc88a6 100644
--- a/tools/metrics/histograms/metadata/content/histograms.xml
+++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -222,7 +222,7 @@
 </histogram>
 
 <histogram name="ContentSettings.RegularProfile.DefaultStorageAccess"
-    enum="ContentSetting" expires_after="2023-10-23">
+    enum="ContentSetting" expires_after="2024-06-23">
   <owner>dullweber@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -895,7 +895,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.ContentLifetime.InvalidAge" units="ms"
-    expires_after="2023-09-17">
+    expires_after="2024-01-21">
   <owner>birnie@google.com</owner>
   <owner>feed@chromium.org</owner>
   <summary>
@@ -1048,7 +1048,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.LoadStreamStatus.LoadMore"
-    enum="FeedLoadStreamStatus" expires_after="2024-01-07">
+    enum="FeedLoadStreamStatus" expires_after="2024-03-10">
   <owner>harringtond@chromium.org</owner>
   <owner>carlosk@chromium.org</owner>
   <owner>feed@chromium.org</owner>
@@ -1241,7 +1241,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.SignInFromFeedAction.SignInSuccessful"
-    enum="Boolean" expires_after="2023-12-31">
+    enum="Boolean" expires_after="2024-03-03">
   <owner>birnie@google.com</owner>
   <owner>feed@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/content_creation/histograms.xml b/tools/metrics/histograms/metadata/content_creation/histograms.xml
index 44c3483..eb211f2c 100644
--- a/tools/metrics/histograms/metadata/content_creation/histograms.xml
+++ b/tools/metrics/histograms/metadata/content_creation/histograms.xml
@@ -203,7 +203,7 @@
 </histogram>
 
 <histogram name="SharedHighlights.LinkGenerated.Error.Requested"
-    enum="LinkGenerationError" expires_after="2024-01-07">
+    enum="LinkGenerationError" expires_after="2024-03-10">
   <owner>jeffreycohen@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -296,7 +296,7 @@
 </histogram>
 
 <histogram name="TextFragmentAnchor.LinkOpenSource"
-    enum="TextFragmentLinkOpenSource" expires_after="2024-01-07">
+    enum="TextFragmentLinkOpenSource" expires_after="2024-03-10">
   <owner>jeffreycohen@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/cookie/histograms.xml b/tools/metrics/histograms/metadata/cookie/histograms.xml
index ea0ef3a9..5d5b2345 100644
--- a/tools/metrics/histograms/metadata/cookie/histograms.xml
+++ b/tools/metrics/histograms/metadata/cookie/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="Cookie.AvgCookieJarSizePerKey" units="kibibytes"
-    expires_after="2023-12-22">
+    expires_after="2024-03-03">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -308,7 +308,7 @@
 </histogram>
 
 <histogram name="Cookie.DoubleUnderscorePrefixedName" enum="Boolean"
-    expires_after="2023-11-12">
+    expires_after="2024-03-03">
   <owner>bingler@chromium.org</owner>
   <owner>miketaylr@chromium.org</owner>
   <summary>
@@ -677,6 +677,27 @@
   </summary>
 </histogram>
 
+<histogram name="Cookie.OnCookiesAccessed.BatchSize" units="accesses"
+    expires_after="2024-10-05">
+  <owner>olivierli@chromium.org</owner>
+  <owner>chrome-catan@chromium.org</owner>
+  <summary>
+    Records the number of cookie access details batches received in
+    RenderFrameHostImpl. Recorded every time accesses are reported from the
+    network service.
+  </summary>
+</histogram>
+
+<histogram name="Cookie.OnCookiesAccessed.TotalAccesses" units="accesses"
+    expires_after="2024-10-05">
+  <owner>olivierli@chromium.org</owner>
+  <owner>chrome-catan@chromium.org</owner>
+  <summary>
+    Records the number of cookie access details received in RenderFrameHostImpl.
+    Recorded every time accesses are reported from the network service.
+  </summary>
+</histogram>
+
 <histogram name="Cookie.PartitionCount" units="partitions"
     expires_after="2024-02-25">
   <owner>dylancutler@google.com</owner>
@@ -882,7 +903,7 @@
 </histogram>
 
 <histogram name="Cookie.RequestSameSiteContext" enum="SameSiteCookieContext"
-    expires_after="2023-12-30">
+    expires_after="2024-03-03">
   <owner>bingler@chromium.org</owner>
   <owner>morlovich@chromium.org</owner>
   <summary>
@@ -936,7 +957,7 @@
 </histogram>
 
 <histogram name="Cookie.TimeDatabaseMigrationToV18" units="ms"
-    expires_after="2023-10-22">
+    expires_after="2024-03-11">
   <owner>arichiv@chromium.org</owner>
   <owner>bingler@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/cras/histograms.xml b/tools/metrics/histograms/metadata/cras/histograms.xml
index d6a9b4e2..8a414eb5 100644
--- a/tools/metrics/histograms/metadata/cras/histograms.xml
+++ b/tools/metrics/histograms/metadata/cras/histograms.xml
@@ -60,6 +60,22 @@
   </summary>
 </histogram>
 
+<histogram name="Cras.ApNcRuntime" units="seconds" expires_after="2024-08-31">
+  <owner>hunghsienchen@chromium.org</owner>
+  <owner>chromeos-audio@google.com</owner>
+  <summary>Tracks the runtime of the APM when AP NC is active.</summary>
+</histogram>
+
+<histogram name="Cras.ApNcStartStatus" enum="CrasApNcStartStatus"
+    expires_after="2024-08-31">
+  <owner>hunghsienchen@chromium.org</owner>
+  <owner>chromeos-audio@google.com</owner>
+  <summary>
+    Sent when AP NC is requested in APM. 0 for AP NC requested but failed; 1 for
+    AP NC requested and success.
+  </summary>
+</histogram>
+
 <histogram name="Cras.Busyloop" units="units" expires_after="2024-03-17">
 <!-- Name completed by histogram_suffixes
      name="Cras.TimePeriod" -->
@@ -317,6 +333,16 @@
   </summary>
 </histogram>
 
+<histogram name="Cras.ForceRespectUiGains" enum="BooleanEnabled"
+    expires_after="2024-07-11">
+  <owner>eddyhsu@chromium.org</owner>
+  <owner>chromeos-audio-sw@google.com</owner>
+  <summary>
+    Records the user enables or not the force respect UI gains. This value is
+    recorded for each change to the force respect ui gains setting.
+  </summary>
+</histogram>
+
 <histogram name="Cras.HfpBatteryIndicatorSupported"
     enum="CrasHfpBatteryIndicator" expires_after="2024-02-04">
   <owner>enshuo@chromium.org</owner>
@@ -815,6 +841,46 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Cras.StreamRuntimeWithMinimum{Duration}{Direction}{ClientType}{StreamType}"
+    units="seconds" expires_after="2024-09-08">
+  <owner>pteerapong@chromium.org</owner>
+  <owner>chromeos-audio@google.com</owner>
+  <summary>
+    Similar to Cras.StreamRuntime, but only for streams with runtime at least
+    {Duration}. The value is recorded when the stream is destroyed.
+  </summary>
+  <token key="Duration">
+    <variant name=".10s"/>
+  </token>
+  <token key="Direction">
+    <variant name="" summary="aggregated across all breakdowns"/>
+    <variant name=".Input"/>
+    <variant name=".Output"/>
+  </token>
+  <token key="ClientType">
+    <variant name="" summary="aggregated across all breakdowns"/>
+    <variant name=".ARC" summary="A client created by ARC++."/>
+    <variant name=".ARCVM" summary="A client created by ARCVM."/>
+    <variant name=".BOREALIS" summary="A client created by BOREALIS."/>
+    <variant name=".Chrome" summary="A client created by Chrome."/>
+    <variant name=".CrOSVM" summary="A client created by ChromeOS VM."/>
+    <variant name=".InvalidType" summary="Invalid client."/>
+    <variant name=".LaCrOS" summary="A client created by LaCrOS."/>
+    <variant name=".Legacy" summary="A client using an old CRAS lib."/>
+    <variant name=".PCM" summary="A client created by PCM."/>
+    <variant name=".ServerStream" summary="A client created by CRAS server."/>
+    <variant name=".Test" summary="A client created by cras_test_client."/>
+    <variant name=".Unknown" summary="Unknown client."/>
+  </token>
+  <token key="StreamType">
+    <variant name="" summary="aggregated across all breakdowns"/>
+    <variant name=".Default"/>
+    <variant name=".ProAudio"/>
+    <variant name=".VoiceCommunication"/>
+  </token>
+</histogram>
+
 <histogram name="Cras.StreamSamplingFormat" enum="AlsaSampleFormatType"
     expires_after="2024-03-16">
 <!-- Name completed by histogram_suffixes
diff --git a/tools/metrics/histograms/metadata/cross_device/histograms.xml b/tools/metrics/histograms/metadata/cross_device/histograms.xml
index e43a1da..0b94aec 100644
--- a/tools/metrics/histograms/metadata/cross_device/histograms.xml
+++ b/tools/metrics/histograms/metadata/cross_device/histograms.xml
@@ -261,7 +261,7 @@
 
 <histogram
     name="CryptAuth.DeviceSyncV2.DeviceActivityGetter.ApiCallResult.GetDevicesActivityStatus"
-    enum="CryptAuthApiCallResult" expires_after="2023-12-31">
+    enum="CryptAuthApiCallResult" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -545,7 +545,7 @@
 
 <histogram
     name="CryptAuth.DeviceSyncV2.GroupPrivateKeySharer.EncryptionSuccess"
-    enum="BooleanSuccess" expires_after="2023-12-31">
+    enum="BooleanSuccess" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -807,7 +807,7 @@
 </histogram>
 
 <histogram name="CryptAuth.DeviceSyncV2.Result.ResultCode"
-    enum="CryptAuthV2DeviceSyncResultCode" expires_after="2023-12-31">
+    enum="CryptAuthV2DeviceSyncResultCode" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -912,7 +912,7 @@
 </histogram>
 
 <histogram name="CryptAuth.EnrollmentV2.Result.ResultCode"
-    enum="CryptAuthV2EnrollmentResult" expires_after="2023-12-31">
+    enum="CryptAuthV2EnrollmentResult" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1146,7 +1146,7 @@
 </histogram>
 
 <histogram name="EasyUnlock.AuthEvent.Unlock" enum="EasyUnlockAuthEvent"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1253,7 +1253,7 @@
 </histogram>
 
 <histogram name="InstantTethering.BluetoothDiscoverySessionStarted"
-    enum="BooleanSuccess" expires_after="2023-12-31">
+    enum="BooleanSuccess" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1262,7 +1262,7 @@
 </histogram>
 
 <histogram name="InstantTethering.BluetoothDiscoverySessionStopped"
-    enum="BooleanSuccess" expires_after="2023-12-31">
+    enum="BooleanSuccess" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1272,7 +1272,7 @@
 
 <histogram name="InstantTethering.ConnectionToHostResult.Failure"
     enum="InstantTethering_ConnectionToHostResult_Failure"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1291,7 +1291,7 @@
 <histogram
     name="InstantTethering.ConnectionToHostResult.Failure.ClientConnection"
     enum="InstantTethering_ConnectionToHostResult_Failure_ClientConnection"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1311,7 +1311,7 @@
 <histogram
     name="InstantTethering.ConnectionToHostResult.Failure.TetheringTimeout"
     enum="InstantTethering_ConnectionToHostResult_Failure_TetheringTimeout"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1343,7 +1343,7 @@
 <histogram
     name="InstantTethering.ConnectionToHostResult.ProvisioningFailureRate"
     enum="InstantTethering_ConnectionToHostResult_ProvisioningFailureRate"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1363,7 +1363,7 @@
 <histogram
     name="InstantTethering.ConnectionToHostResult.SuccessRate.Background"
     enum="InstantTethering_ConnectionToHostResult_SuccessRate"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1380,7 +1380,7 @@
 </histogram>
 
 <histogram name="InstantTethering.FeatureState"
-    enum="InstantTethering_FeatureState" expires_after="2023-12-31">
+    enum="InstantTethering_FeatureState" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1396,7 +1396,7 @@
 </histogram>
 
 <histogram name="InstantTethering.HostScanBatchDuration" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1412,7 +1412,7 @@
 </histogram>
 
 <histogram name="InstantTethering.HostScanResult"
-    enum="InstantTethering_HostScanResult" expires_after="2023-12-31">
+    enum="InstantTethering_HostScanResult" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1430,7 +1430,7 @@
 </histogram>
 
 <histogram name="InstantTethering.HotspotUsageDuration" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1441,7 +1441,7 @@
 </histogram>
 
 <histogram name="InstantTethering.KeepAliveTickle.Result" enum="BooleanSuccess"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1451,7 +1451,7 @@
 </histogram>
 
 <histogram name="InstantTethering.MultiDeviceFeatureState"
-    enum="MultiDevice_FeatureState" expires_after="2023-12-31">
+    enum="MultiDevice_FeatureState" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1463,7 +1463,7 @@
 
 <histogram name="InstantTethering.NotificationInteractionType"
     enum="InstantTethering_NotificationInteractionType"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1473,7 +1473,7 @@
 </histogram>
 
 <histogram name="InstantTethering.Performance.ConnectTetheringResponseDuration"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1483,7 +1483,7 @@
 </histogram>
 
 <histogram name="InstantTethering.Performance.ConnectToHostDuration.Background"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1494,7 +1494,7 @@
 </histogram>
 
 <histogram name="InstantTethering.Performance.ConnectToHotspotDuration"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1506,7 +1506,7 @@
 
 <histogram
     name="InstantTethering.Performance.DisconnectTetheringRequestDuration"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1516,7 +1516,7 @@
 </histogram>
 
 <histogram name="InstantTethering.Performance.KeepAliveTickleResponseDuration"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1527,7 +1527,7 @@
 
 <histogram
     name="InstantTethering.Performance.TetherAvailabilityResponseDuration"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1537,7 +1537,7 @@
 </histogram>
 
 <histogram name="InstantTethering.SessionCompletionReason"
-    enum="InstantTethering_SessionCompletionReason" expires_after="2023-12-31">
+    enum="InstantTethering_SessionCompletionReason" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1549,7 +1549,7 @@
 </histogram>
 
 <histogram name="InstantTethering.UserPreference.OnStartup"
-    enum="BooleanEnabled" expires_after="2023-12-31">
+    enum="BooleanEnabled" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1560,7 +1560,7 @@
 </histogram>
 
 <histogram name="InstantTethering.UserPreference.OnToggle"
-    enum="BooleanEnabled" expires_after="2023-12-31">
+    enum="BooleanEnabled" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1571,7 +1571,7 @@
 </histogram>
 
 <histogram name="MultiDevice.BetterTogetherSuite.MultiDeviceFeatureState"
-    enum="MultiDevice_FeatureState" expires_after="2023-12-31">
+    enum="MultiDevice_FeatureState" expires_after="2024-03-03">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1583,7 +1583,7 @@
 
 <histogram
     name="MultiDevice.BetterTogetherSuite.MultiDeviceFeatureState.MojoClient"
-    enum="MultiDevice_FeatureState" expires_after="2023-12-31">
+    enum="MultiDevice_FeatureState" expires_after="2024-03-03">
   <owner>julietlevesque@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1668,7 +1668,7 @@
 
 <histogram name="MultiDevice.ForgetHostConfirmed"
     enum="MultiDevice_VerifyAndForgetHostConfirmationState"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1677,7 +1677,7 @@
 </histogram>
 
 <histogram name="MultiDevice.PostOOBESetupFlow.PageShown"
-    enum="MultiDevice_PostOOBESetupFlow_Page" expires_after="2023-12-31">
+    enum="MultiDevice_PostOOBESetupFlow_Page" expires_after="2024-03-03">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1694,7 +1694,7 @@
 
 <histogram
     name="MultiDevice.SecureChannel.BLE.GattConnectionToAuthentication.EffectiveSuccessRateWithRetries"
-    enum="BooleanSuccess" expires_after="2023-12-31">
+    enum="BooleanSuccess" expires_after="2024-03-03">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1707,7 +1707,7 @@
 
 <histogram
     name="MultiDevice.SecureChannel.BLE.Performance.ConnectionToAuthenticationDuration.Background"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1723,7 +1723,7 @@
 
 <histogram
     name="MultiDevice.SecureChannel.BLE.Performance.ReceiveAdvertisementToConnectionDuration.Background"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1739,7 +1739,7 @@
 
 <histogram
     name="MultiDevice.SecureChannel.BLE.Performance.StartScanToAuthenticationDuration.Background"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1756,7 +1756,7 @@
 
 <histogram
     name="MultiDevice.SecureChannel.BLE.Performance.StartScanToConnectionDuration.Background"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1772,7 +1772,7 @@
 
 <histogram
     name="MultiDevice.SecureChannel.BLE.Performance.StartScanToReceiveAdvertisementDuration.Background"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1788,7 +1788,7 @@
 
 <histogram
     name="MultiDevice.SecureChannel.BLE.ReceiveAdvertisementToAuthentication.EffectiveSuccessRateWithRetries"
-    enum="BooleanSuccess" expires_after="2023-12-31">
+    enum="BooleanSuccess" expires_after="2024-03-03">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1800,7 +1800,7 @@
 
 <histogram
     name="MultiDevice.SecureChannel.BLE.ReceiveAdvertisementToGattConnection.EffectiveSuccessRateWithRetries"
-    enum="BooleanSuccess" expires_after="2023-12-31">
+    enum="BooleanSuccess" expires_after="2024-03-03">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1811,7 +1811,7 @@
 </histogram>
 
 <histogram name="MultiDevice.SecureChannel.Nearby.ConnectionMedium"
-    enum="SecureChannelNearbyConnectionMedium" expires_after="2023-12-31">
+    enum="SecureChannelNearbyConnectionMedium" expires_after="2024-03-03">
   <owner>hansenmichael@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1826,7 +1826,7 @@
 
 <histogram name="MultiDevice.SecureChannel.Nearby.ConnectionResult"
     enum="MultiDeviceNearbyConnectionsInitiatorResult"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansenmichael@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1839,7 +1839,7 @@
 </histogram>
 
 <histogram name="MultiDevice.SecureChannel.Nearby.DisconnectionReason"
-    enum="MultiDeviceNearbyDisconnectionReason" expires_after="2023-12-31">
+    enum="MultiDeviceNearbyDisconnectionReason" expires_after="2024-03-03">
   <owner>hansenmichael@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1854,7 +1854,7 @@
 </histogram>
 
 <histogram name="MultiDevice.SecureChannel.Nearby.EffectiveConnectionResult"
-    enum="BooleanSuccess" expires_after="2023-12-31">
+    enum="BooleanSuccess" expires_after="2024-03-03">
   <owner>hansenmichael@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1870,7 +1870,7 @@
 </histogram>
 
 <histogram name="MultiDevice.SecureChannel.Nearby.FileAction"
-    enum="MultiDeviceNearbyFileAction" expires_after="2023-12-31">
+    enum="MultiDeviceNearbyFileAction" expires_after="2024-03-03">
   <owner>jasonsun@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1881,7 +1881,7 @@
 </histogram>
 
 <histogram name="MultiDevice.SecureChannel.Nearby.FileTransferResult"
-    enum="MultiDeviceNearbyFileTransferResult" expires_after="2023-12-31">
+    enum="MultiDeviceNearbyFileTransferResult" expires_after="2024-03-03">
   <owner>jasonsun@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1892,7 +1892,7 @@
 </histogram>
 
 <histogram name="MultiDevice.SecureChannel.Nearby.MessageAction"
-    enum="MultiDeviceNearbyMessageAction" expires_after="2023-12-31">
+    enum="MultiDeviceNearbyMessageAction" expires_after="2024-03-03">
   <owner>hansenmichael@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1903,7 +1903,7 @@
 </histogram>
 
 <histogram name="MultiDevice.SecureChannel.Nearby.OperationResult.{Function}"
-    enum="NearbyConnectionsStatus" expires_after="2023-12-31">
+    enum="NearbyConnectionsStatus" expires_after="2024-03-03">
   <owner>hansenmichael@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1925,7 +1925,7 @@
 </histogram>
 
 <histogram name="MultiDevice.SecureChannel.Nearby.SendMessageResult"
-    enum="BooleanSuccess" expires_after="2023-12-31">
+    enum="BooleanSuccess" expires_after="2024-03-03">
   <owner>hansenmichael@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1936,7 +1936,7 @@
 </histogram>
 
 <histogram name="MultiDevice.SecureChannel.Nearby.WebRtcUpgradeDuration"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>hansenmichael@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1950,7 +1950,7 @@
 </histogram>
 
 <histogram name="MultiDevice.Setup.HasDuplicateEligibleHostDeviceNames"
-    enum="BooleanDuplicate" expires_after="2023-12-31">
+    enum="BooleanDuplicate" expires_after="2024-03-03">
   <owner>hansenmichael@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -1962,7 +1962,7 @@
 </histogram>
 
 <histogram name="MultiDevice.Setup.HostStatus"
-    enum="MultiDevice_Setup_HostStatus" expires_after="2023-12-31">
+    enum="MultiDevice_Setup_HostStatus" expires_after="2024-03-03">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2052,7 +2052,7 @@
 </histogram>
 
 <histogram name="MultiDeviceSetup.OOBE.UserChoice"
-    enum="MultiDeviceSetupOOBEUserChoice" expires_after="2023-12-31">
+    enum="MultiDeviceSetupOOBEUserChoice" expires_after="2024-03-03">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <owner>hsuregan@chromium.org</owner>
@@ -2074,7 +2074,7 @@
 </histogram>
 
 <histogram name="MultiDeviceSetup_NotificationClicked"
-    enum="MultiDeviceSetupNotification" expires_after="2023-12-31">
+    enum="MultiDeviceSetupNotification" expires_after="2024-03-10">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2095,7 +2095,7 @@
 </histogram>
 
 <histogram name="MultiDeviceSetup_NotificationShown"
-    enum="MultiDeviceSetupNotification" expires_after="2023-12-31">
+    enum="MultiDeviceSetupNotification" expires_after="2024-03-10">
   <owner>hansberry@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2104,7 +2104,7 @@
 </histogram>
 
 <histogram name="ProximityAuth.BleWeaveConnectionResult"
-    enum="ProximityAuth_BleWeaveConnectionResult" expires_after="2023-12-31">
+    enum="ProximityAuth_BleWeaveConnectionResult" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2115,7 +2115,7 @@
 
 <histogram name="ProximityAuth.BluetoothGattConnectionResult"
     enum="ProximityAuth_BluetoothGattConnectionResult"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2131,7 +2131,7 @@
 
 <histogram name="ProximityAuth.BluetoothGattNotifySessionResult"
     enum="ProximityAuth_BluetoothGattServiceOperationResult"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2147,7 +2147,7 @@
 
 <histogram name="ProximityAuth.BluetoothGattWriteCharacteristicResult"
     enum="ProximityAuth_BluetoothGattServiceOperationResult"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2181,7 +2181,7 @@
 </histogram>
 
 <histogram name="SmartLock.AuthMethodChoice.Unlock"
-    enum="SmartLockAuthMethodChoice" expires_after="2023-12-31">
+    enum="SmartLockAuthMethodChoice" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>Records the user's unlock method choice.</summary>
@@ -2198,7 +2198,7 @@
 </histogram>
 
 <histogram name="SmartLock.AuthResult" enum="BooleanSuccess"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2247,7 +2247,7 @@
 </histogram>
 
 <histogram name="SmartLock.AuthResult.Unlock" enum="BooleanSuccess"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2278,7 +2278,7 @@
 </histogram>
 
 <histogram name="SmartLock.EnabledState" enum="SmartLockEnabledState"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2304,7 +2304,7 @@
 </histogram>
 
 <histogram name="SmartLock.FindAndConnectToHostResult.Unlock"
-    enum="SmartLockFindAndConnectToHostResult" expires_after="2023-12-31">
+    enum="SmartLockFindAndConnectToHostResult" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2314,7 +2314,7 @@
 </histogram>
 
 <histogram name="SmartLock.FirstStatusToUser" enum="FirstSmartLockStatus"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>cclem@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2352,7 +2352,7 @@
 </histogram>
 
 <histogram name="SmartLock.GetRemoteStatus.Unlock" enum="BooleanSuccess"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2373,7 +2373,7 @@
 </histogram>
 
 <histogram name="SmartLock.MultiDeviceFeatureState"
-    enum="MultiDevice_FeatureState" expires_after="2023-12-31">
+    enum="MultiDevice_FeatureState" expires_after="2024-03-03">
   <owner>hansberry@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -2385,7 +2385,7 @@
 
 <histogram
     name="SmartLock.Performance.AuthenticationToReceiveFirstRemoteStatusDuration.Unlock"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
 <!-- Name completed by histogram_suffixes name="SmartLockStatusTypes" -->
 
   <owner>hansberry@chromium.org</owner>
@@ -2408,7 +2408,7 @@
 
 <histogram
     name="SmartLock.Performance.ShowLockScreenToShowFirstStatusToUserDuration.Unlock"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
 <!-- Name completed by histogram_suffixes name="SmartLockStatusTypes" -->
 
   <owner>hansberry@chromium.org</owner>
@@ -2431,7 +2431,7 @@
 
 <histogram
     name="SmartLock.Performance.StartScanToReceiveFirstRemoteStatusDuration.Unlock"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
 <!-- Name completed by histogram_suffixes name="SmartLockStatusTypes" -->
 
   <owner>hansberry@chromium.org</owner>
@@ -2459,7 +2459,7 @@
 </histogram>
 
 <histogram name="SmartLock.Toggle" enum="SmartLockToggle"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>cclem@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/crostini/histograms.xml b/tools/metrics/histograms/metadata/crostini/histograms.xml
index 1e4053e..e69d2b1 100644
--- a/tools/metrics/histograms/metadata/crostini/histograms.xml
+++ b/tools/metrics/histograms/metadata/crostini/histograms.xml
@@ -54,7 +54,7 @@
 </histogram>
 
 <histogram name="Crostini.AppLaunchResult.{Variant}" enum="CrostiniResult"
-    expires_after="2024-01-06">
+    expires_after="2024-03-10">
   <owner>davidmunro@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>The result of attempting to launch {Variant}.</summary>
@@ -78,7 +78,7 @@
 </histogram>
 
 <histogram name="Crostini.AvailableDiskError" units="MiB"
-    expires_after="2024-01-06">
+    expires_after="2024-03-10">
   <owner>davidmunro@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -165,28 +165,28 @@
 </histogram>
 
 <histogram name="Crostini.Disk.StatefulReadsDaily" units="KiB"
-    expires_after="2023-12-30">
+    expires_after="2024-03-03">
   <owner>drmasquatch@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>Crostini stateful KiB read per day. Reported daily.</summary>
 </histogram>
 
 <histogram name="Crostini.Disk.StatefulWritesDaily" units="KiB"
-    expires_after="2023-12-30">
+    expires_after="2024-03-03">
   <owner>drmasquatch@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>Crostini stateful KiB written per day. Reported daily.</summary>
 </histogram>
 
 <histogram name="Crostini.Disk.SwapReadsDaily" units="KiB"
-    expires_after="2023-12-30">
+    expires_after="2024-03-03">
   <owner>drmasquatch@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>Crostini swap file KiB read per day. Reported daily.</summary>
 </histogram>
 
 <histogram name="Crostini.Disk.SwapWritesDaily" units="KiB"
-    expires_after="2023-12-30">
+    expires_after="2024-03-03">
   <owner>drmasquatch@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>Crostini swap file KiB written per day. Reported daily.</summary>
@@ -228,7 +228,7 @@
 </histogram>
 
 <histogram name="Crostini.EngagementTime.{Variant}" units="ms"
-    expires_after="2024-01-06">
+    expires_after="2024-03-10">
   <owner>davidmunro@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -271,7 +271,7 @@
 </histogram>
 
 <histogram name="Crostini.InputMethodOnBlur" enum="InputMethodID2"
-    expires_after="2024-01-06">
+    expires_after="2024-03-10">
   <owner>timloh@chromium.org</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -316,7 +316,7 @@
 </histogram>
 
 <histogram name="Crostini.RestarterResult" enum="CrostiniResult"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>davidmunro@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -347,7 +347,7 @@
 </histogram>
 
 <histogram name="Crostini.RestarterTimeInState2.{state}" units="ms"
-    expires_after="2024-01-06">
+    expires_after="2024-03-10">
   <owner>davidmunro@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -391,7 +391,7 @@
 </histogram>
 
 <histogram name="Crostini.Setup.Started" enum="BooleanAttempted"
-    expires_after="2023-11-12">
+    expires_after="2024-03-03">
   <owner>davidmunro@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
@@ -594,7 +594,7 @@
 </histogram>
 
 <histogram name="Crostini.UpgradeDialogEvent" enum="CrostiniUpgradeDialogEvent"
-    expires_after="2024-01-06">
+    expires_after="2024-03-10">
   <owner>davidmunro@google.com</owner>
   <owner>clumptini@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/cryptohome/histograms.xml b/tools/metrics/histograms/metadata/cryptohome/histograms.xml
index 64f92a1e..f96b101 100644
--- a/tools/metrics/histograms/metadata/cryptohome/histograms.xml
+++ b/tools/metrics/histograms/metadata/cryptohome/histograms.xml
@@ -726,7 +726,7 @@
 </histogram>
 
 <histogram name="Cryptohome.{AuthBlockType}.CredentialRevocationResult"
-    enum="CryptohomeLECredError" expires_after="2024-01-01">
+    enum="CryptohomeLECredError" expires_after="2024-03-03">
   <owner>anastasiian@chromium.org</owner>
   <owner>cros-lurs@google.com</owner>
   <summary>
@@ -738,7 +738,7 @@
 </histogram>
 
 <histogram name="Cryptohome.{AuthBlockType}.PrepareForRemovalResult"
-    enum="CryptohomeCryptoError" expires_after="2024-01-01">
+    enum="CryptohomeCryptoError" expires_after="2024-03-03">
   <owner>anastasiian@chromium.org</owner>
   <owner>cros-lurs@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/custom_tabs/histograms.xml b/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
index 823c8bc..bc957f42 100644
--- a/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
+++ b/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
@@ -877,7 +877,7 @@
 </histogram>
 
 <histogram name="TrustedWebActivity.SplashScreenShown" enum="Boolean"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>peconn@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/dev/histograms.xml b/tools/metrics/histograms/metadata/dev/histograms.xml
index f753a7b..8050d5c 100644
--- a/tools/metrics/histograms/metadata/dev/histograms.xml
+++ b/tools/metrics/histograms/metadata/dev/histograms.xml
@@ -50,7 +50,7 @@
 </histogram>
 
 <histogram name="DevTools.BadgeActivated" enum="DevToolsBadgeActivated"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>ergunsh@chromium.org</owner>
   <owner>changhaohan@chromium.org</owner>
   <owner>bmeurer@chromium.org</owner>
@@ -201,7 +201,7 @@
 </histogram>
 
 <histogram name="DevTools.Elements.SidebarTabShown"
-    enum="DevToolsElementsSidebarTab" expires_after="2023-12-31">
+    enum="DevToolsElementsSidebarTab" expires_after="2024-03-03">
   <owner>bmeurer@chromium.org</owner>
   <owner>changhaohan@chromium.org</owner>
   <summary>
@@ -426,7 +426,7 @@
 </histogram>
 
 <histogram name="DevTools.RecordingCodeToggled"
-    enum="DevToolsRecordingCodeToggled" expires_after="2024-01-10">
+    enum="DevToolsRecordingCodeToggled" expires_after="2024-03-10">
   <owner>alexrudenko@chromium.org</owner>
   <owner>mathias@chromium.org</owner>
   <owner>yangguo@chromium.org</owner>
@@ -501,14 +501,14 @@
 </histogram>
 
 <histogram name="DevTools.SidebarPaneShown" enum="DevToolsSidebarPane"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>bmeurer@chromium.org</owner>
   <owner>changhaohan@chromium.org</owner>
   <summary>Specified DevTools sidebar pane was shown.</summary>
 </histogram>
 
 <histogram name="DevTools.Sources.SidebarTabShown"
-    enum="DevToolsSourcesSidebarTab" expires_after="2023-12-31">
+    enum="DevToolsSourcesSidebarTab" expires_after="2024-03-03">
   <owner>bmeurer@chromium.org</owner>
   <owner>jarin@chromium.org</owner>
   <summary>
@@ -517,7 +517,7 @@
 </histogram>
 
 <histogram name="DevTools.SourcesPanelFileDebugged" enum="DevToolsMediaType"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>bmeurer@chromium.org</owner>
   <owner>szuend@chromium.org</owner>
   <summary>
@@ -528,7 +528,7 @@
 </histogram>
 
 <histogram name="DevTools.SourcesPanelFileOpened" enum="DevToolsMediaType"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>yangguo@chromium.org</owner>
   <owner>bmeurer@chromium.org</owner>
   <summary>
@@ -537,7 +537,7 @@
 </histogram>
 
 <histogram name="DevTools.StyleTextCopied" enum="DevToolsStyleTextCopied"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>changhaohan@chromium.org</owner>
   <owner>bmeurer@chromium.org</owner>
   <owner>yangguo@chromium.org</owner>
@@ -585,7 +585,7 @@
 </histogram>
 
 <histogram name="DevTools.Workspaces.NumberOfDirectoriesTraversed"
-    units="count" expires_after="2024-01-21">
+    units="count" expires_after="2024-12-01">
   <owner>bmeurer@chromium.org</owner>
   <owner>hablich@chromium.org</owner>
   <summary>
@@ -595,7 +595,7 @@
 </histogram>
 
 <histogram name="DevTools.Workspaces.NumberOfFilesLoaded" units="count"
-    expires_after="2024-01-21">
+    expires_after="2024-12-01">
   <owner>bmeurer@chromium.org</owner>
   <owner>hablich@chromium.org</owner>
   <summary>
@@ -605,7 +605,7 @@
 </histogram>
 
 <histogram name="DevTools.Workspaces.PopulateWallClockTime" units="ms"
-    expires_after="M120">
+    expires_after="2024-12-01">
   <owner>bmeurer@chromium.org</owner>
   <owner>hablich@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/direct/OWNERS b/tools/metrics/histograms/metadata/direct/OWNERS
deleted file mode 100644
index 84cc738..0000000
--- a/tools/metrics/histograms/metadata/direct/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-per-file OWNERS=file://tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
-
-# Prefer sending CLs to the owners listed below.
-# Use chromium-metrics-reviews@google.com as a backup.
diff --git a/tools/metrics/histograms/metadata/direct/histograms.xml b/tools/metrics/histograms/metadata/direct/histograms.xml
deleted file mode 100644
index b263cd4..0000000
--- a/tools/metrics/histograms/metadata/direct/histograms.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
-Copyright 2020 The Chromium Authors
-Use of this source code is governed by a BSD-style license that can be
-found in the LICENSE file.
--->
-
-<!--
-This file is used to generate a comprehensive list of Direct histograms
-along with a detailed description for each histogram.
-
-For best practices on writing histogram descriptions, see
-https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md
-
-Please follow the instructions in the OWNERS file in this directory to find a
-reviewer. If no OWNERS file exists, please consider signing up at
-go/reviewing-metrics (Googlers only), as all subdirectories are expected to
-have an OWNERS file. As a last resort you can send the CL to
-chromium-metrics-reviews@google.com.
--->
-
-<histogram-configuration>
-
-<histograms>
-
-<histogram name="DirectWrite.Fonts.Gfx.InitializeTime" units="ms"
-    expires_after="2024-01-28">
-  <owner>etienneb@chromium.org</owner>
-  <owner>gab@chromium.org</owner>
-  <summary>
-    Time it takes to initialize GFX fonts. This metric is taken by the browser
-    process at startup. It includes the time required to initialize Direct
-    Write. This metric is recorded only on Windows.
-  </summary>
-</histogram>
-
-</histograms>
-
-</histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/download/histograms.xml b/tools/metrics/histograms/metadata/download/histograms.xml
index 96d0812..10ce8b3f 100644
--- a/tools/metrics/histograms/metadata/download/histograms.xml
+++ b/tools/metrics/histograms/metadata/download/histograms.xml
@@ -559,7 +559,7 @@
 </histogram>
 
 <histogram name="Download.IOSDownloadFileUI" enum="DownloadFileUI"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>sdefresne@chromium.org</owner>
   <owner>ewannpv@chromium.org</owner>
   <owner>mrefaat@chromium.org</owner>
@@ -582,7 +582,7 @@
 </histogram>
 
 <histogram name="Download.IOSDownloadMimeType" enum="DownloadMimeTypeResult"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>sdefresne@chromium.org</owner>
   <owner>ewannpv@chromium.org</owner>
   <owner>mrefaat@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml
index 1c651ba5..da2da53 100644
--- a/tools/metrics/histograms/metadata/enterprise/histograms.xml
+++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -627,7 +627,7 @@
 
 <histogram
     name="Enterprise.DeviceRemoteCommand.Crd.{Enterprise_CrdSessionType}.{Enterprise_UserSessionType}.Result"
-    enum="EnterpriseCrdSessionResultCode" expires_after="2024-01-01">
+    enum="EnterpriseCrdSessionResultCode" expires_after="2024-03-10">
   <owner>macinashutosh@google.com</owner>
   <owner>chromeos-commercial-crd@google.com</owner>
   <summary>
@@ -641,7 +641,7 @@
 
 <histogram
     name="Enterprise.DeviceRemoteCommand.Crd.{Enterprise_CrdSessionType}.{Enterprise_UserSessionType}.SessionDuration"
-    units="minutes" expires_after="2024-01-01">
+    units="minutes" expires_after="2024-03-03">
   <owner>macinashutosh@google.com</owner>
   <owner>chromeos-commercial-crd@google.com</owner>
   <summary>
@@ -1365,23 +1365,33 @@
   <summary>Record whether the kernel supports fanotify delete events.</summary>
 </histogram>
 
-<histogram name="Enterprise.Dlp.FileActionBlocked"
+<histogram name="Enterprise.Dlp.FileActionBlocked2"
     enum="EnterpriseDlpPolicyFileAction" expires_after="2023-12-01">
   <owner>accorsi@google.com</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
-    Records which file action is blocked because of Data Leak Prevention policy
-    restrictions.
+    Records when a file action is blocked because of Data Leak Prevention policy
+    Files restriction. Identifies which file action was blocked.
   </summary>
 </histogram>
 
-<histogram name="Enterprise.Dlp.FileActionWarned"
+<histogram name="Enterprise.Dlp.FileActionBlockReviewed"
+    enum="EnterpriseDlpPolicyFileAction" expires_after="2024-03-01">
+  <owner>ayaelattar@google.com</owner>
+  <owner>chromeos-dlp@google.com</owner>
+  <summary>
+    Records which file action blocked by Data Leak Prevention policy is
+    reviewed.
+  </summary>
+</histogram>
+
+<histogram name="Enterprise.Dlp.FileActionWarned2"
     enum="EnterpriseDlpPolicyFileAction" expires_after="2023-12-01">
   <owner>accorsi@google.com</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
-    Records which file action is warned because of Data Leak Prevention policy
-    restrictions.
+    Records when a file action is warned because of Data Leak Prevention policy
+    Files restriction. Identifies which file action was warned.
   </summary>
 </histogram>
 
@@ -1395,6 +1405,26 @@
   </summary>
 </histogram>
 
+<histogram name="Enterprise.Dlp.FileActionWarnReviewed"
+    enum="EnterpriseDlpPolicyFileAction" expires_after="2024-03-01">
+  <owner>ayaelattar@google.com</owner>
+  <owner>chromeos-dlp@google.com</owner>
+  <summary>
+    Records which file action warning by Data Leak Prevention policy was
+    reviewed.
+  </summary>
+</histogram>
+
+<histogram name="Enterprise.Dlp.FileActionWarnTimedOut"
+    enum="EnterpriseDlpPolicyFileAction" expires_after="2024-03-01">
+  <owner>ayaelattar@google.com</owner>
+  <owner>chromeos-dlp@google.com</owner>
+  <summary>
+    Records which file action was warned because of Data Leak Prevention policy
+    and the warning timed out.
+  </summary>
+</histogram>
+
 <histogram name="Enterprise.Dlp.FilesAppOpenTimedOut" enum="Boolean"
     expires_after="2024-03-01">
   <owner>aidazolic@google.com</owner>
@@ -1405,6 +1435,16 @@
   </summary>
 </histogram>
 
+<histogram name="Enterprise.Dlp.FilesBlockedCount" units="entries"
+    expires_after="2024-03-01">
+  <owner>ayaelattar@google.com</owner>
+  <owner>chromeos-dlp@google.com</owner>
+  <summary>
+    Records the number of files blocked by Data Leak Prevention policy per file
+    action.
+  </summary>
+</histogram>
+
 <histogram name="Enterprise.Dlp.FilesDaemonStarted" enum="Boolean"
     expires_after="2023-12-01">
   <owner>poromov@chromium.org</owner>
@@ -1415,6 +1455,16 @@
   </summary>
 </histogram>
 
+<histogram name="Enterprise.Dlp.FilesWarnedCount" units="entries"
+    expires_after="2024-03-01">
+  <owner>ayaelattar@google.com</owner>
+  <owner>chromeos-dlp@google.com</owner>
+  <summary>
+    Records the number of files warned by Data Leak Prevention policy per file
+    action.
+  </summary>
+</histogram>
+
 <histogram name="Enterprise.Dlp.PrintingBlocked" enum="BooleanBlocked"
     expires_after="2023-12-10">
   <owner>poromov@chromium.org</owner>
@@ -1423,7 +1473,7 @@
 </histogram>
 
 <histogram name="Enterprise.Dlp.PrintingWarned" enum="BooleanWarned"
-    expires_after="2023-10-08">
+    expires_after="2024-03-01">
   <owner>aidazolic@chromium.org</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
@@ -1433,7 +1483,7 @@
 </histogram>
 
 <histogram name="Enterprise.Dlp.PrintingWarnProceeded" enum="Boolean"
-    expires_after="2023-12-01">
+    expires_after="2024-03-01">
   <owner>aidazolic@chromium.org</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
@@ -1443,7 +1493,7 @@
 </histogram>
 
 <histogram name="Enterprise.Dlp.PrintingWarnSilentProceeded" enum="Boolean"
-    expires_after="2023-12-01">
+    expires_after="2024-03-01">
   <owner>aidazolic@chromium.org</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
@@ -1493,7 +1543,7 @@
 </histogram>
 
 <histogram name="Enterprise.Dlp.ReportedWarnLevelRestriction"
-    enum="EnterpriseDlpPolicyRestriction" expires_after="2023-12-01">
+    enum="EnterpriseDlpPolicyRestriction" expires_after="2024-03-10">
   <owner>poromov@chromium.org</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
@@ -1503,7 +1553,7 @@
 </histogram>
 
 <histogram name="Enterprise.Dlp.ReportedWarnProceedLevelRestriction"
-    enum="EnterpriseDlpPolicyRestriction" expires_after="2023-12-01">
+    enum="EnterpriseDlpPolicyRestriction" expires_after="2024-03-10">
   <owner>poromov@chromium.org</owner>
   <owner>chromeos-dlp@google.com</owner>
   <summary>
@@ -2289,7 +2339,7 @@
 </histogram>
 
 <histogram name="Enterprise.PlatformAuth.GetAuthData.Count" units="count"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>igorruvinov@chromium.org</owner>
   <owner>zmin@chromium.org</owner>
   <summary>
@@ -2446,7 +2496,7 @@
 </histogram>
 
 <histogram name="Enterprise.PolicyUpdatePeriod.MachineLevelUser" units="days"
-    expires_after="2023-11-30">
+    expires_after="2024-03-03">
   <owner>zmin@chromium.org</owner>
   <owner>pastarmovj@chromium.org</owner>
   <summary>
@@ -2873,6 +2923,19 @@
   </summary>
 </histogram>
 
+<histogram name="Enterprise.UserPolicy.Count" units="policies"
+    expires_after="2024-06-12">
+  <owner>vincb@google.com</owner>
+  <owner>ftirelo@chromium.org</owner>
+  <summary>
+    Records the number of user policies that are active when using a managed
+    account.
+
+    Recorded once during the profile's browsing session on the first policy
+    update after signing in with a managed account.
+  </summary>
+</histogram>
+
 <histogram name="Enterprise.UserPolicyChromeOS.ChildUser.OAuthTokenError"
     enum="GoogleServiceAuthError" expires_after="2024-01-14">
   <owner>agawronska@chromium.org</owner>
@@ -3195,7 +3258,7 @@
 </histogram>
 
 <histogram name="EnterpriseCheck.OSType" enum="OsSuite"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
   <owner>ydago@chromium.org</owner>
   <owner>pastarmovj@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml
index de24b9cc..f1f6304 100644
--- a/tools/metrics/histograms/metadata/extensions/histograms.xml
+++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -39,6 +39,24 @@
   <variant name=".Tab" summary="A port opened to a tab context."/>
 </variants>
 
+<variants name="ManifestLocationGroup">
+  <variant name="Component"
+      summary="component extension(s) (ManifestLocations kComponent and
+               kExternalComponent)"/>
+  <variant name="External"
+      summary="external extension(s) (ManifestLocations kExternalPref,
+               kExternalPrefDownload, and kExternalRegistry)"/>
+  <variant name="Internal"
+      summary="internal extension(s) (ManifestLocation::kInternal; likely
+               user-installed)"/>
+  <variant name="Policy"
+      summary="policy-installed extension(s) (ManifestLocations
+               kExternalPolicy and kExternalPolicyDownload)"/>
+  <variant name="Unpacked"
+      summary="unpacked and developer extension(s) (ManifestLocations
+               kCommandLine and kUnpacked)"/>
+</variants>
+
 <histogram name="ExtensionBlacklist.BlacklistInstalled"
     enum="ExtensionLocation" expires_after="2023-11-18">
   <owner>anunoy@chromium.org</owner>
@@ -139,7 +157,7 @@
 </histogram>
 
 <histogram name="Extensions.ActiveScriptController.PermittedExtensions"
-    units="Extension Count" expires_after="2024-01-07">
+    units="Extension Count" expires_after="2024-03-10">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -794,14 +812,15 @@
 </histogram>
 
 <histogram name="Extensions.DeclarativeNetRequest.ReadDynamicRulesJSONStatus"
-    enum="ReadDynamicRulesJSONStatus" expires_after="2023-06-01">
+    enum="ReadDynamicRulesJSONStatus" expires_after="2024-06-01">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>src/extensions/OWNERS</owner>
   <summary>
     Indicates the result of reading the dynamic JSON rules for an extension from
     the disk. Logged whenever an extension calls the getDynamicRules extension
     function or when it updates the dynamic rules through a call to
-    addDynamicRules or removeDynamicRules.
+    addDynamicRules or removeDynamicRules. Note: this histogram was expired from
+    2023-06-01 to 2023-09-01; data may be missing.
   </summary>
 </histogram>
 
@@ -817,7 +836,7 @@
 </histogram>
 
 <histogram name="Extensions.DeclarativeNetRequest.RequestHeaderAdded"
-    enum="WebRequest.RequestHeader" expires_after="2023-08-08">
+    enum="WebRequest.RequestHeader" expires_after="2024-08-08">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>kelvinjiang@chromium.org</owner>
   <owner>src/extensions/OWNERS</owner>
@@ -901,13 +920,14 @@
 </histogram>
 
 <histogram name="Extensions.DeclarativeNetRequest.UpdateDynamicRulesStatus"
-    enum="UpdateDynamicRulesStatus" expires_after="2023-06-26">
+    enum="UpdateDynamicRulesStatus" expires_after="2024-06-26">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>src/extensions/OWNERS</owner>
   <summary>
     Indicates the result of an extension function call to add or remove dynamic
     rules. Logged every time an extension calls the addDynamicRules or
-    removeDynamicRules extension function.
+    removeDynamicRules extension function. Note: this histogram was expired from
+    2023-06-26 to 2023-09-01; data may be missing.
   </summary>
 </histogram>
 
@@ -1529,7 +1549,7 @@
 </histogram>
 
 <histogram name="Extensions.ExtensionsWithPageActions" units="units"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -2288,7 +2308,7 @@
 </histogram>
 
 <histogram name="Extensions.Functions.SucceededTotalExecutionTime" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -2474,7 +2494,7 @@
 </histogram>
 
 <histogram name="Extensions.HomepageOverrides2" units="units"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>kelvinjiang@chromium.org</owner>
   <summary>
@@ -2653,7 +2673,7 @@
 </histogram>
 
 <histogram name="Extensions.IncognitoNotAllowed2" units="units"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -3403,7 +3423,7 @@
 </histogram>
 
 <histogram name="Extensions.LoadTheme2" units="units"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -3571,6 +3591,32 @@
   </summary>
 </histogram>
 
+<histogram name="Extensions.ManifestVersion2Count.{ManifestLocation}"
+    units="number of extensions" expires_after="2024-08-14">
+  <owner>rdevlin.cronin@chromium.org</owner>
+  <owner>extensions-core@chromium.org</owner>
+  <summary>
+    The number of enabled manifest version 2 {ManifestLocation}. Emitted once on
+    profile startup for user profiles (profiles where users can install
+    extensions, specifically profiles that can have non-component extensions
+    installed).
+  </summary>
+  <token key="ManifestLocation" variants="ManifestLocationGroup"/>
+</histogram>
+
+<histogram name="Extensions.ManifestVersion3Count.{ManifestLocation}"
+    units="number of extensions" expires_after="2024-08-14">
+  <owner>rdevlin.cronin@chromium.org</owner>
+  <owner>extensions-core@chromium.org</owner>
+  <summary>
+    The number of enabled manifest version 3 {ManifestLocation}. Emitted once on
+    profile startup for user profiles (profiles where users can install
+    extensions, specifically profiles that can have non-component extensions
+    installed).
+  </summary>
+  <token key="ManifestLocation" variants="ManifestLocationGroup"/>
+</histogram>
+
 <histogram name="Extensions.ManifestVersionByLocation.{ManifestLocation}"
     units="manifest version" expires_after="2024-08-14">
   <owner>rdevlin.cronin@chromium.org</owner>
@@ -3582,23 +3628,17 @@
     extensions, specifically profiles that can have non-component extensions
     installed).
   </summary>
-  <token key="ManifestLocation">
-    <variant name="Component"
-        summary="component extension (ManifestLocations kComponent and
-                 kExternalComponent)"/>
-    <variant name="External"
-        summary="external extension (ManifestLocations, kExternalPref,
-                 kExternalPrefDownload, and kExternalRegistry)"/>
-    <variant name="Internal"
-        summary="internal extension (ManifestLocation::kInternal; likely
-                 user-installed)"/>
-    <variant name="Policy"
-        summary="policy-installed extension (ManifestLocations
-                 kExternalPolicy and kExternalPolicyDownload)"/>
-    <variant name="Unpacked"
-        summary="unpacked and developer extension (ManifestLocations
-                 kCommandLine and kUnpacked)"/>
-  </token>
+  <token key="ManifestLocation" variants="ManifestLocationGroup"/>
+</histogram>
+
+<histogram name="Extensions.MenuManager.MenuItemsCount" units="items"
+    expires_after="2024-03-31">
+  <owner>dbertoni@chromium.org</owner>
+  <owner>extensions-core@chromium.org</owner>
+  <summary>
+    The number of context menu items loaded from storage when an extension is
+    loaded.
+  </summary>
 </histogram>
 
 <histogram
@@ -3675,7 +3715,7 @@
 </histogram>
 
 <histogram name="Extensions.Navigation.Scheme" enum="ExtensionNavigationScheme"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>jkokatsu@google.com</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -3718,7 +3758,7 @@
 </histogram>
 
 <histogram name="Extensions.NewTabPageOverrides2" units="units"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>kelvinjiang@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/families/histograms.xml b/tools/metrics/histograms/metadata/families/histograms.xml
index 4a66fcf7..519528a 100644
--- a/tools/metrics/histograms/metadata/families/histograms.xml
+++ b/tools/metrics/histograms/metadata/families/histograms.xml
@@ -262,7 +262,7 @@
 </histogram>
 
 <histogram name="FamilyLinkUser.ClassifyUrlRequest.AuthError"
-    enum="GoogleServiceAuthError" expires_after="2023-12-31">
+    enum="GoogleServiceAuthError" expires_after="2024-03-03">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <summary>
@@ -287,12 +287,13 @@
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <summary>
-    Tracks the latency in calls to Kids Management API::ClassifyURL.
+    Tracks the latency in calls to Kids Management API::ClassifyURL. Googlers
+    only: See go/chrome-kids-backend-monitoring for backend-related metrics.
   </summary>
 </histogram>
 
 <histogram name="FamilyLinkUser.ClassifyUrlRequest.ParsingResult"
-    enum="KidsChromeManagementClientParsingError" expires_after="2023-12-31">
+    enum="KidsChromeManagementClientParsingError" expires_after="2024-03-03">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <summary>
@@ -348,6 +349,8 @@
   <owner>chrome-kids-eng@google.com</owner>
   <summary>
     Tracks the latency in calls to Kids Management API::CreatePermissionRequest.
+    Googlers only: See go/chrome-kids-backend-monitoring for backend-related
+    metrics.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/fastpair/histograms.xml b/tools/metrics/histograms/metadata/fastpair/histograms.xml
index f6b4ee0..6bb0bfeb 100644
--- a/tools/metrics/histograms/metadata/fastpair/histograms.xml
+++ b/tools/metrics/histograms/metadata/fastpair/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="FastPair.CreateBond.Latency" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jackshira@google.com</owner>
   <owner>dclasson@google.com</owner>
   <owner>brandosocarras@google.com</owner>
@@ -36,7 +36,7 @@
 </histogram>
 
 <histogram name="FastPair.GattConnection" enum="FastPairGattConnectionSteps"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jackshira@google.com</owner>
   <owner>dclasson@google.com</owner>
   <owner>brandosocarras@google.com</owner>
@@ -62,7 +62,7 @@
 </histogram>
 
 <histogram name="FastPair.Handshake.AttemptCount" units="count"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jackshira@google.com</owner>
   <owner>dclasson@google.com</owner>
   <owner>brandosocarras@google.com</owner>
@@ -75,7 +75,7 @@
 </histogram>
 
 <histogram name="FastPair.Handshake.EffectiveSuccessRate" enum="BooleanSuccess"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jackshira@google.com</owner>
   <owner>dclasson@google.com</owner>
   <owner>brandosocarras@google.com</owner>
@@ -88,7 +88,7 @@
 </histogram>
 
 <histogram name="FastPair.InitialPairing"
-    enum="FastPairInitialSuccessFunnelEvent" expires_after="2023-12-31">
+    enum="FastPairInitialSuccessFunnelEvent" expires_after="2024-03-03">
   <owner>jackshira@google.com</owner>
   <owner>dclasson@google.com</owner>
   <owner>brandosocarras@google.com</owner>
@@ -155,7 +155,7 @@
 </histogram>
 
 <histogram name="FastPair.RetroactivePairing"
-    enum="FastPairRetroactiveSuccessFunnelEvent" expires_after="2023-12-31">
+    enum="FastPairRetroactiveSuccessFunnelEvent" expires_after="2024-03-03">
   <owner>jackshira@google.com</owner>
   <owner>dclasson@google.com</owner>
   <owner>brandosocarras@google.com</owner>
@@ -170,7 +170,7 @@
 </histogram>
 
 <histogram name="FastPair.SubsequentPairing"
-    enum="FastPairSubsequentSuccessFunnelEvent" expires_after="2023-12-31">
+    enum="FastPairSubsequentSuccessFunnelEvent" expires_after="2024-03-03">
   <owner>jackshira@google.com</owner>
   <owner>dclasson@google.com</owner>
   <owner>brandosocarras@google.com</owner>
@@ -183,7 +183,7 @@
 </histogram>
 
 <histogram name="FastPair.{FastPairPairingProtocol}.Pairing"
-    enum="FastPairProtocolPairingSteps" expires_after="2023-12-31">
+    enum="FastPairProtocolPairingSteps" expires_after="2024-03-03">
   <owner>jackshira@google.com</owner>
   <owner>dclasson@google.com</owner>
   <owner>brandosocarras@google.com</owner>
@@ -203,7 +203,7 @@
 </histogram>
 
 <histogram name="FastPair.{PairingScenario}.Initialization"
-    enum="FastPairInitializePairingProcessEvent" expires_after="2023-12-31">
+    enum="FastPairInitializePairingProcessEvent" expires_after="2024-03-03">
   <owner>jackshira@google.com</owner>
   <owner>dclasson@google.com</owner>
   <owner>brandosocarras@google.com</owner>
@@ -241,7 +241,7 @@
 </histogram>
 
 <histogram name="FastPair.{PairingScenario}.Initialization.FailureReason"
-    enum="FastPairPairFailure" expires_after="2023-12-31">
+    enum="FastPairPairFailure" expires_after="2024-03-03">
   <owner>jackshira@google.com</owner>
   <owner>dclasson@google.com</owner>
   <owner>brandosocarras@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
index 68f6085f..564dca6 100644
--- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
+++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -28,6 +28,9 @@
 </variants>
 
 <variants name="IPHFeature">
+  <variant name="IPH_3pcdUserBypass"
+      summary="promo for bypassing cookie blocking during third-party cookie
+               deprecation"/>
   <variant name="IPH_AdaptiveButtonInTopToolbarCustomization_AddToBookmarks"
       summary="the add to bookmarks adaptive button in the top toolbar"/>
   <variant name="IPH_AdaptiveButtonInTopToolbarCustomization_NewTab"
@@ -57,9 +60,6 @@
   <variant name="IPH_AutofillExternalAccountProfileSuggestion"
       summary="message shown along with the externally created (e.g. in
                Google Pay) profile suggestion option in the Autofill dropdown"/>
-  <variant name="IPH_AutofillFeedbackNewBadge"
-      summary="New badge shown along with the autofill feedback option in the
-               menu dropdown"/>
   <variant name="IPH_AutofillVirtualCardCVCSuggestion"
       summary="message shown to users that have saved a virtual card on an
                online merchant website to educate users on how to fill in
@@ -189,6 +189,8 @@
   <variant name="IPH_IncognitoWindow" summary="incognito window"/>
   <variant name="IPH_InstanceSwitcher" summary="instance switcher"/>
   <variant name="IPH_IntentChip" summary="opening a webpage in an app"/>
+  <variant name="IPH_iOSChoiceScreenFeature"
+      summary="showing the Choice screen on iOS"/>
   <variant name="IPH_iOSDefaultBrowserBadgeEligibility"
       summary="default browser badge promo eligibility tracking"/>
   <variant name="IPH_iOSDefaultBrowserOverflowMenuBadge"
@@ -388,6 +390,9 @@
                highlights"/>
   <variant name="IPH_SharingHubLinkToggle"
       summary="turning on link sharing in the Sharing Hub"/>
+  <variant name="IPH_ShoppingCollectionFeature"
+      summary="UI that is shown in the bookmark save flow when a page is
+               saved to the shopping collection"/>
   <variant name="IPH_ShoppingListMenuItem"
       summary="A text bubble showing that a product can be tracked from the
                overflow menu"/>
@@ -443,7 +448,7 @@
 </variants>
 
 <histogram name="InProductHelp.Config.ParsingEvent" enum="ConfigParsingEvent"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>nyquist@chromium.org</owner>
   <summary>
     Records if in-product help configuration is parsed correctly, and the
@@ -584,7 +589,7 @@
 </histogram>
 
 <histogram name="Tutorial{TutorialID}.Completion" enum="BooleanSuccess"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>dpenning@chromium.org</owner>
   <owner>dfried@chromium.org</owner>
   <summary>
@@ -595,7 +600,7 @@
 </histogram>
 
 <histogram name="Tutorial{TutorialID}.IPHLinkClicked" enum="BooleanSuccess"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>dpenning@chromium.org</owner>
   <owner>dfried@chromium.org</owner>
   <summary>
@@ -618,6 +623,14 @@
   <token key="TutorialID" variants="TutorialID"/>
 </histogram>
 
+<histogram name="UserEducation.MessageAction.{IPHFeature}" enum="MessageAction"
+    expires_after="2024-09-01">
+  <owner>mickeyburks@chromium.org</owner>
+  <owner>frizzle-team@google.com</owner>
+  <summary>Records what action was taken to close the In-Product Help.</summary>
+  <token key="IPHFeature" variants="IPHFeature"/>
+</histogram>
+
 </histograms>
 
 </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/file/histograms.xml b/tools/metrics/histograms/metadata/file/histograms.xml
index dfc86ae..3d0b520 100644
--- a/tools/metrics/histograms/metadata/file/histograms.xml
+++ b/tools/metrics/histograms/metadata/file/histograms.xml
@@ -49,7 +49,7 @@
   <variant name="GoogleDrive"
       summary="The file was opened using the file task for Google
                Drive/Workspace"/>
-  <variant name="MicrosoftOneDrive"
+  <variant name="OneDrive"
       summary="The file was opened using the file task for OneDrive/Microsoft
                365"/>
 </variants>
@@ -306,7 +306,7 @@
 </histogram>
 
 <histogram name="FileBrowser.DirectoryTree.Expand.{RootType}" units="ms"
-    expires_after="2024-01-04">
+    expires_after="2024-03-10">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -328,7 +328,7 @@
 </histogram>
 
 <histogram name="FileBrowser.DownloadDestination.IsGoogleDrive.Started"
-    enum="BooleanEnabled" expires_after="2023-12-31">
+    enum="BooleanEnabled" expires_after="2024-03-03">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -712,6 +712,20 @@
   </summary>
 </histogram>
 
+<histogram name="FileBrowser.GoogleDrive.DSSAvailabilityPercentage" units="%"
+    expires_after="2024-06-01">
+  <owner>simmonsjosh@google.com</owner>
+  <owner>src/ui/file_manager/OWNERS</owner>
+  <summary>
+    Percentage of Docs/Sheets/Slides that are available offline compared to the
+    total number of known Docs/Sheets/Slides by DriveFS. A file is considered
+    known if DriveFS has cached the metadata for the file. Docs offline can see
+    many more files then DriveFS so we prune the list of known files before
+    sending this metric. This is emitted during the polling of Docs offline
+    which happens if at least one Files app window is open.
+  </summary>
+</histogram>
+
 <histogram
     name="FileBrowser.HoldingSpace.TimeFromFirstWelcomeBannerShowToFirstPin"
     units="ms" expires_after="2024-01-14">
@@ -801,7 +815,7 @@
 </histogram>
 
 <histogram name="FileBrowser.Location.OnEntryExpandedOrCollapsed.TopLevel"
-    enum="FileManagerRootType" expires_after="2023-12-31">
+    enum="FileManagerRootType" expires_after="2024-03-03">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1006,13 +1020,7 @@
     <variant name="0100MB-to-1GB"/>
     <variant name="1000MB-and-above"/>
   </token>
-<!-- Defining this token inline instead of using the `CloudProvider` variant
-  because this it's spelled differently at call sites in existing builds. -->
-
-  <token key="CloudProvider">
-    <variant name="GoogleDrive"/>
-    <variant name="OneDrive"/>
-  </token>
+  <token key="CloudProvider" variants="CloudProvider"/>
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.ODFS.FileSize.{Direction}" units="KiB"
@@ -1128,7 +1136,7 @@
   </token>
 </histogram>
 
-<histogram name="FileBrowser.OfficeFiles.Open.FileType.{ProviderName}"
+<histogram name="FileBrowser.OfficeFiles.Open.FileType.{CloudProvider}"
     enum="OfficeOpenExtensions" expires_after="M124">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
@@ -1136,16 +1144,11 @@
     Chrome OS File Browser: Records the extension of office files that are being
     opened with Drive web or Microsoft 365.
   </summary>
-  <token key="ProviderName">
-    <variant name="GoogleDrive"
-        summary="The file is being opened from Google Drive in Drive web"/>
-    <variant name="OneDrive"
-        summary="The file is being opened from OneDrive with Microsoft 365"/>
-  </token>
+  <token key="CloudProvider" variants="CloudProvider"/>
 </histogram>
 
 <histogram
-    name="FileBrowser.OfficeFiles.Open.IOTaskError.{ProviderName}.{Transfer}"
+    name="FileBrowser.OfficeFiles.Open.IOTaskError.{CloudProvider}.{Transfer}"
     enum="PlatformFileError" expires_after="M124">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
@@ -1155,16 +1158,12 @@
     sum of FileBrowser.OfficeFiles.Open.UploadResult.* where the result is a
     copy or move operation error (IO task errors).
   </summary>
-  <token key="ProviderName">
-    <variant name="GoogleDrive"
-        summary="The file must be transferred to Google Drive"/>
-    <variant name="OneDrive"
-        summary="The file must be transferred to Microsoft OneDrive"/>
-  </token>
+  <token key="CloudProvider" variants="CloudProvider"/>
   <token key="Transfer">
     <variant name="Copy"
-        summary="The files have been copied to {ProviderName}"/>
-    <variant name="Move" summary="The files have been moved to {ProviderName}"/>
+        summary="The files have been copied to {CloudProvider}"/>
+    <variant name="Move"
+        summary="The files have been moved to {CloudProvider}"/>
   </token>
 </histogram>
 
@@ -1176,10 +1175,20 @@
     Chrome OS File Browser: Records the source volume an office file is opened
     from.
   </summary>
-  <token key="CloudProvider" variants="CloudProvider"/>
+<!-- Defining this token inline instead of using the `CloudProvider` variant
+  because this it's spelled differently at call sites in existing builds. -->
+
+  <token key="CloudProvider">
+    <variant name="GoogleDrive"
+        summary="The file was opened using the file task for Google
+                 Drive/Workspace"/>
+    <variant name="MicrosoftOneDrive"
+        summary="The file was opened using the file task for
+                 OneDrive/Microsoft 365"/>
+  </token>
 </histogram>
 
-<histogram name="FileBrowser.OfficeFiles.Open.TransferRequired.{ProviderName}"
+<histogram name="FileBrowser.OfficeFiles.Open.TransferRequired.{CloudProvider}"
     enum="OfficeFilesTransferRequired" expires_after="M124">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
@@ -1187,15 +1196,10 @@
     Chrome OS File Browser: Records whether an office file must be transferred
     to Google Drive or Microsoft OneDrive in order to open it.
   </summary>
-  <token key="ProviderName">
-    <variant name="GoogleDrive"
-        summary="The file must be transferred to Google Drive"/>
-    <variant name="OneDrive"
-        summary="The file must be transferred to Microsoft OneDrive"/>
-  </token>
+  <token key="CloudProvider" variants="CloudProvider"/>
 </histogram>
 
-<histogram name="FileBrowser.OfficeFiles.Open.UploadResult.{ProviderName}"
+<histogram name="FileBrowser.OfficeFiles.Open.UploadResult.{CloudProvider}"
     enum="OfficeFilesUploadResult" expires_after="M124">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
@@ -1203,12 +1207,7 @@
     Chrome OS File Browser: Records the upload result of the &quot;upload and
     open&quot; workflow for Office files.
   </summary>
-  <token key="ProviderName">
-    <variant name="GoogleDrive"
-        summary="The file must be transferred to Google Drive"/>
-    <variant name="OneDrive"
-        summary="The file must be transferred to Microsoft OneDrive"/>
-  </token>
+  <token key="CloudProvider" variants="CloudProvider"/>
 </histogram>
 
 <histogram name="FileBrowser.OfficeFiles.Setup.CancelPage"
@@ -1243,7 +1242,17 @@
   </summary>
 </histogram>
 
-<histogram name="FileBrowser.OfficeFiles.TaskResult.{ProviderName}"
+<histogram name="FileBrowser.OfficeFiles.Setup.ODFSAvailability"
+    enum="BooleanAvailable" expires_after="M124">
+  <owner>simmonsjosh@google.com</owner>
+  <owner>src/ui/file_manager/OWNERS</owner>
+  <summary>
+    Chrome OS File Browser: Availability of the ODFS extension when mount is
+    requested (not including retries within the same flow).
+  </summary>
+</histogram>
+
+<histogram name="FileBrowser.OfficeFiles.TaskResult.{CloudProvider}"
     enum="OfficeTaskResult" expires_after="M124">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
@@ -1251,7 +1260,10 @@
     Chrome OS File Browser: The result of the task that opens an Office file
     using Drive or OneDrive.
   </summary>
-  <token key="ProviderName">
+<!-- Defining this token inline instead of using the `CloudProvider` variant
+  because this it's spelled differently at call sites in existing builds. -->
+
+  <token key="CloudProvider">
     <variant name="Drive" summary="The task is for Google Drive/Docs"/>
     <variant name="OneDrive"
         summary="The task is for Microsoft OneDrive/Office"/>
@@ -1538,7 +1550,7 @@
 </histogram>
 
 <histogram name="FileBrowser.ViewingFileType.Offline" enum="ViewFileType"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
@@ -1549,7 +1561,7 @@
 </histogram>
 
 <histogram name="FileBrowser.ViewingFileType.Online" enum="ViewFileType"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/fingerprint/histograms.xml b/tools/metrics/histograms/metadata/fingerprint/histograms.xml
index 65c95a3..e43baf82 100644
--- a/tools/metrics/histograms/metadata/fingerprint/histograms.xml
+++ b/tools/metrics/histograms/metadata/fingerprint/histograms.xml
@@ -36,7 +36,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Auth.ScanResult" enum="FingerprintScanResult"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>emaamari@google.com</owner>
   <owner>tomhughes@chromium.org</owner>
   <owner>cros-lurs@google.com</owner>
@@ -65,7 +65,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Enroll.NumCaptures" units="captures"
-    expires_after="2024-01-01">
+    expires_after="2024-03-10">
   <owner>hesling@chromium.org</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
@@ -77,7 +77,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Enroll.ScanResult" enum="FingerprintScanResult"
-    expires_after="2024-01-01">
+    expires_after="2024-03-10">
   <owner>emaamari@google.com</owner>
   <owner>tomhughes@chromium.org</owner>
   <owner>cros-lurs@google.com</owner>
@@ -90,7 +90,7 @@
 </histogram>
 
 <histogram name="Fingerprint.FingerprintPowerButtonRace" units="units"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>emaamari@google.com</owner>
   <owner>chromeos-commercial-identity@google.com</owner>
   <owner>chromeos-fingerprint@google.com</owner>
@@ -115,7 +115,7 @@
 </histogram>
 
 <histogram name="Fingerprint.SensorError.BadHwid" enum="BooleanError"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>fsammoura@google.com</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
@@ -125,7 +125,7 @@
 </histogram>
 
 <histogram name="Fingerprint.SensorError.InitializationFailure"
-    enum="BooleanError" expires_after="2024-01-01">
+    enum="BooleanError" expires_after="2024-03-03">
   <owner>fsammoura@google.com</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
@@ -135,7 +135,7 @@
 </histogram>
 
 <histogram name="Fingerprint.SensorError.NoIrq" enum="BooleanError"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>fsammoura@google.com</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
@@ -145,7 +145,7 @@
 </histogram>
 
 <histogram name="Fingerprint.SensorError.SpiCommunication" enum="BooleanError"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>fsammoura@google.com</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
@@ -165,7 +165,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Session.RetrievePrimarySessionResult"
-    enum="FingerprintRetrievePrimarySessionResult" expires_after="2024-01-01">
+    enum="FingerprintRetrievePrimarySessionResult" expires_after="2024-03-03">
   <owner>patrykd@google.com</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
@@ -186,7 +186,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Unlock.AttemptsCountBeforeSuccess" units="count"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>emaamari@google.com</owner>
   <owner>cros-lurs@google.com</owner>
   <summary>
@@ -201,7 +201,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Unlock.AuthSuccessful" enum="BooleanSuccess"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>emaamari@google.com</owner>
   <owner>cros-lurs@google.com</owner>
   <summary>
@@ -215,7 +215,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Unlock.EnrolledFingerCount" units="count"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>tomhughes@chromium.org</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
@@ -242,7 +242,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Unlock.MatchIgnoredDueToPowerButtonPress"
-    enum="BooleanIgnored" expires_after="2024-01-01">
+    enum="BooleanIgnored" expires_after="2024-03-03">
   <owner>ravisadineni@chromium.org</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
@@ -289,7 +289,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Unlock.RecentAttemptsCountBeforeSuccess"
-    units="attempts" expires_after="2024-01-01">
+    units="attempts" expires_after="2024-03-03">
   <owner>hesling@chromium.org</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
@@ -319,7 +319,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Unlock.Result" enum="FingerprintUnlockResult"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>emaamari@google.com</owner>
   <owner>tomhughes@chromium.org</owner>
   <owner>cros-lurs@google.com</owner>
@@ -331,7 +331,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Unlock.{Outcome}.Duration.{Interval}" units="ms"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>bobbycasey@google.com</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
@@ -351,7 +351,7 @@
 </histogram>
 
 <histogram name="Fingerprint.UnlockEnabled" enum="BooleanEnabled"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>tomhughes@chromium.org</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
@@ -370,7 +370,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Updater.Reason" enum="FingerprintUpdaterReason"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>tomhughes@chromium.org</owner>
   <owner>hesling@chromium.org</owner>
   <owner>chromeos-fingerprint@google.com</owner>
@@ -380,7 +380,7 @@
 </histogram>
 
 <histogram name="Fingerprint.Updater.Status" enum="FingerprintUpdaterStatus"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>tomhughes@chromium.org</owner>
   <owner>hesling@chromium.org</owner>
   <owner>chromeos-fingerprint@google.com</owner>
@@ -403,7 +403,7 @@
 </histogram>
 
 <histogram name="Fingerprint.{ContextFunction}" enum="FingerprintSensorMode"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>tomhughes@chromium.org</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/gcm/histograms.xml b/tools/metrics/histograms/metadata/gcm/histograms.xml
index 19a04484..cbd7946f 100644
--- a/tools/metrics/histograms/metadata/gcm/histograms.xml
+++ b/tools/metrics/histograms/metadata/gcm/histograms.xml
@@ -49,6 +49,15 @@
   </summary>
 </histogram>
 
+<histogram name="GCM.ClientStartDelay" units="ms" expires_after="2024-09-14">
+  <owner>rushans@google.com</owner>
+  <owner>peter@chromium.org</owner>
+  <summary>
+    Records the time for which GCM client start task has been delayed. Recorded
+    whenever GCM client is requested to start.
+  </summary>
+</histogram>
+
 <histogram name="GCM.Crypto.DecryptMessageResult" enum="GCMDecryptionResult"
     expires_after="never">
 <!-- expires-never: Used to monitor push encryption and debug issues. -->
@@ -79,6 +88,16 @@
   <summary>The result of a database open attempt by the GCM store.</summary>
 </histogram>
 
+<histogram name="GCM.DelayedTaskControlledReadyTime" units="ms"
+    expires_after="2024-09-14">
+  <owner>rushans@google.com</owner>
+  <owner>peter@chromium.org</owner>
+  <summary>
+    Records the time for which tasks in GCM driver were delayed. Recorded once
+    GCM driver is ready (normally this means that GCM client is initialized).
+  </summary>
+</histogram>
+
 <histogram name="GCM.DeliveredToAppHandler{AppHandler}" enum="BooleanDelivered"
     expires_after="2024-02-20">
   <owner>peter@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/geolocation/histograms.xml b/tools/metrics/histograms/metadata/geolocation/histograms.xml
index fa19b108d..8fe85d6 100644
--- a/tools/metrics/histograms/metadata/geolocation/histograms.xml
+++ b/tools/metrics/histograms/metadata/geolocation/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="Geolocation.Android.LocationPermissionState"
-    enum="AndroidLocationPermissionState" expires_after="2023-12-23">
+    enum="AndroidLocationPermissionState" expires_after="2024-03-10">
   <owner>mattreynolds@chromium.org</owner>
   <owner>device-dev@chromium.org</owner>
   <summary>
@@ -127,7 +127,7 @@
 </histogram>
 
 <histogram name="Geolocation.NetworkLocationRequest.RequestInterval"
-    units="mins" expires_after="2023-12-31">
+    units="mins" expires_after="2024-03-03">
   <owner>alvinji@chromium.org</owner>
   <owner>device-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/google/histograms.xml b/tools/metrics/histograms/metadata/google/histograms.xml
index b3da12d3..4fcf209 100644
--- a/tools/metrics/histograms/metadata/google/histograms.xml
+++ b/tools/metrics/histograms/metadata/google/histograms.xml
@@ -29,15 +29,28 @@
   <summary>The HRESULT for a failed on-demand update check.</summary>
 </histogram>
 
-<histogram name="GoogleUpdate.InstallDetails.UpdateCohort" units="units"
-    expires_after="2024-06-01">
+<histogram name="GoogleUpdate.InstallDetails.UpdateCohort"
+    enum="GoogleUpdateHashedCohortName" expires_after="2024-06-01">
   <owner>waffles@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <owner>omaha-team@google.com</owner>
   <summary>
-    Store the hash of update cohort name as reported by Chrome Updater on
-    Windows. Recorded at the start of metrics service. Warning: this histogram
-    was expired from 2019-06-01 to 2023-01-23; data may be missing.
+    The hash of the browser's update cohort name that was present during browser
+    startup. Warning: this histogram was expired from 2019-06-01 to 2023-01-23;
+    data may be missing. This histogram is reported on every UMA log on Windows.
+  </summary>
+</histogram>
+
+<histogram name="GoogleUpdate.InstallDetails.UpdateCohortId"
+    enum="GoogleUpdateHashedCohortId" expires_after="2024-09-01">
+  <owner>waffles@chromium.org</owner>
+  <owner>chrome-metrics-team@google.com</owner>
+  <owner>omaha-team@google.com</owner>
+  <summary>
+    The base::PersistentHash of the browser's update cohort ID that was present
+    at the time of the metrics upload. This histogram is reported on every UMA
+    log on Windows. Unlike cohort name, cohort ID will generally be unique for
+    each rollout group and control group.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/gpu/histograms.xml b/tools/metrics/histograms/metadata/gpu/histograms.xml
index 33e5201..946df203 100644
--- a/tools/metrics/histograms/metadata/gpu/histograms.xml
+++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -289,6 +289,23 @@
   </summary>
 </histogram>
 
+<histogram name="GPU.ANGLE.D3DShaderBlobSizeKB" units="KB"
+    expires_after="2024-02-20">
+  <owner>geofflang@chromium.org</owner>
+  <owner>angle-team@google.com</owner>
+  <summary>The size of compiled D3D shader bytecode.</summary>
+</histogram>
+
+<histogram name="GPU.ANGLE.D3DShaderCompilationTimeUs" units="microseconds"
+    expires_after="2024-02-20">
+  <owner>geofflang@chromium.org</owner>
+  <owner>angle-team@google.com</owner>
+  <summary>
+    The time it takes for fxc to compile HLSL to D3D bytecode. Recorded for all
+    clients regardless of support for high resolution timers.
+  </summary>
+</histogram>
+
 <histogram name="GPU.ANGLE.MetalShader.CacheHitCount" units="count"
     expires_after="2024-02-20">
   <owner>sky@chromium.org</owner>
@@ -310,6 +327,17 @@
   </summary>
 </histogram>
 
+<histogram name="GPU.ANGLE.MetalShaderCompilationTimeUs" units="microseconds"
+    expires_after="2024-02-20">
+  <owner>geofflang@chromium.org</owner>
+  <owner>angle-team@google.com</owner>
+  <summary>
+    The time it takes for the Metal driver to compile a shader with the
+    newLibraryFromSource function. Recorded for all clients regardless of
+    support for high resolution timers.
+  </summary>
+</histogram>
+
 <histogram name="GPU.ANGLE.MetalShaderInBlobCache" enum="Boolean"
     expires_after="2024-02-20">
   <owner>sky@chromium.org</owner>
@@ -569,7 +597,7 @@
 </histogram>
 
 <histogram name="GPU.DirectComposition.HardwareOverlaysSupported"
-    enum="BooleanOverlaySupported" expires_after="2023-12-31">
+    enum="BooleanOverlaySupported" expires_after="2024-03-03">
   <owner>magchen@chromium.org</owner>
   <owner>graphics-dev@chromium.org</owner>
   <summary>
@@ -624,7 +652,7 @@
 </histogram>
 
 <histogram base="true" name="GPU.DirectComposition.SwapChainCreationResult3"
-    enum="Hresult" expires_after="2023-12-31">
+    enum="Hresult" expires_after="2024-03-03">
 <!-- Name completed by histogram_suffixes name="GPU.ProtectedVideoType" -->
 
   <owner>magchen@chromium.org</owner>
@@ -1097,7 +1125,7 @@
 </histogram>
 
 <histogram name="GPU.Nvidia{Extension}.{State}.SetStreamExt" enum="Hresult"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>magchen@chromium.org</owner>
   <owner>zmo@chromium.org</owner>
   <owner>graphics-dev@chromium.org</owner>
@@ -1389,7 +1417,7 @@
 </histogram>
 
 <histogram name="GPU.SupportsDX12" enum="BooleanSupported"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>magchen@chromium.org</owner>
   <owner>zmo@chromium.org</owner>
   <summary>
@@ -1461,7 +1489,7 @@
 </histogram>
 
 <histogram name="GPU.VideoProcessorBlt.{Extension}.{State}" enum="Hresult"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>magchen@chromium.org</owner>
   <owner>zmo@chromium.org</owner>
   <owner>graphics-dev@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
index 157283b..d7e64dc7 100644
--- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
+++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -1525,13 +1525,6 @@
   <affected-histogram name="DevTools.Launch"/>
 </histogram_suffixes>
 
-<histogram_suffixes name="DnsDropdownSelectionEvent" separator=".">
-  <suffix name="Ignored" label=""/>
-  <suffix name="Selected" label=""/>
-  <suffix name="Unselected" label=""/>
-  <affected-histogram name="Net.DNS.UI.DropdownSelectionEvent"/>
-</histogram_suffixes>
-
 <histogram_suffixes name="DnsImpact2" separator="_">
   <suffix name="disabled_prefetch"
       label="DNS pre-resolving is disabled in these clients"/>
@@ -1586,6 +1579,7 @@
       name="Net.DNS.DnsTransaction.SecureValidated.FailureTime"/>
   <affected-histogram
       name="Net.DNS.DnsTransaction.SecureValidated.SuccessTime"/>
+  <affected-histogram name="Net.DNS.ResolveContext.DohAutoupgrade.Status"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="DOMStorageCachePurgeReason" separator=".">
@@ -1747,13 +1741,6 @@
   <affected-histogram name="DriveCommon.RemoteSearch.TextSearchTime"/>
 </histogram_suffixes>
 
-<histogram_suffixes name="DualCertVerifierTrial" separator="_">
-  <suffix name="TrialPrimary" label=""/>
-  <suffix name="TrialSecondary" label=""/>
-  <affected-histogram name="Net.CertVerifier_First_Job_Latency"/>
-  <affected-histogram name="Net.CertVerifier_Job_Latency"/>
-</histogram_suffixes>
-
 <histogram_suffixes name="EncryptionLevel" separator=".">
   <suffix name="0RTT" label="Packets sent at 0-RTT encryption only."/>
   <suffix name="ForwardSecure"
@@ -1871,6 +1858,9 @@
 <histogram_suffixes name="GridTabSwitcherAnimationType" separator=".">
   <suffix name="Expand" label="Grid to Tab"/>
   <suffix name="Shrink" label="Tab to Grid"/>
+  <affected-histogram
+      name="Android.GridTabSwitcher.Animation.FirstFrameLatency"/>
+  <affected-histogram name="Android.GridTabSwitcher.Animation.TotalDuration"/>
   <affected-histogram name="GridTabSwitcher.DirtySpan"/>
   <affected-histogram name="GridTabSwitcher.FramePerSecond"/>
   <affected-histogram name="GridTabSwitcher.MaxFrameInterval"/>
diff --git a/tools/metrics/histograms/metadata/history/histograms.xml b/tools/metrics/histograms/metadata/history/histograms.xml
index 790eb502..9543ca40 100644
--- a/tools/metrics/histograms/metadata/history/histograms.xml
+++ b/tools/metrics/histograms/metadata/history/histograms.xml
@@ -1931,7 +1931,7 @@
   </summary>
 </histogram>
 
-<histogram name="History.DatabaseFileMB" units="MB" expires_after="2024-01-07">
+<histogram name="History.DatabaseFileMB" units="MB" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>tommycli@chromium.org</owner>
   <owner>chrome-journeys@google.com</owner>
@@ -1944,7 +1944,7 @@
 </histogram>
 
 <histogram name="History.DatabaseForeignVisitMetricsTime" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>tommycli@chromium.org</owner>
   <owner>treib@chromium.org</owner>
@@ -2318,7 +2318,7 @@
 </histogram>
 
 <histogram name="History.InMemoryDBItemCount" units="typed URLs"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>sky@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <component>UI&gt;Browser&gt;History</component>
@@ -2513,7 +2513,7 @@
 </histogram>
 
 <histogram name="History.TopSites.QueryFromHistoryTime" units="ms"
-    expires_after="2023-12-10">
+    expires_after="2024-03-10">
   <owner>mahmadi@chromium.org</owner>
   <owner>chrome-omnibox-team@google.com</owner>
   <summary>
@@ -2669,6 +2669,17 @@
   </summary>
 </histogram>
 
+<histogram name="History.VisitedLinkTableCount" units="VisitedLinks"
+    expires_after="2024-09-01">
+  <owner>kyraseevers@chromium.org</owner>
+  <owner>brgoldstein@google.com</owner>
+  <component>Blink&gt;History&gt;VisitedLinks</component>
+  <summary>
+    Number of rows in visited_links table in History DB. Metrics are logged on
+    initialization of the History DB on 1% of starts.
+  </summary>
+</histogram>
+
 <histogram name="History.VisitTableCount" units="visits"
     expires_after="2024-02-25">
   <owner>mpearson@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/holding_space/histograms.xml b/tools/metrics/histograms/metadata/holding_space/histograms.xml
index 75fd8ac..9c5ca76 100644
--- a/tools/metrics/histograms/metadata/holding_space/histograms.xml
+++ b/tools/metrics/histograms/metadata/holding_space/histograms.xml
@@ -74,7 +74,7 @@
 </variants>
 
 <histogram name="HoldingSpace.Animation.BubbleResize.Smoothness" units="%"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -98,7 +98,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Downloads.Action.All"
-    enum="HoldingSpaceDownloadsAction" expires_after="2024-01-01">
+    enum="HoldingSpaceDownloadsAction" expires_after="2024-03-03">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -118,7 +118,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.Action.All" enum="HoldingSpaceItemAction"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -128,7 +128,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.Action.{action}" enum="HoldingSpaceItemType"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -139,7 +139,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.Action.{action}.Extension"
-    enum="HoldingSpaceExtension" expires_after="2024-01-01">
+    enum="HoldingSpaceExtension" expires_after="2024-03-03">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -150,7 +150,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.Action.{action}.FileSystemType"
-    enum="HoldingSpaceFileSystemType" expires_after="2024-01-01">
+    enum="HoldingSpaceFileSystemType" expires_after="2024-03-03">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -161,7 +161,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.Count.{type}" units="items"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -202,7 +202,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.TotalCount.{type}" units="items"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -214,7 +214,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Pod.Action.All" enum="HoldingSpacePodAction"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -265,7 +265,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.UserPreferences.PreviewsEnabled"
-    enum="BooleanEnabled" expires_after="2024-01-01">
+    enum="BooleanEnabled" expires_after="2024-03-03">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -275,7 +275,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.UserPreferences.SuggestionsExpanded"
-    enum="BooleanExpanded" expires_after="2024-01-01">
+    enum="BooleanExpanded" expires_after="2024-03-03">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/image/histograms.xml b/tools/metrics/histograms/metadata/image/histograms.xml
index 273cd8f..dba6195 100644
--- a/tools/metrics/histograms/metadata/image/histograms.xml
+++ b/tools/metrics/histograms/metadata/image/histograms.xml
@@ -402,7 +402,7 @@
 </histogram>
 
 <histogram name="ImageDecoder.Png.UiGfxIntoSkBitmap" units="microseconds"
-    expires_after="M120">
+    expires_after="2024-03-10">
   <owner>lukasza@chromium.org</owner>
   <owner>chrome-rust-experiments@google.com</owner>
   <summary>
@@ -420,7 +420,7 @@
 </histogram>
 
 <histogram name="ImageDecoder.Png.UiGfxIntoVector" units="microseconds"
-    expires_after="M120">
+    expires_after="2024-03-10">
   <owner>lukasza@chromium.org</owner>
   <owner>chrome-rust-experiments@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/input/histograms.xml b/tools/metrics/histograms/metadata/input/histograms.xml
index bb5b745d7..15c6b65 100644
--- a/tools/metrics/histograms/metadata/input/histograms.xml
+++ b/tools/metrics/histograms/metadata/input/histograms.xml
@@ -1187,7 +1187,7 @@
 </histogram>
 
 <histogram name="InputMethod.PhysicalKeyboard.Japanese.StartupAction"
-    enum="JapaneseStartupAction" expires_after="2023-12-31">
+    enum="JapaneseStartupAction" expires_after="2024-03-03">
   <owner>keithlee@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
@@ -1198,7 +1198,7 @@
 </histogram>
 
 <histogram name="InputMethod.PhysicalKeyboard.KeyboardShortcut"
-    enum="PhysicalKeyboardShortcut" expires_after="2023-12-31">
+    enum="PhysicalKeyboardShortcut" expires_after="2024-03-03">
   <owner>wbjacksonjr@chromium.org</owner>
   <owner>embedded-experience@google.com</owner>
   <summary>
@@ -1449,7 +1449,7 @@
 </histogram>
 
 <histogram name="InputMethod.SystemEmojiPicker.TriggerType"
-    enum="VirtualKeyboardEmojiTriggerType" expires_after="2024-01-07">
+    enum="VirtualKeyboardEmojiTriggerType" expires_after="2024-03-10">
   <owner>jopalmer@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>How emojis were inserted.</summary>
diff --git a/tools/metrics/histograms/metadata/interstitial/histograms.xml b/tools/metrics/histograms/metadata/interstitial/histograms.xml
index bac6604..fcd2af7c 100644
--- a/tools/metrics/histograms/metadata/interstitial/histograms.xml
+++ b/tools/metrics/histograms/metadata/interstitial/histograms.xml
@@ -37,7 +37,7 @@
 </histogram>
 
 <histogram name="interstitial.CloseReason" enum="InterstitialCloseReason"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -51,7 +51,6 @@
 <histogram name="interstitial.enterprise_block.decision"
     enum="SecurityInterstitialDecision" expires_after="2024-01-21">
   <owner>domfc@chromium.org</owner>
-  <owner>snehanagpaul@google.com</owner>
   <owner>dpr-eng@google.com</owner>
   <summary>
     Records when a user is blocked from visiting a site as per admin rules in an
@@ -60,9 +59,8 @@
 </histogram>
 
 <histogram name="interstitial.enterprise_block.decision.repeat_visit"
-    enum="SecurityInterstitialDecision" expires_after="M120">
+    enum="SecurityInterstitialDecision" expires_after="2024-01-21">
   <owner>domfc@chromium.org</owner>
-  <owner>snehanagpaul@google.com</owner>
   <owner>dpr-eng@google.com</owner>
   <summary>
     Records when a user is blocked from visiting a site as per admin rules in an
@@ -73,7 +71,6 @@
 <histogram name="interstitial.enterprise_block.interaction"
     enum="SecurityInterstitialInteraction" expires_after="2024-01-21">
   <owner>domfc@chromium.org</owner>
-  <owner>snehanagpaul@google.com</owner>
   <owner>dpr-eng@google.com</owner>
   <summary>
     Records when a user interacts with a blocking page shown for a url that
@@ -84,18 +81,16 @@
 <histogram name="interstitial.enterprise_warn.decision"
     enum="SecurityInterstitialDecision" expires_after="2024-01-21">
   <owner>domfc@chromium.org</owner>
-  <owner>snehanagpaul@google.com</owner>
   <owner>dpr-eng@google.com</owner>
   <summary>
     Records when a user is shown a warning while visiting a site that doesn't
-    comply with thadmin rules in an enterprise managed browser.
+    comply with the admin rules in an enterprise managed browser.
   </summary>
 </histogram>
 
 <histogram name="interstitial.enterprise_warn.decision.repeat_visit"
-    enum="SecurityInterstitialDecision" expires_after="M120">
+    enum="SecurityInterstitialDecision" expires_after="2024-01-21">
   <owner>domfc@chromium.org</owner>
-  <owner>snehanagpaul@google.com</owner>
   <owner>dpr-eng@google.com</owner>
   <summary>
     Records when a user revisits a page they were warned about for not complying
@@ -106,7 +101,6 @@
 <histogram name="interstitial.enterprise_warn.interaction"
     enum="SecurityInterstitialInteraction" expires_after="2024-01-21">
   <owner>domfc@chromium.org</owner>
-  <owner>snehanagpaul@google.com</owner>
   <owner>dpr-eng@google.com</owner>
   <summary>
     Records when a user interacts with a warning page shown for a url that
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index 9aec9d2..f318bff 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -45,7 +45,7 @@
 </variants>
 
 <histogram name="IOS.Allocator.ShimInstalled" enum="Boolean"
-    expires_after="2023-08-08">
+    expires_after="2024-08-08">
   <owner>rohitrao@chromium.org</owner>
   <owner>justincohen@chromium.org</owner>
   <summary>
@@ -75,7 +75,7 @@
 </histogram>
 
 <histogram name="IOS.AppStoreRating.UserIsEligible" enum="Boolean"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>hiramahmood@google.com</owner>
   <owner>bling-get-set-up@google.com</owner>
   <summary>
@@ -171,7 +171,7 @@
 </histogram>
 
 <histogram name="IOS.CaptivePortal.SecureConnectionFailed"
-    enum="CaptivePortalStatus" expires_after="2023-10-16">
+    enum="CaptivePortalStatus" expires_after="2023-09-07">
   <owner>ajuma@chromium.org</owner>
   <owner>michaeldo@chromium.org</owner>
   <summary>
@@ -196,7 +196,7 @@
 </histogram>
 
 <histogram name="IOS.CommittedNavigationHasContext" enum="Boolean"
-    expires_after="2023-09-24">
+    expires_after="2024-09-07">
   <owner>ajuma@chromium.org</owner>
   <owner>gambard@chromium.org</owner>
   <summary>
@@ -210,7 +210,7 @@
 </histogram>
 
 <histogram name="IOS.CommittedURLMatchesCurrentItem" enum="Boolean"
-    expires_after="2023-09-24">
+    expires_after="2024-09-07">
   <owner>ajuma@chromium.org</owner>
   <owner>gambard@chromium.org</owner>
   <summary>
@@ -223,7 +223,7 @@
 </histogram>
 
 <histogram name="IOS.ContentExtension.DisplayCount" units="count"
-    expires_after="2023-09-24">
+    expires_after="2024-09-18">
   <owner>olivierrobin@chromium.org</owner>
   <owner>rkgibson@chromium.org</owner>
   <summary>
@@ -234,7 +234,7 @@
 </histogram>
 
 <histogram name="IOS.ContentExtension.Index" units="index"
-    expires_after="2023-10-04">
+    expires_after="2024-09-18">
   <owner>olivierrobin@chromium.org</owner>
   <owner>rkgibson@chromium.org</owner>
   <summary>
@@ -287,7 +287,7 @@
 </histogram>
 
 <histogram name="IOS.CredentialExtension.DisplayCount" units="count"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>rkgibson@chromium.org</owner>
   <owner>djean@chromium.org</owner>
   <summary>
@@ -374,7 +374,7 @@
 </histogram>
 
 <histogram name="IOS.CredentialExtension.QuickPasswordUseCount" units="count"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>rkgibson@chromium.org</owner>
   <owner>djean@chromium.org</owner>
   <summary>
@@ -490,20 +490,6 @@
   </token>
 </histogram>
 
-<histogram name="IOS.CRWWKNavigationStatesRemoveOldPending" enum="Boolean"
-    expires_after="2023-09-17">
-  <owner>justincohen@chromium.org</owner>
-  <owner>gambard@chromium.org</owner>
-  <summary>
-    Workaround for a WKWebView bug where WKNavigations can leak, leaving a
-    permanent pending URL, thus breaking the omnibox. While it is possible for
-    navigations to finish out-of-order, it's an edge case that should be handled
-    gracefully, as last committed will appear in the omnibox instead of the
-    pending URL. This metric records whether there are old navigations to clean
-    up each time a navigation finishes. See crbug.com/1010765 for details.
-  </summary>
-</histogram>
-
 <histogram name="IOS.DefaultBrowserFullscreenPromo"
     enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2023-12-01">
   <owner>sebsg@chromium.org</owner>
@@ -703,7 +689,7 @@
 </histogram>
 
 <histogram name="IOS.DistantTab.TimeSinceLastUse" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>ewannpv@chromium.org</owner>
   <owner>gambard@chromium.org</owner>
   <owner>bling-team@google.com</owner>
@@ -758,18 +744,8 @@
   </summary>
 </histogram>
 
-<histogram name="IOS.EnterTabSwitcherSnapshotResult"
-    enum="EnterTabSwitcherSnapshotResult" expires_after="2021-08-01">
-  <owner>edchin@chromium.org</owner>
-  <owner>justincohen@chromium.org</owner>
-  <summary>
-    Tracks the result of snapshotting when the user enters the tab switcher.
-    Recorded whenever the user enters the tab switcher.
-  </summary>
-</histogram>
-
 <histogram name="IOS.ExperienceKitCalendar.Present"
-    enum="ExperienceKitCalendarTypes" expires_after="2024-01-07">
+    enum="ExperienceKitCalendarTypes" expires_after="2024-03-10">
   <owner>djean@chromium.org</owner>
   <owner>erahmaoui@google.com</owner>
   <summary>
@@ -848,16 +824,6 @@
   </summary>
 </histogram>
 
-<histogram name="IOS.FontProvider.ProductSansRegular.LoadSuccess"
-    enum="Boolean" expires_after="2023-09-23">
-  <owner>eic@google.com</owner>
-  <owner>tmartino@chromium.org</owner>
-  <summary>
-    Records whether the ProductSans-Regular was successfully loaded in the Font
-    Provider Api.
-  </summary>
-</histogram>
-
 <histogram name="IOS.FormInputAccessory.ExecuteFormAssistActionException"
     enum="FormInputAccessoryAction" expires_after="2022-12-11">
   <owner>rohitrao@chromium.org</owner>
@@ -869,7 +835,7 @@
 </histogram>
 
 <histogram name="IOS.Frame.FirstContentfulPaint.MainFrame" units="ms"
-    expires_after="2023-11-19">
+    expires_after="2024-03-10">
   <owner>danieltwhite@chromium.org</owner>
   <owner>ajuma@chromium.org</owner>
   <summary>
@@ -1058,7 +1024,7 @@
 </histogram>
 
 <histogram name="IOS.Fullscreen.State" enum="CrFullscreenState"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>joemerramos@chromium.org</owner>
   <owner>ajuma@chromium.org</owner>
   <summary>
@@ -1079,7 +1045,7 @@
 </histogram>
 
 <histogram name="IOS.InactiveTabs.Settings.Threshold"
-    enum="InactiveTabsThresholdSettingType" expires_after="2024-01-07">
+    enum="InactiveTabsThresholdSettingType" expires_after="2024-03-10">
   <owner>alionadangla@chromium.org</owner>
   <owner>lpromero@chromium.org</owner>
   <summary>Logs the chosen inactive tab threshold at startup.</summary>
@@ -1111,7 +1077,7 @@
   </summary>
 </histogram>
 
-<histogram name="IOS.Incognito.TimeSpent" units="ms" expires_after="2024-01-07">
+<histogram name="IOS.Incognito.TimeSpent" units="ms" expires_after="2024-03-10">
   <owner>olivierrobin@chromium.org</owner>
   <owner>qpubert@google.com</owner>
   <summary>
@@ -1123,7 +1089,7 @@
 </histogram>
 
 <histogram name="IOS.IncognitoInterstitial"
-    enum="IncognitoInterstitialActionType" expires_after="2024-01-07">
+    enum="IncognitoInterstitialActionType" expires_after="2024-03-10">
   <owner>qpubert@google.com</owner>
   <owner>djean@chromium.org</owner>
   <summary>
@@ -1289,7 +1255,7 @@
 </histogram>
 
 <histogram name="IOS.MainThreadFreezeDetection.HangWithCleanExit"
-    enum="Boolean" expires_after="2023-09-12">
+    enum="Boolean" expires_after="2024-09-12">
   <owner>justincohen@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -1302,7 +1268,7 @@
 
 <histogram name="IOS.MainThreadFreezeDetection.NotRunningAfterReport"
     enum="IOSMainThreadFreezeDetectionNotRunningAfterReportBlock"
-    expires_after="2023-09-12">
+    expires_after="2024-09-12">
   <owner>justincohen@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -1312,7 +1278,7 @@
 </histogram>
 
 <histogram name="IOS.MainThreadFreezeDetection.RecordGenerationTime" units="ms"
-    expires_after="2024-01-28">
+    expires_after="2024-09-12">
   <owner>justincohen@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -1322,7 +1288,7 @@
 </histogram>
 
 <histogram name="IOS.MainThreadFreezeDetection.RecoveredAfter" units="ms"
-    expires_after="2023-09-12">
+    expires_after="2024-09-12">
   <owner>justincohen@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -1611,7 +1577,7 @@
 </histogram>
 
 <histogram name="IOS.NTP.Click" enum="IOSHomeActionType"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>bling-team@google.com</owner>
   <summary>
@@ -1707,7 +1673,7 @@
 </histogram>
 
 <histogram name="IOS.OpenIn.MimeType" enum="IOSOpenInMimeType"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>ewannpv@chromium.org</owner>
   <owner>gambard@chromium.org</owner>
   <owner>bling-team@google.com</owner>
@@ -1724,6 +1690,157 @@
   <summary>The type of action the user took in the overflow/tools menu</summary>
 </histogram>
 
+<histogram name="IOS.OverflowMenu.Customization.ActionAdded"
+    enum="IOSOverflowMenuAction" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>The action added during an overflow menu customization.</summary>
+</histogram>
+
+<histogram name="IOS.OverflowMenu.Customization.ActionRemoved"
+    enum="IOSOverflowMenuAction" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>The action removed during an overflow menu customization.</summary>
+</histogram>
+
+<histogram name="IOS.OverflowMenu.Customization.ActionsCustomized"
+    units="bitfield value" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    A bitfield value representing various sub-events that can take place during
+    an action customization session.
+  </summary>
+</histogram>
+
+<histogram name="IOS.OverflowMenu.Customization.ActionsReordered.FirstPosition"
+    enum="IOSOverflowMenuAction" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>The action in the first position after reordering the menu.</summary>
+</histogram>
+
+<histogram
+    name="IOS.OverflowMenu.Customization.ActionsReordered.FourthPosition"
+    enum="IOSOverflowMenuAction" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    The action in the fourth position after customizing the menu.
+  </summary>
+</histogram>
+
+<histogram
+    name="IOS.OverflowMenu.Customization.ActionsReordered.SecondPosition"
+    enum="IOSOverflowMenuAction" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    The action in the second position after customizing the menu.
+  </summary>
+</histogram>
+
+<histogram name="IOS.OverflowMenu.Customization.ActionsReordered.ThirdPosition"
+    enum="IOSOverflowMenuAction" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    The action in the third position after customizing the menu.
+  </summary>
+</histogram>
+
+<histogram name="IOS.OverflowMenu.Customization.DestinationAdded"
+    enum="IOSOverflowMenuDestination" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    The destination added during an overflow menu customization.
+  </summary>
+</histogram>
+
+<histogram name="IOS.OverflowMenu.Customization.DestinationRemoved"
+    enum="IOSOverflowMenuDestination" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    The destination removed during an overflow menu customization.
+  </summary>
+</histogram>
+
+<histogram name="IOS.OverflowMenu.Customization.DestinationsCustomized"
+    units="bitfield value" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    A bitfield value representing various sub-events that can take place during
+    a destination customization session.
+  </summary>
+</histogram>
+
+<histogram
+    name="IOS.OverflowMenu.Customization.DestinationsReordered.FirstPosition"
+    enum="IOSOverflowMenuDestination" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    The destination in the first position after the user manually reordered the
+    menu.
+  </summary>
+</histogram>
+
+<histogram
+    name="IOS.OverflowMenu.Customization.DestinationsReordered.FourthPosition"
+    enum="IOSOverflowMenuDestination" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    The destination in the fourth position after the user manually reordered the
+    menu.
+  </summary>
+</histogram>
+
+<histogram
+    name="IOS.OverflowMenu.Customization.DestinationsReordered.SecondPosition"
+    enum="IOSOverflowMenuDestination" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    The destination in the second position after the user manually reordered the
+    menu.
+  </summary>
+</histogram>
+
+<histogram
+    name="IOS.OverflowMenu.Customization.DestinationsReordered.ThirdPosition"
+    enum="IOSOverflowMenuDestination" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    The destination in the third position after the user manually reordered the
+    menu.
+  </summary>
+</histogram>
+
+<histogram name="IOS.OverflowMenu.DestinationsOrderChangedProgrammatically"
+    enum="IOSOverflowMenuReorderingReason" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    The cause of the overflow menu being programatically reordered when it is
+    reordered.
+  </summary>
+</histogram>
+
+<histogram name="IOS.OverflowMenu.SmartSortingStateChange"
+    enum="IOSOverflowMenuSmartSortingChange" expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    Whether Smart Sorting was newly enabled or disabled when the state changed.
+  </summary>
+</histogram>
+
 <histogram name="IOS.OverflowMenu.TimeOpen" units="ms"
     expires_after="2024-02-11">
   <owner>rkgibson@google.com</owner>
@@ -1731,6 +1848,26 @@
   <summary>The amount of time the overflow/tools menu is open.</summary>
 </histogram>
 
+<histogram name="IOS.OverflowMenu.TimeOpen.ActionChosen" units="ms"
+    expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    The amount of time the overflow/tools menu is open and an action (the
+    vertical list) is selected.
+  </summary>
+</histogram>
+
+<histogram name="IOS.OverflowMenu.TimeOpen.DestinationChosen" units="ms"
+    expires_after="2024-02-11">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
+  <summary>
+    The amount of time the overflow/tools menu is open and a destination (the
+    horizontal list) is selected.
+  </summary>
+</histogram>
+
 <histogram name="IOS.PageLoad.DefaultModeMobile" enum="Boolean"
     expires_after="2024-01-28">
   <owner>gambard@chromium.org</owner>
@@ -1742,7 +1879,7 @@
 </histogram>
 
 <histogram name="IOS.PageLoadCount.Counts"
-    enum="IOSPageLoadCountNavigationType" expires_after="2024-01-07">
+    enum="IOSPageLoadCountNavigationType" expires_after="2024-03-10">
   <owner>gambard@chromium.org</owner>
   <owner>bling-team@google.com</owner>
   <summary>The number of navigation started events by navigation type.</summary>
@@ -1759,7 +1896,7 @@
 </histogram>
 
 <histogram name="IOS.PageLoadedSnapshotResult" enum="PageLoadedSnapshotResult"
-    expires_after="2021-08-01">
+    expires_after="2024-03-01">
   <owner>edchin@chromium.org</owner>
   <owner>justincohen@chromium.org</owner>
   <summary>
@@ -1778,6 +1915,22 @@
   </summary>
 </histogram>
 
+<histogram name="IOS.ParcelTracking.OptIn.ActionOnPrompt"
+    enum="IOSParcelTrackingOptInActionOnPrompt" expires_after="2024-03-07">
+  <owner>hiramahmood@google.com</owner>
+  <owner>thegreenfrog@chromium.org</owner>
+  <summary>Logs a user's action on the Parcel Tracking Opt-In prompt.</summary>
+</histogram>
+
+<histogram name="IOS.ParcelTracking.OptIn.Displayed" enum="Boolean"
+    expires_after="2024-03-07">
+  <owner>hiramahmood@google.com</owner>
+  <owner>thegreenfrog@chromium.org</owner>
+  <summary>
+    Logs each time when the Parcel Tracking Opt-In prompt is displayed.
+  </summary>
+</histogram>
+
 <histogram name="IOS.PartialTranslate.Outcome" enum="PartialTranslateOutcome"
     expires_after="2024-02-23">
   <owner>olivierrobin@chromium.org</owner>
@@ -1803,6 +1956,17 @@
   </summary>
 </histogram>
 
+<histogram name="IOS.PasswordManager.BulkSavePasswordsInAccountCount"
+    units="passwords" expires_after="2024-01-28">
+  <owner>nicolasmacbeth@google.com</owner>
+  <owner>tmartino@chromium.org</owner>
+  <summary>
+    The number of local passwords the user has moved to their account using the
+    bulk save passwords in account module in password manager settings. This is
+    logged when the user chooses to bulk move their passwords to their account.
+  </summary>
+</histogram>
+
 <histogram name="IOS.PasswordManager.Favicons.Count" units="count"
     expires_after="2023-11-28">
   <owner>veronguyen@google.com</owner>
@@ -2219,6 +2383,28 @@
   </summary>
 </histogram>
 
+<histogram name="IOS.SandboxMetrics.AverageColorSnapshotSize" units="KB"
+    expires_after="2023-12-10">
+  <owner>michaeldo@chromium.org</owner>
+  <owner>rohitrao@chromium.org</owner>
+  <summary>
+    The average amount of storage used by a color snapshot image for this user.
+    Logged at application startup, maximum once every 2 weeks, if the
+    `kLogApplicationStorageSizeMetrics` flag is enabled.
+  </summary>
+</histogram>
+
+<histogram name="IOS.SandboxMetrics.AverageGreySnapshotSize" units="KB"
+    expires_after="2023-12-10">
+  <owner>michaeldo@chromium.org</owner>
+  <owner>rohitrao@chromium.org</owner>
+  <summary>
+    The average amount of storage used by a grey snapshot image for this user.
+    Logged at application startup, maximum once every 2 weeks, if the
+    `kLogApplicationStorageSizeMetrics` flag is enabled.
+  </summary>
+</histogram>
+
 <histogram name="IOS.SandboxMetrics.CapacityForImportantUsage" units="MB"
     expires_after="2024-02-11">
   <owner>michaeldo@chromium.org</owner>
@@ -2409,14 +2595,14 @@
 </histogram>
 
 <histogram name="IOS.SearchExtension.Action" enum="IOSSearchExtensionAction"
-    expires_after="2023-09-24">
+    expires_after="2024-09-18">
   <owner>olivierrobin@chromium.org</owner>
   <owner>rkgibson@chromium.org</owner>
   <summary>The action selected by the user in the Search Extension.</summary>
 </histogram>
 
 <histogram name="IOS.SearchExtension.DisplayCount" units="count"
-    expires_after="2023-09-24">
+    expires_after="2024-09-18">
   <owner>olivierrobin@chromium.org</owner>
   <owner>rkgibson@chromium.org</owner>
   <summary>
@@ -2487,7 +2673,7 @@
 </histogram>
 
 <histogram name="IOS.ShareExtension.ReceivedEntriesCount" units="files"
-    expires_after="2024-01-28">
+    expires_after="2024-09-18">
   <owner>olivierrobin@chromium.org</owner>
   <owner>rkgibson@chromium.org</owner>
   <summary>
@@ -2497,14 +2683,14 @@
 </histogram>
 
 <histogram name="IOS.ShareExtension.ReceivedEntry"
-    enum="IOSShareExtensionReceivedEntryType" expires_after="2024-01-28">
+    enum="IOSShareExtensionReceivedEntryType" expires_after="2024-09-18">
   <owner>olivierrobin@chromium.org</owner>
   <owner>rkgibson@chromium.org</owner>
   <summary>Type of the item received from the iOS share extension.</summary>
 </histogram>
 
 <histogram name="IOS.ShareExtension.ReceivedEntryDelay" units="ms"
-    expires_after="2023-10-04">
+    expires_after="2024-09-18">
   <owner>olivierrobin@chromium.org</owner>
   <owner>rkgibson@chromium.org</owner>
   <summary>
@@ -2514,7 +2700,7 @@
 </histogram>
 
 <histogram name="IOS.ShareExtension.Source"
-    enum="IOSShareExtensionReceivedEntrySource" expires_after="2024-01-28">
+    enum="IOSShareExtensionReceivedEntrySource" expires_after="2024-09-18">
   <owner>olivierrobin@chromium.org</owner>
   <owner>rkgibson@chromium.org</owner>
   <summary>
@@ -2523,9 +2709,9 @@
 </histogram>
 
 <histogram name="IOS.SiriShortcuts.Count" units="shortcuts"
-    expires_after="2023-10-25">
+    expires_after="2024-04-25">
   <owner>gujen@google.com</owner>
-  <owner>ios-google-eng-ios@google.com</owner>
+  <owner>bling-mony-pod@google.com</owner>
   <summary>
     Counts the number of Chrome Siri Shortcuts that the user has created in the
     Siri Shortcuts app. This is recorded once during startup. The histogram caps
@@ -2534,8 +2720,7 @@
     isn't a Chrome-provided one. For example, a shortcut that opens URLs in
     Chrome and then opens URLs in another app won't be counted. As such, this
     metric undercounts the true number of Chrome shortcuts. This is a
-    restriction of the native Shortcuts API. This histogram is actively being
-    monitored by the iOS at Google team.
+    restriction of the native Shortcuts API.
   </summary>
 </histogram>
 
@@ -2597,6 +2782,14 @@
   <summary>Number of bookmarks indexed during initial indexation.</summary>
 </histogram>
 
+<histogram name="IOS.Spotlight.DonatedIntentType"
+    enum="IOSSpotlightDonatedIntentType" expires_after="2024-06-01">
+  <owner>stkhapugin@chromium.org</owner>
+  <owner>ameurhosni@chromium.org</owner>
+  <owner>olivierrobin@chromium.org</owner>
+  <summary>Recorded each time an intent is donated.</summary>
+</histogram>
+
 <histogram name="IOS.Spotlight.OpenTabsIndexingDuration" units="ms"
     expires_after="2024-06-01">
   <owner>stkhapugin@chromium.org</owner>
@@ -2638,7 +2831,7 @@
 </histogram>
 
 <histogram name="IOS.Start.Click" enum="IOSHomeActionType"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>bling-team@google.com</owner>
   <summary>
@@ -2656,7 +2849,7 @@
   </summary>
 </histogram>
 
-<histogram name="IOS.Start.TimeSpent" units="ms" expires_after="2024-01-07">
+<histogram name="IOS.Start.TimeSpent" units="ms" expires_after="2024-03-10">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>freedjm@chromium.org</owner>
   <summary>
@@ -2857,7 +3050,7 @@
 </histogram>
 
 <histogram name="IOS.TabSwitcher.PinnedTabs.DragDropTabs"
-    enum="IOSTabSwitcherDragDropTabs" expires_after="2023-11-16">
+    enum="IOSTabSwitcherDragDropTabs" expires_after="2024-03-03">
   <owner>ewannpv@chromium.org</owner>
   <owner>pakzhygitov@google.com</owner>
   <owner>bling-team@google.com</owner>
@@ -3127,7 +3320,7 @@
 </histogram>
 
 <histogram name="IOS.WhatsNew.{Type}.TimeSpent" units="ms"
-    expires_after="2023-12-10">
+    expires_after="2024-03-10">
   <owner>cheickcisse@google.com</owner>
   <owner>sebsg@google.com</owner>
   <summary>Logs the time a user spent on each feature of What's New.</summary>
@@ -3258,7 +3451,7 @@
 </histogram>
 
 <histogram name="ManualFallback.PresentedOptions.Passwords" units="Credentials"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>tmartino@chromium.org</owner>
   <owner>djean@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/kiosk/histograms.xml b/tools/metrics/histograms/metadata/kiosk/histograms.xml
index 3deeca8..62c20db2 100644
--- a/tools/metrics/histograms/metadata/kiosk/histograms.xml
+++ b/tools/metrics/histograms/metadata/kiosk/histograms.xml
@@ -218,7 +218,8 @@
   <summary>
     ChromeOS only. Records a new browser window type once a new browser window
     is attempted to be shown in a kiosk session. Distinguishes settings page,
-    closed regular browser and opened regular browser.
+    closed regular browser, opened regular browser, troubleshooting tools and
+    system web app.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/language/histograms.xml b/tools/metrics/histograms/metadata/language/histograms.xml
index 6549b71..4e0a569 100644
--- a/tools/metrics/histograms/metadata/language/histograms.xml
+++ b/tools/metrics/histograms/metadata/language/histograms.xml
@@ -33,7 +33,7 @@
 </histogram>
 
 <histogram name="LanguageDetection.TFLiteModel.WasModelAvailableForDetection"
-    enum="BooleanAvailable" expires_after="2024-01-07">
+    enum="BooleanAvailable" expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -44,7 +44,7 @@
 </histogram>
 
 <histogram name="LanguageDetection.TFLiteModel.WasModelRequestDeferred"
-    enum="BooleanDeferred" expires_after="2023-11-12">
+    enum="BooleanDeferred" expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -56,7 +56,7 @@
 
 <histogram
     name="LanguageDetection.TFLiteModel.WasModelUnavailableDueToDeferredLoad"
-    enum="Boolean" expires_after="2023-11-12">
+    enum="Boolean" expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -399,7 +399,7 @@
 </histogram>
 
 <histogram name="LanguageUsage.ULP.Initiation.Count" units="count"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>perrier@google.com</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/leveldb_proto/histograms.xml b/tools/metrics/histograms/metadata/leveldb_proto/histograms.xml
index 48898c7..ec7a7ef1 100644
--- a/tools/metrics/histograms/metadata/leveldb_proto/histograms.xml
+++ b/tools/metrics/histograms/metadata/leveldb_proto/histograms.xml
@@ -28,9 +28,12 @@
   <variant name="CachedImageFetcherDatabase"
       summary="Database for CachedImageFetcher metadata."/>
   <variant name="CartDatabase" summary="Database for chrome cart."/>
+  <variant name="CommerceParcelTrackingDatabase"
+      summary="Database for Chrome commerce parcel tracking."/>
   <variant name="CommerceSubscriptionDatabase"
       summary="Database for Chrome commerce subscriptions."/>
   <variant name="CouponDatabase" summary="Database for coupons in Chrome."/>
+  <variant name="DiscountsDatabase" summary="Database for shopping discounts."/>
   <variant name="DownloadDB" summary="Databases for in-progress download."/>
   <variant name="DownloadService" summary="Databases for download service."/>
   <variant name="FeatureEngagementTrackerAvailabilityStore"
diff --git a/tools/metrics/histograms/metadata/login/histograms.xml b/tools/metrics/histograms/metadata/login/histograms.xml
index f4e29c5..cf93c33 100644
--- a/tools/metrics/histograms/metadata/login/histograms.xml
+++ b/tools/metrics/histograms/metadata/login/histograms.xml
@@ -184,6 +184,20 @@
   </summary>
 </histogram>
 
+<histogram name="Login.IsTokenHandleInSyncWithRefreshToken" enum="Boolean"
+    expires_after="2024-01-31">
+  <owner>sinhak@chromium.org</owner>
+  <owner>cros-lurs@google.com</owner>
+  <summary>
+    Boolean histogram that indicates if token handle is in sync with the user's
+    current refresh token - i.e. if token handle checks are performed for token
+    handles that actually belong to the user's current refresh token. If this is
+    not the case, it can result in users getting unnecessary logout
+    notifications. This histogram is logged once at the start of a user's
+    session.
+  </summary>
+</histogram>
+
 <histogram name="Login.LeastUsedAccountDays" units="days" expires_after="M77">
   <obsolete>
     Removed in M103.
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index 2b53a59..6639627 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -43,6 +43,11 @@
   <variant name="Video"/>
 </variants>
 
+<variants name="CastStreamingSenderAudioVideo">
+  <variant name="Audio"/>
+  <variant name="Video"/>
+</variants>
+
 <variants name="DbOperation">
   <variant name="Clear" summary="Remove all keys from the DB"/>
   <variant name="Initialize" summary="Initialize the DB."/>
@@ -139,6 +144,144 @@
   </summary>
 </histogram>
 
+<histogram
+    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.AverageCaptureLatency"
+    units="ms" expires_after="2024-09-01">
+  <owner>anasr@google.com</owner>
+  <owner>bzielinski@google.com</owner>
+  <owner>jophba@chromium.org</owner>
+  <owner>mfoltz@chromium.org</owner>
+  <owner>cros-edu-eng@google.com</owner>
+  <summary>
+    Records the average {CastStreamingSenderAudioVideo} latency in milliseconds
+    for capturing frames. Histogram is recorded at the end of the mirroring
+    session.
+  </summary>
+  <token key="CastStreamingSenderAudioVideo"
+      variants="CastStreamingSenderAudioVideo"/>
+</histogram>
+
+<histogram
+    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.AverageEncodeTime"
+    units="ms" expires_after="2024-09-01">
+  <owner>anasr@google.com</owner>
+  <owner>bzielinski@google.com</owner>
+  <owner>jophba@chromium.org</owner>
+  <owner>mfoltz@chromium.org</owner>
+  <owner>cros-edu-eng@google.com</owner>
+  <summary>
+    Records the average time required to encode {CastStreamingSenderAudioVideo}
+    frames, in milliseconds. Histogram is recorded at the end of the mirroring
+    session.
+  </summary>
+  <token key="CastStreamingSenderAudioVideo"
+      variants="CastStreamingSenderAudioVideo"/>
+</histogram>
+
+<histogram
+    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.AverageEndToEndLatency"
+    units="ms" expires_after="2024-09-01">
+  <owner>anasr@google.com</owner>
+  <owner>bzielinski@google.com</owner>
+  <owner>jophba@chromium.org</owner>
+  <owner>mfoltz@chromium.org</owner>
+  <owner>cros-edu-eng@google.com</owner>
+  <summary>
+    Records the average {CastStreamingSenderAudioVideo} latency in milliseconds
+    end to end, from the beginning of capturing a frame to when the frame is
+    played out on the receiver. Histogram is recorded at the end of the
+    mirroring session.
+  </summary>
+  <token key="CastStreamingSenderAudioVideo"
+      variants="CastStreamingSenderAudioVideo"/>
+</histogram>
+
+<histogram
+    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.AverageNetworkLatency"
+    units="ms" expires_after="2024-09-01">
+  <owner>anasr@google.com</owner>
+  <owner>bzielinski@google.com</owner>
+  <owner>jophba@chromium.org</owner>
+  <owner>mfoltz@chromium.org</owner>
+  <owner>cros-edu-eng@google.com</owner>
+  <summary>
+    Records the average {CastStreamingSenderAudioVideo} latency in milliseconds
+    from sender to receiver. Histogram is recorded at the end of the mirroring
+    session.
+  </summary>
+  <token key="CastStreamingSenderAudioVideo"
+      variants="CastStreamingSenderAudioVideo"/>
+</histogram>
+
+<histogram
+    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.ExceededPlayoutDelayPacketsPercentage"
+    units="%" expires_after="2024-09-01">
+  <owner>anasr@google.com</owner>
+  <owner>bzielinski@google.com</owner>
+  <owner>jophba@chromium.org</owner>
+  <owner>mfoltz@chromium.org</owner>
+  <owner>cros-edu-eng@google.com</owner>
+  <summary>
+    Records number of {CastStreamingSenderAudioVideo} packets that exceeded the
+    playout delay as a percentage of all packets. Histogram is recorded at the
+    end of the mirroring session.
+  </summary>
+  <token key="CastStreamingSenderAudioVideo"
+      variants="CastStreamingSenderAudioVideo"/>
+</histogram>
+
+<histogram
+    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.LateFramesPercentage"
+    units="%" expires_after="2024-09-01">
+  <owner>anasr@google.com</owner>
+  <owner>bzielinski@google.com</owner>
+  <owner>jophba@chromium.org</owner>
+  <owner>mfoltz@chromium.org</owner>
+  <owner>cros-edu-eng@google.com</owner>
+  <summary>
+    Records the percentage of {CastStreamingSenderAudioVideo} frames that are
+    reported as late, and therefore dropped by the sender, during a cast
+    mirroring session. Recorded at the end of a cast mirroring session. Logged
+    on all desktop platforms.
+  </summary>
+  <token key="CastStreamingSenderAudioVideo"
+      variants="CastStreamingSenderAudioVideo"/>
+</histogram>
+
+<histogram
+    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.RetransmittedPacketsPercentage"
+    units="%" expires_after="2024-09-01">
+  <owner>anasr@google.com</owner>
+  <owner>bzielinski@google.com</owner>
+  <owner>jophba@chromium.org</owner>
+  <owner>mfoltz@chromium.org</owner>
+  <owner>cros-edu-eng@google.com</owner>
+  <summary>
+    Records number of {CastStreamingSenderAudioVideo} packets that had to be
+    retransmitted as a percentage of number of packets sent. Histogram is
+    recorded at the end of the mirroring session.
+  </summary>
+  <token key="CastStreamingSenderAudioVideo"
+      variants="CastStreamingSenderAudioVideo"/>
+</histogram>
+
+<histogram
+    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.TransmissionRate"
+    units="kbps" expires_after="2024-09-01">
+  <owner>anasr@google.com</owner>
+  <owner>bzielinski@google.com</owner>
+  <owner>jophba@chromium.org</owner>
+  <owner>mfoltz@chromium.org</owner>
+  <owner>cros-edu-eng@google.com</owner>
+  <summary>
+    Records the {CastStreamingSenderAudioVideo} packet transmission bitrate in
+    kbps during a Cast Streaming session. Histogram is recorded at the end of
+    the mirroring session.
+  </summary>
+  <token key="CastStreamingSenderAudioVideo"
+      variants="CastStreamingSenderAudioVideo"/>
+</histogram>
+
 <histogram name="CastStreaming.Sender.{CastStreamingSender}.FrameDropped"
     enum="CastStreamingFrameDropReason" expires_after="2024-02-06">
   <owner>jophba@chromium.org</owner>
@@ -236,7 +379,7 @@
 </histogram>
 
 <histogram name="Media.Audible.ConcurrentTabsTime" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>evliu@google.com</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -324,7 +467,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Capture.LowLatencyCallbackError"
-    enum="BooleanError" expires_after="2024-01-07">
+    enum="BooleanError" expires_after="2024-03-10">
   <owner>guidou@chromium.org</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -488,7 +631,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Capture.Win.Glitches2" units="glitches"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>olka@chromium.org</owner>
   <owner>henrika@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
@@ -1042,7 +1185,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.OutputDeviceStatus"
-    enum="OutputDeviceStatus" expires_after="2024-01-07">
+    enum="OutputDeviceStatus" expires_after="2024-03-10">
   <owner>dalecurtis@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -1641,7 +1784,7 @@
 </histogram>
 
 <histogram name="Media.AudioRendererImpl.SinkStatus" enum="OutputDeviceStatus"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>olka@chromium.org</owner>
   <owner>fhernqvist@google.com</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -1913,7 +2056,7 @@
 </histogram>
 
 <histogram name="Media.Controls.OverlayCastButtonIsCovered" enum="Boolean"
-    expires_after="2023-11-12">
+    expires_after="2024-03-10">
   <owner>takumif@chromium.org</owner>
   <owner>muyaoxu@google.com</owner>
   <owner>openscreen-eng@google.com</owner>
@@ -2950,7 +3093,7 @@
 </histogram>
 
 <histogram name="Media.FrameReadBackCount.{RendererType}" units="frames"
-    expires_after="2023-09-08">
+    expires_after="2024-03-08">
   <owner>dalecurtis@chromium.org</owner>
   <owner>frankli@microsoft.com</owner>
   <owner>media-dev-uma@chromium.org</owner>
@@ -2972,6 +3115,16 @@
   </summary>
 </histogram>
 
+<histogram name="Media.GetDisplayMedia.Constraints.MonitorTypeSurfaces"
+    enum="GetDisplayMediaIncludeExcludeConstraint" expires_after="2024-09-01">
+  <owner>eladalon@chromium.org</owner>
+  <owner>fbeaufort@chromium.org</owner>
+  <summary>
+    Records whether getDisplayMedia was called with the monitorTypeSurfaces
+    constraint.
+  </summary>
+</histogram>
+
 <histogram name="Media.GetDisplayMedia.Constraints.SelfBrowserSurface"
     enum="GetDisplayMediaIncludeExcludeConstraint" expires_after="2023-05-07">
   <owner>eladalon@chromium.org</owner>
@@ -3408,7 +3561,7 @@
 </histogram>
 
 <histogram name="Media.LowLatencyAudioCaptureStartupSuccess"
-    enum="AudioCaptureStartupResult" expires_after="2024-01-07">
+    enum="AudioCaptureStartupResult" expires_after="2024-03-10">
   <owner>armax@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -4023,18 +4176,6 @@
   </summary>
 </histogram>
 
-<histogram name="Media.Notification.Cast.StartStop"
-    enum="GlobalMediaControlsCastActionAndEntryPoint"
-    expires_after="2024-01-14">
-  <owner>takumif@chromium.org</owner>
-  <owner>openscreen-eng@google.com</owner>
-  <owner>media-dev-uma@chromium.org</owner>
-  <summary>
-    Recorded when the user starts or stops a Cast session. Records the action
-    and how the Global Media Controls UI was opened.
-  </summary>
-</histogram>
-
 <histogram name="Media.Notification.Cast.UserAction" enum="MediaSessionAction"
     expires_after="2024-01-14">
   <owner>takumif@chromium.org</owner>
@@ -4043,7 +4184,8 @@
   <summary>
     Records the type of the action (e.g. pause) whenever the user makes an
     action on a Cast media notification. Starting and stopping casting is
-    recorded in Media.Notification.Cast.StartStop.
+    recorded in Media.GlobalMediaControls.MediaCastMode.Start and
+    Media.GlobalMediaControls.MediaCastMode.Stop.
   </summary>
 </histogram>
 
@@ -4314,7 +4456,7 @@
 </histogram>
 
 <histogram name="Media.Remoting.AudioBitrate" units="kbps"
-    expires_after="2024-01-14">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -4323,28 +4465,28 @@
 </histogram>
 
 <histogram name="Media.Remoting.AudioChannelLayout" enum="ChannelLayout"
-    expires_after="2023-09-12">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>Audio channel layout used while remoting content.</summary>
 </histogram>
 
 <histogram name="Media.Remoting.AudioCodec" enum="AudioCodec"
-    expires_after="2024-01-14">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>Audio codec used while remoting content.</summary>
 </histogram>
 
 <histogram name="Media.Remoting.AudioSamplesPerSecond" enum="AudioSampleRate"
-    expires_after="2023-09-12">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>Audio sampling rate while remoting audio content.</summary>
 </histogram>
 
 <histogram name="Media.Remoting.AudioSamplesPerSecondUnexpected" units="Hz"
-    expires_after="2023-09-12">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -4353,7 +4495,7 @@
 </histogram>
 
 <histogram name="Media.Remoting.Compatibility" enum="RemotingCompatibility"
-    expires_after="2024-01-14">
+    expires_after="2024-09-12">
   <owner>takumif@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -4364,7 +4506,7 @@
 </histogram>
 
 <histogram name="Media.Remoting.RemotePlaybackEnabledByPage"
-    enum="BooleanEnabled" expires_after="2024-01-14">
+    enum="BooleanEnabled" expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -4375,35 +4517,35 @@
 </histogram>
 
 <histogram name="Media.Remoting.SessionDuration" units="ms"
-    expires_after="2024-01-14">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>Measures the duration of each remoting session.</summary>
 </histogram>
 
 <histogram name="Media.Remoting.SessionStartFailedReason"
-    enum="RemotingStartFailReason" expires_after="2023-12-01">
+    enum="RemotingStartFailReason" expires_after="2024-09-12">
   <owner>muyaoxu@google.com</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>Tracks the reason that a session failed to start.</summary>
 </histogram>
 
 <histogram name="Media.Remoting.SessionStartTrigger"
-    enum="RemotingStartTrigger" expires_after="2024-01-14">
+    enum="RemotingStartTrigger" expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>Tracks the trigger for starting a remoting session.</summary>
 </histogram>
 
 <histogram name="Media.Remoting.SessionStopTrigger" enum="RemotingStopTrigger"
-    expires_after="2024-01-14">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>Tracks the trigger for stopping a remoting session.</summary>
 </histogram>
 
 <histogram name="Media.Remoting.ShortSessionDuration" units="ms"
-    expires_after="2024-01-14">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -4412,7 +4554,7 @@
 </histogram>
 
 <histogram name="Media.Remoting.TimeUntilFirstPlayout" units="ms"
-    expires_after="2024-01-14">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -4422,7 +4564,7 @@
 </histogram>
 
 <histogram name="Media.Remoting.TimeUntilRemoteInitialized" units="ms"
-    expires_after="2024-01-14">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -4432,21 +4574,21 @@
 </histogram>
 
 <histogram name="Media.Remoting.TrackConfiguration"
-    enum="RemotingTrackConfiguration" expires_after="2023-09-12">
+    enum="RemotingTrackConfiguration" expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>Tracks whether audio or video or both are remoted.</summary>
 </histogram>
 
 <histogram name="Media.Remoting.VideoAspectRatio" units="%"
-    expires_after="2023-09-12">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>Aspect ratio of video while remoting content.</summary>
 </histogram>
 
 <histogram name="Media.Remoting.VideoBitrate" units="kbps"
-    expires_after="2024-01-14">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -4455,28 +4597,28 @@
 </histogram>
 
 <histogram name="Media.Remoting.VideoCodec" enum="VideoCodec"
-    expires_after="2023-09-12">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>Video codec used while remoting content.</summary>
 </histogram>
 
 <histogram name="Media.Remoting.VideoCodecProfile" enum="VideoCodecProfile"
-    expires_after="2024-01-14">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>Video codec profile used while remoting content.</summary>
 </histogram>
 
 <histogram name="Media.Remoting.VideoNaturalWidth" units="pixels"
-    expires_after="2023-09-12">
+    expires_after="2024-09-12">
   <owner>jophba@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>Video width while remoting content.</summary>
 </histogram>
 
 <histogram name="Media.Remoting.VideoPixelRateSupport"
-    enum="RemotingVideoPixelRateSupport" expires_after="2024-01-14">
+    enum="RemotingVideoPixelRateSupport" expires_after="2024-09-12">
   <owner>takumif@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -4697,6 +4839,16 @@
   </summary>
 </histogram>
 
+<histogram name="Media.RTCVideoEncoder.Initialize" units="ms"
+    expires_after="2024-01-31">
+  <owner>hiroh@chromium.org</owner>
+  <owner>chromeos-gfx-video@google.com</owner>
+  <summary>
+    The duration of initializing a hardware encoder in WebRTC API. It is
+    recorded whenever RTCVideoEncoder::InitEncode() is called.
+  </summary>
+</histogram>
+
 <histogram name="Media.RTCVideoEncoderInitEncodeSuccess" enum="BooleanSuccess"
     expires_after="never">
 <!-- expires-never: WebRTC health metric. -->
@@ -4753,7 +4905,7 @@
 </histogram>
 
 <histogram name="Media.ScreenCaptureKit.FullscreenModuleMode"
-    enum="ScreenCaptureKitFullscreenModuleMode" expires_after="2024-01-07">
+    enum="ScreenCaptureKitFullscreenModuleMode" expires_after="2024-03-10">
   <owner>kron@chromium.org</owner>
   <owner>webrtc-video@google.com</owner>
   <summary>
@@ -4777,7 +4929,7 @@
 </histogram>
 
 <histogram name="Media.Session.Play" enum="MediaSessionActionSource"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>steimel@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -4863,6 +5015,22 @@
   <summary>Size of HTML5 media (when known), in MB.</summary>
 </histogram>
 
+<histogram name="Media.Ui.GetDisplayMedia.BasicFlow.SourceCount.{Type}"
+    units="count" expires_after="2024-09-01">
+  <owner>eladalon@chromium.org</owner>
+  <owner>tovep@chromium.org</owner>
+  <summary>
+    Record how many sources of type {Type} were available for the user to choose
+    from. Recorded when the dialog is closed (user selected a source, cancelled,
+    or closed the tab that owns the dialog).
+  </summary>
+  <token key="Type">
+    <variant name="Screens" summary=""/>
+    <variant name="Tabs" summary=""/>
+    <variant name="Windows" summary=""/>
+  </token>
+</histogram>
+
 <histogram name="Media.Ui.GetDisplayMedia.BasicFlow.UserInteraction"
     enum="MediaUiGetDisplayMediaBasicFlowUserInteraction"
     expires_after="2024-01-14">
@@ -5171,7 +5339,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.AspectRatio" units="%"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>mcasas@chromium.org</owner>
   <owner>jophba@chromium.org</owner>
   <summary>
@@ -5191,8 +5359,20 @@
   </summary>
 </histogram>
 
+<histogram name="Media.VideoCapture.CreateDeviceSuccessLatency" units="ms"
+    expires_after="2024-03-11">
+  <owner>herre@google.com</owner>
+  <owner>video-cmi-apis@google.com</owner>
+  <summary>
+    Time during VideoSourceImpl startup taken to create a video_capture::Device
+    object. Only recorded if the creation was successful. Is a subset of
+    Media.VideoCapture.StartSourceSuccessLatency corresponding to Device
+    creation, rather than capture startup in the device.
+  </summary>
+</histogram>
+
 <histogram name="Media.VideoCapture.DelayUntilFirstFrame" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>armax@chromium.org</owner>
   <owner>video-cmi-mpp@google.com</owner>
   <summary>
@@ -5279,7 +5459,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.Error" enum="VideoCaptureError"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>mcasas@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
   <owner>armax@chromium.org</owner>
@@ -5293,7 +5473,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.FrameDrop"
-    enum="VideoCaptureFrameDropReason" expires_after="2023-12-31">
+    enum="VideoCaptureFrameDropReason" expires_after="2024-03-03">
   <owner>mcasas@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
   <owner>armax@chromium.org</owner>
@@ -5311,7 +5491,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.FrameRate" units="fps"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>mcasas@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
   <owner>armax@chromium.org</owner>
@@ -5447,7 +5627,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.ScaleOverride" units="units"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jophba@chromium.org</owner>
   <owner>klausw@chromium.org</owner>
   <summary>
@@ -5459,7 +5639,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.ScaleOverrideChangeCount" units="units"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jophba@chromium.org</owner>
   <owner>klausw@chromium.org</owner>
   <summary>
@@ -5469,7 +5649,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.Start" enum="Boolean"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>toprice@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
   <summary>
@@ -5492,7 +5672,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.StartOutcome"
-    enum="VideoCaptureStartOutcome" expires_after="2024-01-07">
+    enum="VideoCaptureStartOutcome" expires_after="2024-03-10">
   <owner>toprice@chromium.org</owner>
   <owner>guidou@chromium.org</owner>
   <summary>
@@ -5501,8 +5681,18 @@
   </summary>
 </histogram>
 
+<histogram name="Media.VideoCapture.StartSourceSuccessLatency" units="ms"
+    expires_after="2024-03-11">
+  <owner>herre@google.com</owner>
+  <owner>video-cmi-apis@google.com</owner>
+  <summary>
+    Total time for a VideoSourceImpl to start a device to serve the first push
+    subscription mojo connection. Only recorded if starting is successful.
+  </summary>
+</histogram>
+
 <histogram name="Media.VideoCapture.Width" units="pixels"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>mcasas@chromium.org</owner>
   <owner>handellm@chromium.org</owner>
   <owner>jophba@chromium.org</owner>
@@ -5586,7 +5776,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.Win.ErrorEvent" enum="Hresult"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>toprice@chromium.org</owner>
   <owner>hta@chromium.org</owner>
   <summary>
@@ -5928,7 +6118,7 @@
 </histogram>
 
 <histogram name="Media.VTVDA.SessionFailureReason"
-    enum="VTVDASessionFailureType" expires_after="2023-12-31">
+    enum="VTVDASessionFailureType" expires_after="2024-03-03">
   <owner>sandersd@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -6478,7 +6668,7 @@
 </histogram>
 
 <histogram name="MediaRouter.CastStreaming.Start.Failure.Native"
-    enum="MirroringServiceErrorType" expires_after="2023-11-12">
+    enum="MirroringServiceErrorType" expires_after="2024-03-10">
   <owner>takumif@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -6606,7 +6796,7 @@
 </histogram>
 
 <histogram name="MediaRouter.PresentationRequest.UrlBySink"
-    enum="PresentationUrlBySink" expires_after="2023-12-31">
+    enum="PresentationUrlBySink" expires_after="2024-03-03">
   <owner>mfoltz@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
@@ -6742,7 +6932,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Sink.SelectedType" enum="MediaSinkType"
-    expires_after="2023-11-12">
+    expires_after="2024-03-03">
   <owner>takumif@chromium.org</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/memory/histograms.xml b/tools/metrics/histograms/metadata/memory/histograms.xml
index de254a4..ca5c78d 100644
--- a/tools/metrics/histograms/metadata/memory/histograms.xml
+++ b/tools/metrics/histograms/metadata/memory/histograms.xml
@@ -510,7 +510,7 @@
 </histogram>
 
 <histogram name="Memory.Experimental.AvailableMemoryMB" units="MB"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>anthonyvd@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -551,7 +551,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Browser2.Custom" units="bytes"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorCustom2" -->
 
   <owner>sashamcintosh@chromium.org</owner>
@@ -569,7 +569,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Browser2.Small" units="KB"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -585,7 +585,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Browser2.Tiny" units="bytes"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorTiny2" -->
 
   <owner>sashamcintosh@chromium.org</owner>
@@ -637,7 +637,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Extension2.Small" units="KB"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -653,7 +653,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Extension2.Tiny" units="bytes"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorTiny2" -->
 
   <owner>sashamcintosh@chromium.org</owner>
@@ -685,7 +685,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Gpu2" units="MB"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -701,7 +701,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Gpu2.Custom" units="bytes"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorCustom2" -->
 
   <owner>sashamcintosh@chromium.org</owner>
@@ -719,7 +719,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Gpu2.Small" units="KB"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -735,7 +735,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Gpu2.Tiny" units="bytes"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorTiny2" -->
 
   <owner>sashamcintosh@chromium.org</owner>
@@ -817,7 +817,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.NetworkService2.Small"
-    units="KiB" expires_after="2024-01-10">
+    units="KiB" expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" -->
 
   <owner>mmenke@chromium.org</owner>
@@ -835,7 +835,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.NetworkService2.Tiny"
-    units="bytes" expires_after="2024-01-10">
+    units="bytes" expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorTiny2" -->
 
   <owner>sashamcintosh@chromium.org</owner>
@@ -919,7 +919,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Renderer2" units="MB"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -953,7 +953,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Renderer2.Small" units="KB"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -969,7 +969,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Renderer2.Tiny" units="bytes"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorTiny2" -->
 
   <owner>sashamcintosh@chromium.org</owner>
@@ -1017,7 +1017,7 @@
 
 <histogram
     name="Memory.Experimental.UserLevelMemoryPressureSignal.TotalPrivateMemoryFootprintAfter"
-    units="MB" expires_after="2023-12-04">
+    units="MB" expires_after="2024-03-03">
   <owner>tasak@google.com</owner>
   <owner>chrome-memory-tok@google.com</owner>
   <summary>
@@ -1028,7 +1028,7 @@
 
 <histogram
     name="Memory.Experimental.UserLevelMemoryPressureSignal.TotalPrivateMemoryFootprintBefore"
-    units="MB" expires_after="2023-12-04">
+    units="MB" expires_after="2024-03-03">
   <owner>tasak@google.com</owner>
   <owner>chrome-memory-tok@google.com</owner>
   <summary>
@@ -1046,7 +1046,7 @@
 
 <histogram
     name="Memory.Experimental.UserLevelMemoryPressureSignal.TotalPrivateMemoryFootprintVisibleOrHigherPriorityRenderersAfter"
-    units="MB" expires_after="2023-12-04">
+    units="MB" expires_after="2024-03-03">
   <owner>tasak@google.com</owner>
   <owner>chrome-memory-tok@google.com</owner>
   <summary>
@@ -1058,7 +1058,7 @@
 
 <histogram
     name="Memory.Experimental.UserLevelMemoryPressureSignal.TotalPrivateMemoryFootprintVisibleOrHigherPriorityRenderersBefore"
-    units="MB" expires_after="2023-12-04">
+    units="MB" expires_after="2024-03-03">
   <owner>tasak@google.com</owner>
   <owner>chrome-memory-tok@google.com</owner>
   <summary>
@@ -1110,7 +1110,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Utility2.Small" units="KB"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -1126,7 +1126,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Utility2.Tiny" units="bytes"
-    expires_after="2024-01-10">
+    expires_after="2024-03-10">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorTiny2" -->
 
   <owner>sashamcintosh@chromium.org</owner>
@@ -1357,7 +1357,7 @@
 </histogram>
 
 <histogram name="Memory.LowMemoryKiller.FreedSize" units="KB"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>khmel@google.com</owner>
   <owner>vovoy@google.com</owner>
   <summary>The memory size freed by each low memory kill event.</summary>
@@ -2135,7 +2135,7 @@
 </histogram>
 
 <histogram name="Memory.RenderProcessHost.Count.SandboxedIframeOverhead"
-    units="processes" expires_after="2024-01-09">
+    units="processes" expires_after="2024-03-10">
   <owner>wjmaclean@chromium.org</owner>
   <owner>alexmos@chromium.org</owner>
   <owner>creis@chromium.org</owner>
@@ -2190,7 +2190,7 @@
 </histogram>
 
 <histogram name="Memory.StackSamplingProfiler.StackSampleSize2" units="KB"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>iby@chromium.org</owner>
   <owner>cros-telemetry@google.com</owner>
   <summary>
@@ -2348,7 +2348,7 @@
 </histogram>
 
 <histogram name="Memory.Total.RendererBlinkGC" units="MB"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>fdoray@chromium.org</owner>
   <owner>lizeb@chromium.org</owner>
   <summary>
@@ -2360,7 +2360,7 @@
 </histogram>
 
 <histogram name="Memory.Total.RendererBlinkGC.Fragmentation" units="MB"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>fdoray@chromium.org</owner>
   <owner>lizeb@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/mobile/histograms.xml b/tools/metrics/histograms/metadata/mobile/histograms.xml
index a3a6c74..c0d8fc5 100644
--- a/tools/metrics/histograms/metadata/mobile/histograms.xml
+++ b/tools/metrics/histograms/metadata/mobile/histograms.xml
@@ -43,6 +43,12 @@
       summary="Recorded for PermissionsInfobar."/>
   <variant name="InfobarTypeSaveCard"
       summary="Recorded for Save Card Infobar."/>
+  <variant name="InfobarTypeSyncError"
+      summary="Recorded for Sync Error Infobar."/>
+  <variant name="InfobarTypeTabPickup"
+      summary="Recorded for TabPickup Infobar."/>
+  <variant name="InfobarTypeTailoredSecurityService"
+      summary="Recorded for Tailored Security Service Infobar."/>
   <variant name="InfobarTypeTranslate"
       summary="Recorded for Translate Infobar."/>
 </variants>
@@ -83,7 +89,7 @@
 </histogram>
 
 <histogram name="Mobile.ContextMenu.CopyImage" enum="ContextMenuIOSCopyImage"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>djean@chromium.org</owner>
   <owner>gambard@chromium.org</owner>
   <summary>
@@ -594,7 +600,7 @@
 </histogram>
 
 <histogram name="Mobile.SystemNotification.Permission.Change"
-    enum="BooleanEnabled" expires_after="2023-11-01">
+    enum="BooleanEnabled" expires_after="2024-03-03">
   <owner>salg@google.com</owner>
   <owner>shaktisahu@chromium.org</owner>
   <summary>
@@ -605,7 +611,7 @@
 </histogram>
 
 <histogram name="Mobile.SystemNotification.Permission.OSPromptResult"
-    enum="BooleanEnabled" expires_after="2023-12-31">
+    enum="BooleanEnabled" expires_after="2024-03-03">
   <owner>salg@google.com</owner>
   <owner>shaktisahu@chromium.org</owner>
   <summary>
@@ -615,7 +621,7 @@
 </histogram>
 
 <histogram name="Mobile.SystemNotification.Permission.RationaleResult"
-    enum="NotificationRationaleResult" expires_after="2023-12-31">
+    enum="NotificationRationaleResult" expires_after="2024-03-03">
   <owner>salg@google.com</owner>
   <owner>shaktisahu@chromium.org</owner>
   <summary>
@@ -625,7 +631,7 @@
 </histogram>
 
 <histogram name="Mobile.SystemNotification.Permission.StartupRequestCount"
-    units="attempts" expires_after="2023-12-31">
+    units="attempts" expires_after="2024-03-03">
   <owner>salg@google.com</owner>
   <owner>shaktisahu@chromium.org</owner>
   <summary>
@@ -1093,7 +1099,7 @@
 </histogram>
 
 <histogram name="MobileSignInPromo.NTPFeedTop.ImpressionsTilDismiss"
-    units="impressions" expires_after="2024-01-07">
+    units="impressions" expires_after="2024-03-10">
   <owner>mrefaat@chromium.org</owner>
   <owner>jlebel@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -1164,38 +1170,6 @@
   </summary>
 </histogram>
 
-<histogram name="MobileSignInPromo.SettingsManager.ImpressionsTilDismiss"
-    units="impressions" expires_after="2024-04-01">
-  <owner>jlebel@chromium.org</owner>
-  <owner>chrome-signin-team@google.com</owner>
-  <summary>
-    Counts how many times the signin promo is implicitly dismissed (by closing
-    the settings view) per impression.
-  </summary>
-</histogram>
-
-<histogram name="MobileSignInPromo.SettingsManager.ImpressionsTilSigninButtons"
-    units="impressions" expires_after="2024-04-01">
-  <owner>jlebel@chromium.org</owner>
-  <owner>chrome-signin-team@google.com</owner>
-  <summary>
-    Counts how many times one of the &quot;sign in&quot; buttons (any of the
-    signed-out &quot;Sign in to Chrome&quot; button, the &quot;Continue as
-    |name|&quot; button, or the &quot;Not |email|?&quot; button) is clicked per
-    impression.
-  </summary>
-</histogram>
-
-<histogram name="MobileSignInPromo.SettingsManager.ImpressionsTilXButton"
-    units="impressions" expires_after="2024-04-01">
-  <owner>jlebel@chromium.org</owner>
-  <owner>chrome-signin-team@google.com</owner>
-  <summary>
-    Counts how many times the explicit &quot;X&quot;-to-close button is clicked
-    per impression.
-  </summary>
-</histogram>
-
 <histogram name="MobileStartup.DailyLaunchCount" units="units"
     expires_after="2024-01-14">
   <owner>tedchoc@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/navigation/histograms.xml b/tools/metrics/histograms/metadata/navigation/histograms.xml
index f7fb21bc..545c825 100644
--- a/tools/metrics/histograms/metadata/navigation/histograms.xml
+++ b/tools/metrics/histograms/metadata/navigation/histograms.xml
@@ -53,7 +53,7 @@
 
 <histogram name="BackForwardCache.AllSites.EvictedAfterDocumentRestoredReason"
     enum="BackForwardCacheEvictedAfterDocumentRestoredReason"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -68,7 +68,7 @@
 </histogram>
 
 <histogram name="BackForwardCache.AllSites.HistoryNavigationOutcome"
-    enum="BackForwardCacheHistoryNavigationOutcome" expires_after="2023-12-31">
+    enum="BackForwardCacheHistoryNavigationOutcome" expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -82,7 +82,7 @@
 
 <histogram
     name="BackForwardCache.AllSites.HistoryNavigationOutcome.BlocklistedFeature"
-    enum="WebSchedulerTrackedFeature" expires_after="2023-12-31">
+    enum="WebSchedulerTrackedFeature" expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -99,7 +99,7 @@
 <histogram
     name="BackForwardCache.AllSites.HistoryNavigationOutcome.BrowsingInstanceNotSwappedReason"
     enum="BackForwardCacheBrowsingInstanceNotSwappedReason"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -136,7 +136,7 @@
 
 <histogram
     name="BackForwardCache.AllSites.HistoryNavigationOutcome.NotRestoredReason"
-    enum="BackForwardCacheNotRestoredReason" expires_after="2023-12-31">
+    enum="BackForwardCacheNotRestoredReason" expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -166,7 +166,7 @@
 
 <histogram name="BackForwardCache.EvictedAfterDocumentRestoredReason"
     enum="BackForwardCacheEvictedAfterDocumentRestoredReason"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -182,7 +182,7 @@
 </histogram>
 
 <histogram name="BackForwardCache.Eviction.Renderer"
-    enum="BackForwardCacheRendererEvictionReason" expires_after="2023-12-31">
+    enum="BackForwardCacheRendererEvictionReason" expires_after="2024-03-03">
   <owner>rakina@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -192,7 +192,7 @@
 </histogram>
 
 <histogram name="BackForwardCache.Eviction.TimeUntilProcessKilled" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -203,7 +203,7 @@
 
 <histogram
     name="BackForwardCache.Experimental.UnexpectedIPCMessagePostedToCachedFrame.MethodHash"
-    enum="MojoInterfaceName" expires_after="2023-12-31">
+    enum="MojoInterfaceName" expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -234,7 +234,7 @@
 </histogram>
 
 <histogram name="BackForwardCache.HistoryNavigationOutcome"
-    enum="BackForwardCacheHistoryNavigationOutcome" expires_after="2023-12-31">
+    enum="BackForwardCacheHistoryNavigationOutcome" expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -248,7 +248,7 @@
 </histogram>
 
 <histogram name="BackForwardCache.HistoryNavigationOutcome.BlocklistedFeature"
-    enum="WebSchedulerTrackedFeature" expires_after="2023-12-31">
+    enum="WebSchedulerTrackedFeature" expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -266,7 +266,7 @@
 <histogram
     name="BackForwardCache.HistoryNavigationOutcome.BrowsingInstanceNotSwappedReason"
     enum="BackForwardCacheBrowsingInstanceNotSwappedReason"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -284,7 +284,7 @@
 <histogram
     name="BackForwardCache.HistoryNavigationOutcome.DisabledForRenderFrameHostReason2"
     enum="BackForwardCacheDisabledForRenderFrameHostReason2"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -303,7 +303,7 @@
 
 <histogram
     name="BackForwardCache.HistoryNavigationOutcome.DisallowActivationReason"
-    enum="InactiveFrameDisallowActivationReason" expires_after="2023-12-31">
+    enum="InactiveFrameDisallowActivationReason" expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -341,7 +341,7 @@
 </histogram>
 
 <histogram name="BackForwardCache.HistoryNavigationOutcome.NotRestoredReason"
-    enum="BackForwardCacheNotRestoredReason" expires_after="2023-12-31">
+    enum="BackForwardCacheNotRestoredReason" expires_after="2024-03-03">
   <owner>fergal@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -524,36 +524,6 @@
   <summary>Whether the back-forward navigation was served from cache.</summary>
 </histogram>
 
-<histogram name="Navigation.BlobUrl" enum="Boolean" expires_after="2023-12-17">
-  <owner>jkokatsu@google.com</owner>
-  <owner>chrome-security-owp-team@google.com</owner>
-  <summary>
-    Record if navigation has occured to Blob URL, to better understand the usage
-    of Blob URL in active document (i.e. both main frame and iframes). This
-    record is taken in Navigator::DidNavigate.
-  </summary>
-</histogram>
-
-<histogram name="Navigation.BlobUrl.MainFrame" enum="Boolean"
-    expires_after="2023-10-15">
-  <owner>jkokatsu@google.com</owner>
-  <owner>chrome-security-owp-team@google.com</owner>
-  <summary>
-    Record if navigation has occured to Blob URL in main frame or iframe, to
-    better understand the usage of Blob URL in active document.
-  </summary>
-</histogram>
-
-<histogram name="Navigation.BlobUrl.Sandboxed" enum="Boolean"
-    expires_after="2023-10-15">
-  <owner>jkokatsu@google.com</owner>
-  <owner>chrome-security-owp-team@google.com</owner>
-  <summary>
-    Record if navigation has occured to opaque Blob URL, to better understand
-    the usage of Blob URL in active document.
-  </summary>
-</histogram>
-
 <histogram name="Navigation.BrowserMappedUrnUuidInIframeOrFencedFrame"
     enum="NavigationBrowserMappedUrnUuidInIframeOrFencedFrame"
     expires_after="2024-03-03">
@@ -1057,7 +1027,7 @@
 </histogram>
 
 <histogram name="Navigation.OnBeforeUnloadOverheadTime" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>clamy@chromium.org</owner>
   <owner>nasko@chromium.org</owner>
   <summary>
@@ -1496,7 +1466,7 @@
 </histogram>
 
 <histogram name="Navigation.UserAgentStringType" enum="UserAgentStringType"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>miketaylr@chromium.org</owner>
   <owner>potassium-katabolism@google.com</owner>
   <summary>
@@ -1778,7 +1748,7 @@
 <histogram
     name="Prerender.Experimental.CrossOriginRedirectionProtocolChange{PrerenderTriggerType}"
     enum="PrerenderCrossOriginRedirectionProtocolChange"
-    expires_after="2023-09-03">
+    expires_after="2023-12-03">
   <owner>lingqi@chromium.org</owner>
   <owner>nhiroki@chromium.org</owner>
   <owner>src/content/browser/preloading/prerender/OWNERS</owner>
@@ -1873,7 +1843,7 @@
 
 <histogram
     name="Prerender.Experimental.PrerenderCrossOriginRedirectionMismatch{PrerenderTriggerType}"
-    enum="PrerenderCrossOriginRedirectionMismatch" expires_after="2023-09-03">
+    enum="PrerenderCrossOriginRedirectionMismatch" expires_after="2023-12-03">
   <owner>lingqi@chromium.org</owner>
   <owner>nhiroki@chromium.org</owner>
   <owner>src/content/browser/preloading/prerender/OWNERS</owner>
@@ -1925,7 +1895,7 @@
 
 <histogram
     name="Prerender.Experimental.ReceivedPrerendersPerPrimaryPageChangedCount{PrerenderTriggerType}{EagernessCategory}"
-    units="count" expires_after="2023-11-03">
+    units="count" expires_after="2024-03-03">
   <owner>taiyo@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/nearby/histograms.xml b/tools/metrics/histograms/metadata/nearby/histograms.xml
index 8e05c0a..24f8d1c 100644
--- a/tools/metrics/histograms/metadata/nearby/histograms.xml
+++ b/tools/metrics/histograms/metadata/nearby/histograms.xml
@@ -981,6 +981,17 @@
   </summary>
 </histogram>
 
+<histogram name="Nearby.Share.IsSelfShare" enum="BooleanSuccess"
+    expires_after="2024-09-12">
+  <owner>brandosocarras@google.com</owner>
+  <owner>nearby-share-chromeos-eng@google.com</owner>
+  <summary>
+    Records whether the share was a Self Share. Emitted when Self Share is
+    enabled and a transfer completes successfully, fails, or was aborted by the
+    user, for example, by cancelling the transfer.
+  </summary>
+</histogram>
+
 <histogram name="Nearby.Share.LocalDeviceData.DeviceDataUpdater.HttpResult"
     enum="NearbyHttpResult" expires_after="2024-07-10">
   <owner>cclem@chromium.org</owner>
@@ -1332,6 +1343,8 @@
     <variant name=".NonContact" summary="when sharing with a non-contact"/>
     <variant name=".Phone" summary="when sharing with a phone"/>
     <variant name=".Receive" summary="when receiving"/>
+    <variant name=".SelfShare"
+        summary="when sharing with a device logged into the same account"/>
     <variant name=".Send" summary="when sending"/>
     <variant name=".Tablet" summary="when sharing with a tablet"/>
     <variant name=".UnknownDeviceType"
@@ -1351,6 +1364,30 @@
 </histogram>
 
 <histogram
+    name="Nearby.Share.Transfer.Success.Receive.{ShareTargetType}.SelfShare.{DeviceState}"
+    enum="BooleanSuccess" expires_after="2024-09-12">
+  <owner>brandosocarras@google.com</owner>
+  <owner>nearby-share-chromeos-eng@google.com</owner>
+  <summary>
+    Records the success/failure of a received attachment from a device, logged
+    into the same GAIA account as the receiver, of type {ShareTargetType} while
+    the receiver is in {DeviceState} state. Emitted when a transfer completes
+    successfully or definitively fails, but not for indeterminate states like
+    cancellation.
+  </summary>
+  <token key="ShareTargetType">
+    <variant name="Laptop" summary="a laptop"/>
+    <variant name="Phone" summary="a phone"/>
+    <variant name="Tablet" summary="a tablet"/>
+    <variant name="UnknownDeviceType" summary="an unknown device type"/>
+  </token>
+  <token key="DeviceState">
+    <variant name="LoggedIn" summary="device is logged in"/>
+    <variant name="ScreenLocked" summary="screen is locked"/>
+  </token>
+</histogram>
+
+<histogram
     name="Nearby.Share.Transfer.Success.{Direction}.{ShareTargetType}.{ContactStatus}"
     enum="BooleanSuccess" expires_after="2024-07-10">
   <owner>crisrael@google.com</owner>
@@ -1374,6 +1411,7 @@
   <token key="ContactStatus">
     <variant name="Contact" summary="contact-based sharing"/>
     <variant name="NonContact" summary="non-contact-based sharing"/>
+    <variant name="SelfShare" summary="account-based sharing"/>
   </token>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml
index 0f9e877..db8ebf7 100644
--- a/tools/metrics/histograms/metadata/net/histograms.xml
+++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -225,6 +225,12 @@
     unexportable_keys::UnexportableKeyService and completing the operation
     (either successfully or not).
 
+    This time includes both the time spent waiting in a task queue and the
+    execution time. These sub-intervals are covered by
+    Crypto.UnexportableKeys.BackgroundTaskQueueWaitDuration and
+    Crypto.UnexportableKeys.BackgroundTaskRunDuration histograms
+    correspondingly.
+
     Includes operations that were scheduled with {Priority}.
 
     Recorded right after a TPM operation completes.
@@ -237,6 +243,32 @@
   </token>
 </histogram>
 
+<histogram
+    name="Crypto.UnexportableKeys.BackgroundTaskQueueWaitDuration{Priority}"
+    units="ms" expires_after="2024-01-14">
+  <owner>alexilin@chromium.org</owner>
+  <owner>kristianm@chromium.org</owner>
+  <summary>
+    Records the time spent waiting in a task queue for the subset of TPM
+    operations that are asynchronously scheduled through
+    unexportable_keys::UnexportableKeyService.
+
+    This duration is a sub-interval of
+    Crypto.UnexportableKeys.BackgroundTaskDuration.
+
+    Includes operations that were scheduled with {Priority}.
+
+    Recorded right before a TPM operation is sent to the background thread for
+    execution.
+  </summary>
+  <token key="Priority">
+    <variant name="" summary="all priorities"/>
+    <variant name=".BestEffort" summary="the BestEffort priority"/>
+    <variant name=".UserBlocking" summary="the UserBlocking priority"/>
+    <variant name=".UserVisible" summary="the UserVisible priority"/>
+  </token>
+</histogram>
+
 <histogram name="Crypto.UnexportableKeys.BackgroundTaskResult{TaskType}"
     enum="UnexportableKeyServiceResult" expires_after="2024-01-14">
   <owner>alexilin@chromium.org</owner>
@@ -258,6 +290,37 @@
   </token>
 </histogram>
 
+<histogram name="Crypto.UnexportableKeys.BackgroundTaskRunDuration{TaskType}"
+    units="ms" expires_after="2024-01-14">
+  <owner>alexilin@chromium.org</owner>
+  <owner>kristianm@chromium.org</owner>
+  <summary>
+    Records the time that passed between starting executing a TPM operation on a
+    background thread and completing the operation (either successfully or not).
+    Includes only a subset of TPM operations that are scheduled asynchronously
+    through unexportable_keys::UnexportableKeyService.
+
+    This duration is a sub-interval of
+    Crypto.UnexportableKeys.BackgroundTaskDuration. Unlike
+    Crypto.UnexportableKeys.BackgroundTaskDuration, this histogram is split by a
+    task type instead of a task priority because the priority doesn't matter
+    once a task starts executing. Only one task can be executed at the time due
+    to TPM limitations.
+
+    Includes {TaskType}.
+
+    Recorded right after a TPM operation completes.
+  </summary>
+  <token key="TaskType">
+    <variant name="" summary="all operation types"/>
+    <variant name=".FromWrappedKey"
+        summary="only operations to create a signing key from a wrapped key"/>
+    <variant name=".GenerateKey"
+        summary="only operations to generate a new signing key"/>
+    <variant name=".Sign" summary="only signing operations"/>
+  </token>
+</histogram>
+
 <histogram name="Crypto.VirtualKeySupport" enum="TPMSupport"
     expires_after="2024-03-01">
   <owner>kristianm@chromium.org</owner>
@@ -725,18 +788,6 @@
   </summary>
 </histogram>
 
-<histogram name="Net.CertVerifier_TrialComparisonResult"
-    enum="CertVerifierTrialComparisonResult" expires_after="2024-02-20">
-  <owner>mattm@chromium.org</owner>
-  <owner>rsleevi@chromium.org</owner>
-  <summary>
-    If the CertDualVerificationTrial is enabled, each certificate verification
-    associated with a (non-incognito) profile which is opted-in to SBER2(Scout)
-    will record the outcome of comparing the primary verifier and secondary
-    verifier results.
-  </summary>
-</histogram>
-
 <histogram name="Net.ConnectionInfo.MainFrame" enum="ConnectionInfo"
     expires_after="2024-02-25">
   <owner>dschinazi@chromium.org</owner>
@@ -1131,7 +1182,7 @@
 
 <histogram base="true"
     name="Net.DNS.DnsTransaction.SecureNotValidated.FailureError"
-    enum="NetErrorCodes" expires_after="2023-11-30">
+    enum="NetErrorCodes" expires_after="2024-06-13">
 <!-- Name completed by histogram_suffixes
    name="DohProviderId" -->
 
@@ -1146,7 +1197,7 @@
 
 <histogram base="true"
     name="Net.DNS.DnsTransaction.SecureNotValidated.FailureTime" units="ms"
-    expires_after="2023-11-30">
+    expires_after="2024-01-30">
 <!-- Name completed by histogram_suffixes
    name="DohProviderId" -->
 
@@ -1161,7 +1212,7 @@
 
 <histogram base="true"
     name="Net.DNS.DnsTransaction.SecureNotValidated.SuccessTime" units="ms"
-    expires_after="2023-11-30">
+    expires_after="2024-01-30">
 <!-- Name completed by histogram_suffixes
    name="DohProviderId" -->
 
@@ -1405,7 +1456,7 @@
 </histogram>
 
 <histogram name="Net.DNS.ProbeSequence.ConfigChange.Success.AttemptTime"
-    units="ms" expires_after="2023-11-30">
+    units="ms" expires_after="2024-01-30">
   <owner>awillia@chromium.org</owner>
   <owner>src/net/dns/OWNERS</owner>
   <summary>
@@ -1415,7 +1466,7 @@
 </histogram>
 
 <histogram name="Net.DNS.ProbeSequence.NetworkChange.Failure.AttemptTime"
-    units="ms" expires_after="2023-11-30">
+    units="ms" expires_after="2024-01-30">
   <owner>awillia@chromium.org</owner>
   <owner>src/net/dns/OWNERS</owner>
   <summary>
@@ -1425,7 +1476,7 @@
 </histogram>
 
 <histogram name="Net.DNS.ProbeSequence.NetworkChange.Success.AttemptTime"
-    units="ms" expires_after="2023-11-30">
+    units="ms" expires_after="2024-01-30">
   <owner>awillia@chromium.org</owner>
   <owner>src/net/dns/OWNERS</owner>
   <summary>
@@ -1472,6 +1523,24 @@
   </summary>
 </histogram>
 
+<histogram base="true" name="Net.DNS.ResolveContext.DohAutoupgrade.Status"
+    enum="DohServerAutoupgradeStatus" expires_after="2024-01-30">
+<!-- Name completed by histogram_suffixes
+   name="DohProviderId" -->
+
+  <owner>awillia@chromium.org</owner>
+  <owner>src/net/OWNERS</owner>
+  <summary>
+    The state of the Secure DNS (DoH) auto-upgrade functionality. This histogram
+    is only emitted by clients with secure DNS set to automatic mode, and the
+    emission occurs one minute after the insecure DNS to secure DNS auto-upgrade
+    network probing begins. There will be one histogram emission per DoH
+    provider in the system DNS configuration per NetworkContext that allows
+    using secure DNS queries, and re-emissions can occur each time the DNS
+    configuration changes.
+  </summary>
+</histogram>
+
 <histogram name="Net.DNS.ResolveError.Fast" enum="NetErrorCodes"
     expires_after="never">
 <!-- expires-never: Core network stack health metric -->
@@ -1553,7 +1622,7 @@
 </histogram>
 
 <histogram name="Net.DNS.SystemTask.FailureTime" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>horo@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -1564,7 +1633,7 @@
 </histogram>
 
 <histogram name="Net.DNS.SystemTask.SuccessTime" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>horo@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -1574,19 +1643,6 @@
   </summary>
 </histogram>
 
-<histogram base="true" name="Net.DNS.UI.DropdownSelectionEvent"
-    enum="DohProviderId" expires_after="2023-09-03">
-<!-- Name completed by histogram_suffixes
-   name="DnsDropdownSelectionEvent" -->
-
-  <owner>horo@chromium.org</owner>
-  <owner>src/net/dns/OWNERS</owner>
-  <summary>
-    Provider in a user-initiated dropdown change event that occured when this
-    provider was one of the dropown options.
-  </summary>
-</histogram>
-
 <histogram name="Net.DNS.UI.ProbeAttemptSuccess" enum="Boolean"
     expires_after="2023-12-17">
   <owner>awillia@chromium.org</owner>
@@ -1814,6 +1870,16 @@
   </summary>
 </histogram>
 
+<histogram name="Net.HttpAuthCount" enum="HttpAuthCount"
+    expires_after="2024-02-29">
+  <owner>mpdenton@chromium.org</owner>
+  <owner>src/net/OWNERS</owner>
+  <summary>
+    Per-authentication-scheme counts of HTTP authentication attempts and
+    rejections.
+  </summary>
+</histogram>
+
 <histogram name="Net.HttpAuthNtlmV2Usage" enum="HttpAuthNtlmV2Usage"
     expires_after="M79">
   <owner>mmenke@chromium.org</owner>
@@ -1834,6 +1900,19 @@
   <summary>Type of the HTTP auth prompt displayed.</summary>
 </histogram>
 
+<histogram name="Net.HttpAuthTarget" enum="HttpAuthTarget"
+    expires_after="2024-02-29">
+  <owner>mpdenton@chromium.org</owner>
+  <owner>src/net/OWNERS</owner>
+  <summary>
+    Per-authentication-scheme counts of HTTP authentication targets, such as
+    secure servers or proxies.
+
+    Emitted at the same time as Net.HttpAuthCount, on every HTTP authentication
+    attempt or rejection.
+  </summary>
+</histogram>
+
 <histogram name="Net.HttpContentFreshnessLifetime" units="seconds"
     expires_after="M85">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
@@ -1883,7 +1962,7 @@
 </histogram>
 
 <histogram name="Net.HttpJob.IpProtection.BytesSent" units="bytes"
-    expires_after="2023-12-31">
+    expires_after="2024-03-10">
   <owner>aakallam@chromium.org</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
   <summary>
@@ -1895,7 +1974,7 @@
 </histogram>
 
 <histogram name="Net.HttpJob.IpProtection.PrefilterBytesRead.Net" units="bytes"
-    expires_after="2023-12-31">
+    expires_after="2024-03-10">
   <owner>aakallam@chromium.org</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
   <summary>
@@ -1908,7 +1987,7 @@
 </histogram>
 
 <histogram name="Net.HttpJob.IpProtection.TotalTimeNotCached" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-10">
   <owner>djmitche@chromium.org</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
   <summary>
@@ -2363,7 +2442,7 @@
 </histogram>
 
 <histogram name="Net.QuicConnection.MultiPortPathStatusWhenMigrating"
-    enum="MultiPortStatusOnMigration" expires_after="2023-12-30">
+    enum="MultiPortStatusOnMigration" expires_after="2024-03-03">
   <owner>renjietang@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>
@@ -2605,7 +2684,7 @@
 </histogram>
 
 <histogram name="Net.QuicMultiPort.AltPortFailureWhenPathDegradingVsGeneral"
-    units="%" expires_after="2023-12-24">
+    units="%" expires_after="2024-03-03">
   <owner>renjietang@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>
@@ -2615,7 +2694,7 @@
 </histogram>
 
 <histogram name="Net.QuicMultiPort.AltPortRttWhenPathDegradingVsGeneral"
-    units="%" expires_after="2023-12-24">
+    units="%" expires_after="2024-03-03">
   <owner>renjietang@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>
@@ -2669,7 +2748,7 @@
 </histogram>
 
 <histogram name="Net.QuicNetworkDegradingDurationTillDisconnected" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>dschinazi@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>
@@ -3641,7 +3720,7 @@
 </histogram>
 
 <histogram name="Net.QuicSession.NumDefaultPathDegrading" units="times"
-    expires_after="2023-10-22">
+    expires_after="2024-03-03">
   <owner>renjietang@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>
@@ -4722,7 +4801,7 @@
 </histogram>
 
 <histogram name="Net.RestrictedCookieManager.CookiePartitionKeyOK"
-    enum="Boolean" expires_after="2024-01-01">
+    enum="Boolean" expires_after="2024-03-03">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -4736,7 +4815,7 @@
 </histogram>
 
 <histogram name="Net.RestrictedCookieManager.GetCookiesString.Count30Seconds"
-    units="IPCs" expires_after="2023-12-31">
+    units="IPCs" expires_after="2024-03-03">
   <owner>carlscab@google.com</owner>
   <owner>olivierli@chromium.org</owner>
   <owner>woa-performance@google.com</owner>
@@ -4750,7 +4829,7 @@
 </histogram>
 
 <histogram name="Net.RestrictedCookieManager.PartitionedCookiesInScript"
-    units="cookies" expires_after="2024-01-01">
+    units="cookies" expires_after="2024-03-03">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -4835,7 +4914,7 @@
 
 <histogram
     name="Net.SharedDictionaryManagerOnDisk.TotalDictionaryCountWhenAdded"
-    units="count" expires_after="2023-12-01">
+    units="count" expires_after="2024-03-03">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -4847,7 +4926,7 @@
 
 <histogram
     name="Net.SharedDictionaryManagerOnDisk.TotalDictionarySizeKBWhenAdded"
-    units="KB" expires_after="2023-12-01">
+    units="KB" expires_after="2024-03-03">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -4859,7 +4938,7 @@
 
 <histogram
     name="Net.SharedDictionaryOnDisk.OpenEntryLatency.{SuccessOrFailure}"
-    units="ms" expires_after="2023-12-01">
+    units="ms" expires_after="2024-03-03">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -4870,7 +4949,7 @@
 </histogram>
 
 <histogram name="Net.SharedDictionaryOnDisk.ReadDataLatency.{SuccessOrFailure}"
-    units="ms" expires_after="2023-12-01">
+    units="ms" expires_after="2024-03-03">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -4917,7 +4996,7 @@
 </histogram>
 
 <histogram name="Net.SharedDictionaryStore.DictionarySizeKBPerSiteWhenAdded"
-    units="KB" expires_after="2023-12-01">
+    units="KB" expires_after="2024-03-03">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -4954,7 +5033,7 @@
 
 <histogram
     name="Net.SharedDictionaryTransaction.DictionaryReadLatency.{SuccessOrFailure}"
-    units="ms" expires_after="2023-12-01">
+    units="ms" expires_after="2024-03-03">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -5854,7 +5933,7 @@
 </histogram>
 
 <histogram name="Net.ZstdFilter.MaxMemoryUsage" units="KB"
-    expires_after="2023-11-17">
+    expires_after="2024-03-03">
   <owner>nidhijaju@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml
index 9fb8af9..a3d45277 100644
--- a/tools/metrics/histograms/metadata/network/histograms.xml
+++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -100,6 +100,27 @@
   <variant name="WireGuard" summary="WireGuard"/>
 </variants>
 
+<histogram
+    name="Network.Ash.Cellular.AllowTextMessages.Policy.SuppressionState"
+    enum="PolicyTextMessageSuppressionState" expires_after="2024-06-01">
+  <owner>gordonseto@google.com</owner>
+  <owner>cros-connectivity@google.com</owner>
+  <summary>
+    Records the policy text message suppression state. This is emitted whenever
+    the text message suppression value is changed via policy.
+  </summary>
+</histogram>
+
+<histogram name="Network.Ash.Cellular.AllowTextMessages.User.SuppressionState"
+    enum="UserTextMessageSuppressionState" expires_after="2024-06-01">
+  <owner>gordonseto@google.com</owner>
+  <owner>cros-connectivity@google.com</owner>
+  <summary>
+    Records the user text message suppression state. This is emitted whenever
+    the text message suppression value is changed by the user.
+  </summary>
+</histogram>
+
 <histogram name="Network.Ash.Cellular.Apn.CreateCustomApn.ApnTypes"
     enum="ApnTypes" expires_after="2023-12-31">
   <owner>gordonseto@google.com</owner>
@@ -138,7 +159,7 @@
 </histogram>
 
 <histogram name="Network.Ash.Cellular.Apn.CustomApns.Count" units="count"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>gordonseto@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -148,7 +169,7 @@
 </histogram>
 
 <histogram name="Network.Ash.Cellular.Apn.CustomApns.{CustomApnState}.Count"
-    units="count" expires_after="2023-12-31">
+    units="count" expires_after="2024-03-10">
   <owner>gordonseto@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -264,7 +285,7 @@
 </histogram>
 
 <histogram name="Network.Ash.Cellular.ConnectionResult.{CustomApnsStatus}.All"
-    enum="ShillConnectResult" expires_after="2023-12-31">
+    enum="ShillConnectResult" expires_after="2024-03-03">
   <owner>gordonseto@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -292,6 +313,32 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Network.Ash.Cellular.ESim.PolicyInstall.{UserErrorHandling}.{Method}"
+    enum="ESimInstallResult" expires_after="2023-12-31">
+  <owner>chadduffin@chromium.org</owner>
+  <owner>cros-connectivity@google.com</owner>
+  <summary>
+    Records the result of an attempt to install an eSIM profile. This is emitted
+    once for each installation attempt of the eSIM profile corresponding to a
+    policy-defined network. The &quot;included&quot; variant will always be
+    emitted to; the &quot;filtered&quot; variant, however, will not be emitted
+    to when the result was due to an Hermes failure that was caused by something
+    outside the control of ChromeOS, e.g. an invalid activation code.
+  </summary>
+  <token key="UserErrorHandling">
+    <variant name="UserErrorsFiltered"/>
+    <variant name="UserErrorsIncluded"/>
+  </token>
+  <token key="Method">
+    <variant name="All"/>
+    <variant name="ViaSmdpInitial"/>
+    <variant name="ViaSmdpRetry"/>
+    <variant name="ViaSmdsInitial"/>
+    <variant name="ViaSmdsRetry"/>
+  </token>
+</histogram>
+
 <histogram name="Network.Ash.Cellular.ESim.SmdsScan.ProfileCount" units="units"
     expires_after="2023-12-31">
   <owner>chadduffin@chromium.org</owner>
@@ -315,6 +362,33 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Network.Ash.Cellular.ESim.UserInstall.{UserErrorHandling}.{Method}"
+    enum="ESimInstallResult" expires_after="2023-12-31">
+  <owner>chadduffin@chromium.org</owner>
+  <owner>cros-connectivity@google.com</owner>
+  <summary>
+    Records the result of an attempt to install an eSIM profile. This is emitted
+    once for each installation attempt of an eSIM profile using the consumer UI.
+    The &quot;included&quot; variant will always be emitted to; the
+    &quot;filtered&quot; variant, however, will not be emitted to when the to
+    when the result was due to an Hermes failure that was caused by something
+    outside the control of ChromeOS, e.g. an invalid activation code.
+  </summary>
+  <token key="UserErrorHandling">
+    <variant name="UserErrorsFiltered"/>
+    <variant name="UserErrorsIncluded"/>
+  </token>
+  <token key="Method">
+    <variant name="All"/>
+    <variant name="ViaActivationCodeAfterSmds"/>
+    <variant name="ViaActivationCodeSkippedSmds"/>
+    <variant name="ViaQrCodeAfterSmds"/>
+    <variant name="ViaQrCodeSkippedSmds"/>
+    <variant name="ViaSmds"/>
+  </token>
+</histogram>
+
 <histogram name="Network.Ash.Cellular.SimLock.Policy.Notification.Event"
     enum="SimLockNotificationEvent" expires_after="2023-12-31">
   <owner>hsuregan@chromium.org</owner>
@@ -358,7 +432,7 @@
 </histogram>
 
 <histogram name="Network.Ash.Hotspot.SetConfig.OperationResult"
-    enum="HotspotSetConfigResult" expires_after="2023-10-01">
+    enum="HotspotSetConfigResult" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -368,7 +442,7 @@
 </histogram>
 
 <histogram name="Network.Ash.Hotspot.Upstream.Cellular.Capability.AllowStatus"
-    enum="HotspotAllowStatus" expires_after="2023-10-01">
+    enum="HotspotAllowStatus" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -381,7 +455,7 @@
 
 <histogram
     name="Network.Ash.Hotspot.Upstream.Cellular.Capability.AllowStatusAtLogin"
-    enum="HotspotAllowStatus" expires_after="2023-10-01">
+    enum="HotspotAllowStatus" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -394,7 +468,7 @@
 
 <histogram
     name="Network.Ash.Hotspot.Upstream.Cellular.CheckReadiness.OperationResult"
-    enum="HotspotCheckReadinessResult" expires_after="2023-10-01">
+    enum="HotspotCheckReadinessResult" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -405,7 +479,7 @@
 </histogram>
 
 <histogram name="Network.Ash.Hotspot.Upstream.Cellular.Disabled.Reason"
-    enum="HotspotDisableReason" expires_after="2024-01-28">
+    enum="HotspotDisableReason" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -415,7 +489,7 @@
 </histogram>
 
 <histogram name="Network.Ash.Hotspot.Upstream.Cellular.Enabled.UpstreamStatus"
-    enum="HotspotUpstreamStatus" expires_after="2023-10-01">
+    enum="HotspotUpstreamStatus" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -425,7 +499,7 @@
 </histogram>
 
 <histogram name="Network.Ash.Hotspot.Upstream.Cellular.EnableHotspot.Latency"
-    units="ms" expires_after="2024-02-04">
+    units="ms" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -436,7 +510,7 @@
 
 <histogram
     name="Network.Ash.Hotspot.Upstream.Cellular.Usage.Config.AutoDisable"
-    enum="BooleanEnabled" expires_after="2023-10-01">
+    enum="BooleanEnabled" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -448,7 +522,7 @@
 
 <histogram
     name="Network.Ash.Hotspot.Upstream.Cellular.Usage.Config.CompatibilityMode"
-    enum="BooleanEnabled" expires_after="2023-10-01">
+    enum="BooleanEnabled" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -458,7 +532,7 @@
 </histogram>
 
 <histogram name="Network.Ash.Hotspot.Upstream.Cellular.Usage.Config.MAR"
-    enum="BooleanEnabled" expires_after="2023-10-01">
+    enum="BooleanEnabled" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -469,7 +543,7 @@
 </histogram>
 
 <histogram name="Network.Ash.Hotspot.Upstream.Cellular.Usage.Duration"
-    units="ms" expires_after="2023-10-01">
+    units="ms" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -480,7 +554,7 @@
 
 <histogram
     name="Network.Ash.Hotspot.Upstream.Cellular.Usage.ManagedStateWhenHotspotEnabled"
-    enum="BooleanManaged" expires_after="2023-10-01">
+    enum="BooleanManaged" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -491,7 +565,7 @@
 
 <histogram
     name="Network.Ash.Hotspot.Upstream.Cellular.Usage.MaxConnectedDeviceCount"
-    units="count" expires_after="2023-10-01">
+    units="count" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -502,7 +576,7 @@
 
 <histogram
     name="Network.Ash.Hotspot.Upstream.Cellular.{Operation}.OperationResult"
-    enum="HotspotSetEnabledResult" expires_after="2023-10-01">
+    enum="HotspotSetEnabledResult" expires_after="2024-04-01">
   <owner>jiajunz@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -516,7 +590,7 @@
 </histogram>
 
 <histogram name="Network.Ash.VPN.{VPNProviderType}.ConfigurationSource"
-    enum="VPNConfigurationSource" expires_after="2023-12-31">
+    enum="VPNConfigurationSource" expires_after="2024-03-03">
   <owner>chadduffin@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -533,7 +607,7 @@
 </histogram>
 
 <histogram name="Network.Ash.WiFi.Hidden.RemovalAttempt"
-    units="network removal attempts" expires_after="2023-12-31">
+    units="network removal attempts" expires_after="2024-03-03">
   <owner>chadduffin@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -545,7 +619,7 @@
 </histogram>
 
 <histogram name="Network.Ash.WiFi.Hidden.RemovalAttempt.Result"
-    enum="BooleanSuccess" expires_after="2023-12-31">
+    enum="BooleanSuccess" expires_after="2024-03-03">
   <owner>chadduffin@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -560,7 +634,7 @@
 </histogram>
 
 <histogram name="Network.Ash.WiFi.Hidden.{LoginStatus}" enum="Boolean"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>chadduffin@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -578,7 +652,7 @@
 </histogram>
 
 <histogram name="Network.Ash.{NetworkType}.ConnectionResult.All"
-    enum="ShillConnectResult" expires_after="2023-12-31">
+    enum="ShillConnectResult" expires_after="2024-03-03">
   <owner>hsuregan@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -604,7 +678,7 @@
 </histogram>
 
 <histogram name="Network.Ash.{NetworkType}.ConnectionResult.UserInitiated"
-    enum="UserInitiatedNetworkConnectResult" expires_after="2023-12-31">
+    enum="UserInitiatedNetworkConnectResult" expires_after="2024-03-03">
   <owner>hsuregan@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -615,7 +689,7 @@
 </histogram>
 
 <histogram name="Network.Ash.{NetworkType}.DisconnectionsWithoutUserAction"
-    enum="NetworkConnectionState" expires_after="2023-12-31">
+    enum="NetworkConnectionState" expires_after="2024-03-03">
   <owner>hsuregan@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -627,7 +701,7 @@
 
 <histogram
     name="Network.Ash.{NetworkType}.DisconnectionsWithoutUserAction.ShillError"
-    enum="ShillConnectResult" expires_after="2023-12-31">
+    enum="ShillConnectResult" expires_after="2024-03-10">
   <owner>chadduffin@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -638,7 +712,7 @@
 </histogram>
 
 <histogram name="Network.Ash.{TechnologyType}.EnabledState.{Operation}.Result"
-    enum="BooleanSuccess" expires_after="2023-12-31">
+    enum="BooleanSuccess" expires_after="2024-03-03">
   <owner>hsuregan@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -659,7 +733,7 @@
 
 <histogram
     name="Network.Ash.{TechnologyType}.EnabledState.{Operation}.ResultCode"
-    enum="ShillConnectResult" expires_after="2023-12-31">
+    enum="ShillConnectResult" expires_after="2024-03-03">
   <owner>nikhilcn@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -680,7 +754,7 @@
 </histogram>
 
 <histogram name="Network.CaptivePortalResult" enum="CaptivePortalNetworkState"
-    expires_after="2024-01-05">
+    expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-health-team@google.com</owner>
   <summary>
@@ -691,7 +765,7 @@
 </histogram>
 
 <histogram name="Network.CaptivePortalStatusCode" enum="HttpResponseCode"
-    expires_after="2024-01-05">
+    expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-health-team@google.com</owner>
   <summary>
@@ -835,7 +909,7 @@
 </histogram>
 
 <histogram name="Network.Cellular.ESim.Policy.BlockNonManagedCellularBehavior"
-    enum="NetworkBlockNonManagedCellularBehavior" expires_after="2023-12-31">
+    enum="NetworkBlockNonManagedCellularBehavior" expires_after="2024-03-03">
   <owner>azeemarshad@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>jiajunz@google.com</owner>
@@ -848,7 +922,7 @@
 </histogram>
 
 <histogram name="Network.Cellular.ESim.Policy.ConnectionResult.All"
-    enum="ShillCellularConnectResult" expires_after="2023-12-31">
+    enum="ShillCellularConnectResult" expires_after="2024-03-03">
   <owner>azeemarshad@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>hsuregan@chromium.org</owner>
@@ -1026,7 +1100,7 @@
 </histogram>
 
 <histogram name="Network.Cellular.ESim.RequestPendingProfiles.Latency"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>nikhilcn@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -1126,7 +1200,7 @@
 </histogram>
 
 <histogram name="Network.Cellular.ESim.Usage.Count" enum="NetworkCellularUsage"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>azeemarshad@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -1156,7 +1230,7 @@
 </histogram>
 
 <histogram name="Network.Cellular.InhibitResult"
-    enum="NetworkCellularInhibitResult" expires_after="2023-12-31">
+    enum="NetworkCellularInhibitResult" expires_after="2024-03-03">
   <owner>azeemarshad@chromium.org</owner>
   <owner>khorimoto@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
@@ -1195,7 +1269,7 @@
 </histogram>
 
 <histogram name="Network.Cellular.PrepareCellularConnection.OperationResult"
-    enum="NetworkCellularPrepareForConnectionResult" expires_after="2023-12-31">
+    enum="NetworkCellularPrepareForConnectionResult" expires_after="2024-03-10">
   <owner>azeemarshad@chromium.org</owner>
   <owner>khorimoto@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
@@ -1256,7 +1330,7 @@
 </histogram>
 
 <histogram name="Network.Cellular.PSim.Usage.Count" enum="NetworkCellularUsage"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>azeemarshad@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -1352,7 +1426,7 @@
 </histogram>
 
 <histogram name="Network.Cellular.{SimType}.ConnectionResult.All"
-    enum="ShillCellularConnectResult" expires_after="2023-12-31">
+    enum="ShillCellularConnectResult" expires_after="2024-03-10">
   <owner>azeemarshad@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>hsuregan@chromium.org</owner>
@@ -1372,7 +1446,7 @@
 </histogram>
 
 <histogram name="Network.Cellular.{SimType}.ConnectionResult.UserInitiated"
-    enum="UserInitiatedCellularConnectResult" expires_after="2023-12-31">
+    enum="UserInitiatedCellularConnectResult" expires_after="2024-03-10">
   <owner>azeemarshad@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>hsuregan@chromium.org</owner>
@@ -1433,7 +1507,7 @@
 </histogram>
 
 <histogram name="Network.Cellular.{SimType}.Usage.Duration" units="seconds"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>azeemarshad@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>hsuregan@chromium.org</owner>
@@ -1478,7 +1552,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.PlainTextProbe.{Family}.Errors"
-    enum="DnsProxy.QueryResult" expires_after="2023-12-31">
+    enum="DnsProxy.QueryResult" expires_after="2024-03-03">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1493,7 +1567,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.PlainTextProbe.{Family}.FailedRetries"
-    units="count" expires_after="2023-12-31">
+    units="count" expires_after="2024-03-03">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1508,7 +1582,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.PlainTextProbe.{Family}.Results"
-    enum="DnsProxy.QueryResult" expires_after="2023-12-31">
+    enum="DnsProxy.QueryResult" expires_after="2024-03-03">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1523,7 +1597,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.PlainTextProbe.{Family}.ResultsWithRetries"
-    enum="DnsProxy.QueryResult" expires_after="2023-12-31">
+    enum="DnsProxy.QueryResult" expires_after="2024-03-03">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1539,7 +1613,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.PlainTextProbe.{Family}.RetriesUntilSuccess"
-    units="count" expires_after="2023-12-31">
+    units="count" expires_after="2024-03-03">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1554,7 +1628,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.Query.Failed{Stage}Duration" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1590,7 +1664,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.Query.{Stage}Duration" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1626,7 +1700,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Family}Nameservers" units="units"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1641,7 +1715,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{ProcessType}.Event"
-    enum="DnsProxy.ProcessEvent" expires_after="2023-12-31">
+    enum="DnsProxy.ProcessEvent" expires_after="2024-03-03">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1659,7 +1733,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.Errors"
-    enum="DnsProxy.QueryError" expires_after="2023-12-31">
+    enum="DnsProxy.QueryError" expires_after="2024-03-03">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1674,7 +1748,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.FailedResolveDuration" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1695,7 +1769,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.ResolveDuration" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1716,7 +1790,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.Results"
-    enum="DnsProxy.QueryResult" expires_after="2023-12-31">
+    enum="DnsProxy.QueryResult" expires_after="2024-03-03">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1731,7 +1805,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.ResultsWithRetries"
-    enum="DnsProxy.QueryResult" expires_after="2023-12-31">
+    enum="DnsProxy.QueryResult" expires_after="2024-03-03">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1758,8 +1832,24 @@
   </summary>
 </histogram>
 
+<histogram name="Network.Mdns.{ServiceType}" enum="MdnsQueryType"
+    expires_after="2024-03-31">
+  <owner>nmuggli@google.com</owner>
+  <owner>project-bolton@google.com</owner>
+  <summary>
+    Number of mDNS packets sent for mDNS queries in support of different
+    services. The individual enum values indicate whether the query is an
+    initial query or a refresh query.
+  </summary>
+  <token key="ServiceType">
+    <variant name="Googlecast"/>
+    <variant name="Other"/>
+    <variant name="PrintScan"/>
+  </token>
+</histogram>
+
 <histogram name="Network.Multicast.ARC.ActiveTime" units="%"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>chuweih@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1771,7 +1861,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.ARC.WiFi.{Protocol}.ActiveCount"
-    units="packets" expires_after="2023-12-31">
+    units="packets" expires_after="2024-03-03">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1803,7 +1893,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.TotalCount" units="packets"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1814,7 +1904,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.{Technology}.ConnectedCount" units="packets"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1831,7 +1921,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.{Technology}.{Protocol}.ConnectedCount"
-    units="packets" expires_after="2023-12-31">
+    units="packets" expires_after="2024-03-03">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -1884,7 +1974,7 @@
 </histogram>
 
 <histogram name="Network.NetworkPortalDetectorType" enum="NetworkTechnology"
-    expires_after="2024-01-05">
+    expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-health-team@google.com</owner>
   <summary>
@@ -1907,7 +1997,7 @@
 </histogram>
 
 <histogram name="Network.NetworkPortalSigninMode"
-    enum="NetworkPortalSigninMode" expires_after="2024-01-05">
+    enum="NetworkPortalSigninMode" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-health-team@google.com</owner>
   <summary>
@@ -1917,7 +2007,7 @@
 </histogram>
 
 <histogram name="Network.NetworkPortalSigninSource"
-    enum="NetworkPortalSigninSource" expires_after="2024-01-05">
+    enum="NetworkPortalSigninSource" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-health-team@google.com</owner>
   <summary>
@@ -1927,7 +2017,7 @@
 </histogram>
 
 <histogram name="Network.Patchpanel.ArcService"
-    enum="NetworkPatchpanelArcEvent" expires_after="2023-12-31">
+    enum="NetworkPatchpanelArcEvent" expires_after="2024-03-03">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2059,7 +2149,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.ConnectResult.{ApnType}"
-    enum="PlatformCellularConnectResult" expires_after="2023-12-31">
+    enum="PlatformCellularConnectResult" expires_after="2024-03-03">
   <owner>danielwinkler@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2127,7 +2217,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.PortalResult"
-    enum="NetworkPortalResult" expires_after="2024-01-05">
+    enum="NetworkPortalResult" expires_after="2024-03-10">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2285,7 +2375,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.Driver" enum="EthernetDriver"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>chuweih@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2421,7 +2511,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.AttemptsToDisconnect.Cellular"
-    units="attempts" expires_after="2024-01-05">
+    units="attempts" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2443,7 +2533,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.AttemptsToDisconnect.Wifi"
-    units="attempts" expires_after="2024-01-05">
+    units="attempts" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2454,7 +2544,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.AttemptsToOnline.Cellular"
-    units="attempts" expires_after="2024-01-05">
+    units="attempts" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2464,7 +2554,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.AttemptsToOnline.Ethernet"
-    units="attempts" expires_after="2024-01-05">
+    units="attempts" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2474,7 +2564,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.AttemptsToOnline.Wifi"
-    units="attempts" expires_after="2024-01-05">
+    units="attempts" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2484,7 +2574,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.AttemptsToRedirectFound.Cellular"
-    units="attempts" expires_after="2024-01-05">
+    units="attempts" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2494,7 +2584,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.AttemptsToRedirectFound.Ethernet"
-    units="attempts" expires_after="2024-01-05">
+    units="attempts" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2505,7 +2595,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.AttemptsToRedirectFound.Wifi"
-    units="attempts" expires_after="2024-01-05">
+    units="attempts" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2515,7 +2605,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.InitialResult.Cellular"
-    enum="PortalDetectorResult" expires_after="2024-01-05">
+    enum="PortalDetectorResult" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2525,7 +2615,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.InitialResult.Ethernet"
-    enum="PortalDetectorResult" expires_after="2024-01-05">
+    enum="PortalDetectorResult" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2535,7 +2625,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.InitialResult.Wifi"
-    enum="PortalDetectorResult" expires_after="2024-01-05">
+    enum="PortalDetectorResult" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2545,7 +2635,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.RepeatResult.Cellular"
-    enum="PortalDetectorResult" expires_after="2024-01-05">
+    enum="PortalDetectorResult" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2555,7 +2645,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.RepeatResult.Ethernet"
-    enum="PortalDetectorResult" expires_after="2024-01-05">
+    enum="PortalDetectorResult" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2565,7 +2655,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.RepeatResult.Wifi"
-    enum="PortalDetectorResult" expires_after="2024-01-05">
+    enum="PortalDetectorResult" expires_after="2024-03-10">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2574,6 +2664,38 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Network.Shill.PortalDetector.{AttemptResult}Duration.{Technology}"
+    units="ms" expires_after="2023-12-31">
+  <owner>hugobenichi@google.com</owner>
+  <owner>cros-network-metrics@google.com</owner>
+  <summary>
+    Total duration of a full ChromeOS portal detection attempt on a {Technology}
+    network when this attempt either validates Internet connectivity or when
+    detects a portal with a redirected probe.
+  </summary>
+  <token key="AttemptResult">
+    <variant name="InternetValidation"/>
+    <variant name="PortalDiscovery"/>
+  </token>
+  <token key="Technology" variants="PhysicalTechnology"/>
+</histogram>
+
+<histogram name="Network.Shill.PortalDetector.{ProbeType}Duration.{Technology}"
+    units="ms" expires_after="2023-12-31">
+  <owner>hugobenichi@google.com</owner>
+  <owner>cros-network-metrics@google.com</owner>
+  <summary>
+    Duration of a single HTTP or HTTPS probe sent on a {Technology} network as
+    part of ChromeOS platform portal detection.
+  </summary>
+  <token key="ProbeType">
+    <variant name="HTTPProbe"/>
+    <variant name="HTTPSProbe"/>
+  </token>
+  <token key="Technology" variants="PhysicalTechnology"/>
+</histogram>
+
 <histogram name="Network.Shill.PPPMTUValue" units="bytes"
     expires_after="2023-12-31">
   <owner>jiejiang@chromium.org</owner>
@@ -2630,7 +2752,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.Ikev2.EndReason" enum="NetworkServiceError"
-    expires_after="2023-12-31">
+    expires_after="2024-03-10">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2669,7 +2791,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.OpenVPNCipher" enum="VPNOpenVPNCipher"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>taoyl@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2764,7 +2886,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.EspEncryptionAlgorithm"
-    enum="VPNIPsecEncryptionAlgorithm" expires_after="2023-12-31">
+    enum="VPNIPsecEncryptionAlgorithm" expires_after="2024-03-10">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2777,7 +2899,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.EspIntegrityAlgorithm"
-    enum="VPNIPsecIntegrirtyAlgorithm" expires_after="2023-12-31">
+    enum="VPNIPsecIntegrirtyAlgorithm" expires_after="2024-03-10">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2790,7 +2912,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.IkeDHGroup" enum="VPNIPsecDHGroup"
-    expires_after="2023-12-31">
+    expires_after="2024-03-10">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2803,7 +2925,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.IkeEncryptionAlgorithm"
-    enum="VPNIPsecEncryptionAlgorithm" expires_after="2023-12-31">
+    enum="VPNIPsecEncryptionAlgorithm" expires_after="2024-03-10">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2816,7 +2938,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.IkeIntegrityAlgorithm"
-    enum="VPNIPsecIntegrirtyAlgorithm" expires_after="2023-12-31">
+    enum="VPNIPsecIntegrirtyAlgorithm" expires_after="2024-03-10">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2829,7 +2951,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.{VPNType}.IPType" enum="NetworkIPType"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -2904,7 +3026,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.ApAlternateEDCASupport"
-    enum="WiFiApAlternateEDCASupport" expires_after="2023-12-30">
+    enum="WiFiApAlternateEDCASupport" expires_after="2024-03-03">
   <owner>damiendejean@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2945,7 +3067,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.ApSCSupport" enum="WiFiApSCSupport"
-    expires_after="2023-12-30">
+    expires_after="2024-03-03">
   <owner>damiendejean@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3166,7 +3288,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.HiddenSSIDEverConnected"
-    enum="BooleanEverConnected" expires_after="2024-01-07">
+    enum="BooleanEverConnected" expires_after="2024-03-10">
   <owner>tnagel@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <owner>cros-privacy-core@google.com</owner>
@@ -3335,7 +3457,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.Passpoint.ProvisioningResult"
-    enum="PasspointProvisioningResult" expires_after="2023-12-31">
+    enum="PasspointProvisioningResult" expires_after="2024-03-10">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-networking@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3423,7 +3545,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.PortalResult" enum="NetworkPortalResult"
-    expires_after="2024-01-05">
+    expires_after="2024-03-10">
   <owner>matthewmwang@chromium.org</owner>
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3764,7 +3886,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.TimeToPortal" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-10">
   <owner>matthewmwang@chromium.org</owner>
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3853,8 +3975,22 @@
   </summary>
 </histogram>
 
+<histogram name="Network.Shill.{Technology}.DHCPv4ProvisionDurationMillis"
+    units="ms" expires_after="2024-03-10">
+  <owner>jiejiang@chromium.org</owner>
+  <owner>cros-connectivity@google.com</owner>
+  <owner>cros-network-metrics@google.com</owner>
+  <summary>
+    ChromeOS network usage metric emitted after a {Technology} connection has
+    DHCPv4 provisioned, to track the duration from shill starts DHCPv4
+    configuration until shill gets the DHCP configuration from the dhcpcd
+    process.
+  </summary>
+  <token key="Technology" variants="PhysicalTechnology"/>
+</histogram>
+
 <histogram name="Network.Shill.{Technology}.IPType" enum="NetworkIPType"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-connectivity@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -3868,6 +4004,20 @@
   <token key="Technology" variants="PhysicalTechnology"/>
 </histogram>
 
+<histogram name="Network.Shill.{Technology}.SLAACProvisionDurationMillis"
+    units="ms" expires_after="2024-03-10">
+  <owner>jiejiang@chromium.org</owner>
+  <owner>cros-connectivity@google.com</owner>
+  <owner>cros-network-metrics@google.com</owner>
+  <summary>
+    ChromeOS network usage metric emitted after a {Technology} connection has
+    SLAAC provisioned, to track the duration from shill requests the kernel to
+    start SLAAC configuration until shill gets the first SLAAC address from the
+    kernel.
+  </summary>
+  <token key="Technology" variants="PhysicalTechnology"/>
+</histogram>
+
 <histogram name="Network.VisibilityAwareResourceScheduler.Deprioritized"
     units="Boolean" expires_after="2024-01-22">
   <owner>bashi@chromium.org</owner>
@@ -4105,29 +4255,29 @@
   <owner>yoichio@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
-    Recoards the time from origin to the network service starts when the network
+    Records the time from origin to the network service starts when the network
     service is initialized. See https://crbug.com/1439721.
   </summary>
 </histogram>
 
 <histogram name="NetworkService.IpProtection.GetAuthTokenResult"
-    enum="BooleanSuccess" expires_after="2023-12-31">
+    enum="BooleanSuccess" expires_after="2024-03-10">
   <owner>djmitche@chromium.org</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
   <summary>
-    The result of a call to `IpProtectionAuthTokenCache::GetAuthToken()`. If
-    this fails, it is because the cache was empty when a new connection to a
-    proxy was initiated.
+    The result of a call to `IpProtectionConfigCache::GetAuthToken()`. If this
+    fails, it is because the cache was empty when a new connection to a proxy
+    was initiated.
   </summary>
 </histogram>
 
 <histogram name="NetworkService.IpProtection.OAuthTokenFetchTime" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>djmitche@chromium.org</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
   <summary>
-    Records the elapsed time for successful requests by
-    IpProtectionAuthTokenGetter for an OAuth token.
+    Records the elapsed time for successful requests by IpProtectionConfigGetter
+    for an OAuth token.
   </summary>
 </histogram>
 
@@ -4136,13 +4286,13 @@
   <owner>djmitche@chromium.org</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
   <summary>
-    Records the elapsed time for successful requests by
-    IpProtectionAuthTokenGetter for blind-signed tokens from BSA.
+    Records the elapsed time for successful requests by IpProtectionConfigGetter
+    for blind-signed tokens from BSA.
   </summary>
 </histogram>
 
 <histogram name="NetworkService.IpProtection.TokenExpirationRate"
-    units="tokens" expires_after="2023-12-31">
+    units="tokens" expires_after="2024-03-03">
   <owner>djmitche@chromium.org</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
   <summary>
@@ -4152,7 +4302,7 @@
 </histogram>
 
 <histogram name="NetworkService.IpProtection.TokenSpendRate" units="tokens"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>djmitche@chromium.org</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
   <summary>
@@ -4162,7 +4312,7 @@
 </histogram>
 
 <histogram name="NetworkService.IpProtection.TryGetAuthTokensResult"
-    enum="IpProtectionTokenBatchRequestResult" expires_after="2023-12-31">
+    enum="IpProtectionTokenBatchRequestResult" expires_after="2024-03-03">
   <owner>djmitche@chromium.org</owner>
   <owner>src/chrome/browser/ip_protection/OWNERS</owner>
   <summary>
@@ -4171,6 +4321,60 @@
   </summary>
 </histogram>
 
+<histogram
+    name="NetworkService.MaskedDomainList.NetworkServiceProxyAllowList.EstimatedMemoryUsageInKB"
+    units="KB" expires_after="2023-12-31">
+  <owner>aakallam@chromium.org</owner>
+  <owner>src/chrome/browser/ip_protection/OWNERS</owner>
+  <summary>
+    Records the estimated memory usage of the NetworkServiceProxyAllowList every
+    time the Masked Domain List is updated.
+  </summary>
+</histogram>
+
+<histogram
+    name="NetworkService.MaskedDomainList.NetworkServiceResourceBlockList.EstimatedMemoryUsageInKB"
+    units="KB" expires_after="2023-12-31">
+  <owner>aakallam@chromium.org</owner>
+  <owner>src/chrome/browser/ip_protection/OWNERS</owner>
+  <summary>
+    Records the estimated memory usage of the NetworkServiceResourceBlockList
+    every time the Masked Domain List is updated.
+  </summary>
+</histogram>
+
+<histogram name="NetworkService.MaskedDomainList.SizeInKB" units="KB"
+    expires_after="2023-12-31">
+  <owner>aakallam@chromium.org</owner>
+  <owner>src/chrome/browser/ip_protection/OWNERS</owner>
+  <summary>
+    Record the size of the Masked Domain List proto in KB. Emitted when the raw
+    proto bytes are received from Component Updater and parsed.
+  </summary>
+</histogram>
+
+<histogram name="NetworkService.MaskedDomainList.UpdateProcessTime" units="ms"
+    expires_after="2023-12-31">
+  <owner>aakallam@chromium.org</owner>
+  <owner>src/chrome/browser/ip_protection/OWNERS</owner>
+  <summary>
+    Records the time it takes to update the NetworkServiceProxyAllowList and
+    NetworkServiceResourceBlockList with the contents of the Masked Domain List
+    after the Network Service receives an update from Component Updater.
+  </summary>
+</histogram>
+
+<histogram name="NetworkService.MaskedDomainList.UpdateSuccess"
+    enum="BooleanSuccess" expires_after="2023-12-31">
+  <owner>aakallam@chromium.org</owner>
+  <owner>src/chrome/browser/ip_protection/OWNERS</owner>
+  <summary>
+    Records the result of an attempt to update the NetworkServiceProxyAllowList
+    and NetworkServiceResourceBlockList with the contents of the Masked Domain
+    List when it is received from Component Updater.
+  </summary>
+</histogram>
+
 <histogram name="NetworkService.MdnsResponder.ServiceError"
     enum="MdnsResponderServiceError" expires_after="M81">
   <owner>qingsi@chromium.org</owner>
@@ -4239,7 +4443,7 @@
 </histogram>
 
 <histogram name="NetworkService.TimeToGrantSharedDictionaryAccess" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
index 3e52ffb..eb09e67 100644
--- a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
+++ b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
@@ -67,7 +67,7 @@
 </histogram>
 
 <histogram name="NewTabPage.AsHomeSurface.ShownAtStartup" enum="Boolean"
-    expires_after="2023-10-22">
+    expires_after="2024-02-25">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
@@ -101,7 +101,7 @@
 </histogram>
 
 <histogram name="NewTabPage.BackgroundService.Images.Headers.ErrorDetected"
-    enum="NTPImageType" expires_after="2023-12-10">
+    enum="NTPImageType" expires_after="2024-03-03">
   <owner>pauladedeji@google.com</owner>
   <owner>danpeng@google.com</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -114,7 +114,7 @@
 </histogram>
 
 <histogram name="NewTabPage.BackgroundService.Images.Headers.RequestLatency"
-    units="ms" expires_after="2023-12-10">
+    units="ms" expires_after="2024-03-03">
   <owner>danpeng@google.com</owner>
   <owner>pauladedeji@google.com</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -127,7 +127,7 @@
 </histogram>
 
 <histogram name="NewTabPage.BackgroundService.Images.Headers.StatusCode"
-    units="HttpResponseCode" expires_after="2023-12-10">
+    units="HttpResponseCode" expires_after="2024-03-03">
   <owner>danpeng@google.com</owner>
   <owner>pauladedeji@google.com</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -543,7 +543,7 @@
 </histogram>
 
 <histogram name="NewTabPage.CustomizeShortcutAction"
-    enum="NTPCustomizeShortcutAction" expires_after="2023-12-31">
+    enum="NTPCustomizeShortcutAction" expires_after="2024-03-03">
   <owner>tiborg@chromium.org</owner>
   <owner>yyushkina@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/notifications/histograms.xml b/tools/metrics/histograms/metadata/notifications/histograms.xml
index 4934752..eb63b9c 100644
--- a/tools/metrics/histograms/metadata/notifications/histograms.xml
+++ b/tools/metrics/histograms/metadata/notifications/histograms.xml
@@ -127,7 +127,7 @@
 </histogram>
 
 <histogram name="Notifications.Android.SitesChannel" enum="BooleanUsage"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>peter@chromium.org</owner>
   <summary>
     Recorded when the Sites channel (which we hope to deprecate) is used as a
@@ -503,23 +503,29 @@
 </histogram>
 
 <histogram name="Notifications.macOS.ServiceProcessKilled" units="ms"
-    expires_after="2022-08-07">
+    expires_after="2024-08-07">
   <owner>knollr@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The runtime of the macOS notification service process to display alerts
     before it got killed unexpectedly. Logged when the service process dies.
+
+    This histogram was expired between 2022-08-07 and 2023-09-06. Data might be
+    missing or incomplete for this period.
   </summary>
 </histogram>
 
 <histogram name="Notifications.macOS.ServiceProcessRuntime" units="ms"
-    expires_after="2022-08-14">
+    expires_after="2024-08-14">
   <owner>knollr@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The runtime of the macOS notification service process to display alerts.
     Logged when we close the connection to the service process either on purpose
     or after it got killed unexpectedly.
+
+    This histogram was expired between 2022-08-14 and 2023-09-06. Data might be
+    missing or incomplete for this period.
   </summary>
 </histogram>
 
@@ -536,8 +542,9 @@
 </histogram>
 
 <histogram name="Notifications.NotificationHelper.ComServerModuleStatus"
-    enum="NotificationHelperComServerModuleStatus" expires_after="2023-11-12">
+    enum="NotificationHelperComServerModuleStatus" expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
+  <owner>peter@chromium.org</owner>
   <summary>
     The execute status of a ComServerModule class instance. Logged whenever a
     notification_helper process is launched by Windows. Note: Not logged after
@@ -548,39 +555,43 @@
 <histogram
     name="Notifications.NotificationHelper.NotificationActivatorPrimaryStatus"
     enum="NotificationHelperNotificationActivatorPrimaryStatus"
-    expires_after="2023-09-01">
-  <owner>chengx@chromium.org</owner>
+    expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
+  <owner>peter@chromium.org</owner>
   <summary>
     The primary execute status of NotificationActivator::Activate. Logged
     whenever a notification_helper process is launched by Windows. Note: Not
-    logged after M85 until end of August 2022.
+    logged after M85 until end of August 2022, and also not at the beginning of
+    Sept 2023.
   </summary>
 </histogram>
 
 <histogram
     name="Notifications.NotificationHelper.NotificationActivatorSecondaryStatus"
     enum="NotificationHelperNotificationActivatorSecondaryStatus"
-    expires_after="2023-09-01">
-  <owner>chengx@chromium.org</owner>
+    expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
+  <owner>peter@chromium.org</owner>
   <summary>
     The secondary execute status of NotificationActivator::Activate. Logged
     whenever a notification_helper process is launched by Windows. Note: Not
-    logged after M85 until end of August 2022.
+    logged after M85 until end of August 2022, and also not at the beginning of
+    Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.NotificationHelper.ServerRuntime" units="ms"
-    expires_after="2023-09-01">
+    expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
+  <owner>peter@chromium.org</owner>
   <summary>
     The runtime of the notification_helper server process. This process is
     created when a notification is activated from the Windows Action Center.
     Once created, this process does some COM class registration work, so that
     Windows can call certain APIs to handle the notification activation. Upon
     finishing the API calls, Windows signals this process to exit. Note: Not
-    logged after M87 until end of August 2022.
+    logged after M87 until end of August 2022, and also not at the beginning of
+    Sept 2023.
   </summary>
 </histogram>
 
@@ -897,10 +908,9 @@
 </histogram>
 
 <histogram name="Notifications.Windows.ActivationStatus"
-    enum="WindowsNotificationActivationStatus" expires_after="2024-01-14">
+    enum="WindowsNotificationActivationStatus" expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
-  <owner>chengx@chromium.org</owner>
   <summary>
     The status of Activation requests in NotificationPlatformBridgeWin (Windows
     only). Logged whenever an activation from a notification occurs. Note: Not
@@ -909,18 +919,18 @@
 </histogram>
 
 <histogram name="Notifications.Windows.CloseStatus"
-    enum="WindowsNotificationCloseStatus" expires_after="2023-09-01">
+    enum="WindowsNotificationCloseStatus" expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The status of Close requests in NotificationPlatformBridgeWin (Windows
     only). Logged whenever a notification is closed. Note: Not logged after M98
-    until end of August 2022.
+    until end of August 2022, and also not at the beginning of Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.CreateToastManagerErrorCode"
-    enum="Hresult" expires_after="2023-09-01">
+    enum="Hresult" expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -928,22 +938,22 @@
     toast manager fails. This provides a more detailed error in the cases the
     histogram Notifications.Windows.DisplayStatus reported
     CREATE_TOAST_NOTIFIER_WITH_ID_FAILED. Note: Not logged after M89 until end
-    of August 2022.
+    of August 2022, and also not at the beginning of Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.DisplayFailure" enum="Hresult"
-    expires_after="2023-09-01">
+    expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The HRESULT returned by the Windows Action Center, when showing a
-    notification fails.
+    notification fails. Note: Not logged at the beginning of Sept 2023
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.DisplayStatus"
-    enum="WindowsNotificationDisplayStatus" expires_after="2024-01-14">
+    enum="WindowsNotificationDisplayStatus" expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -958,163 +968,169 @@
 
 <histogram name="Notifications.Windows.GetDisplayedLaunchIdStatus"
     enum="WindowsNotificationGetDisplayedLaunchIdStatus"
-    expires_after="2023-09-01">
+    expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The status of decoding launch ids while processing a GetDisplayed requests
     in NotificationPlatformBridgeWin (Windows only). Logged whenever a request
     to retrieve all displayed notifications comes in. Note: Not logged after M98
-    until end of August 2022.
+    until end of August 2022, and also not at the beginning of Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.GetDisplayedStatus"
-    enum="WindowsNotificationGetDisplayedStatus" expires_after="2023-09-01">
+    enum="WindowsNotificationGetDisplayedStatus" expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The status of GetDisplayedStatus requests in NotificationPlatformBridgeWin
     (Windows only). Logged whenever a request to retrieve all displayed
-    notifications comes in. Note: Not logged after M98 until end of August 2022.
+    notifications comes in. Note: Not logged after M98 until end of August 2022,
+    and also not at the beginning of Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.GetNotificationLaunchIdStatus"
     enum="WindowsNotificationGetNotificationLaunchIdStatus"
-    expires_after="2023-09-01">
+    expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The status of GetNotificationLaunchId requests in
     NotificationPlatformBridgeWin (Windows only). Logged whenever a request to
     decode the GetNotificationLaunchId comes in. Note: Not logged between
-    January 2022 until end of August 2022.
+    January 2022 until end of August 2022, and also not at the beginning of Sept
+    2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.GetSettingPolicy"
-    enum="WindowsNotificationGetSettingPolicy" expires_after="2023-09-01">
+    enum="WindowsNotificationGetSettingPolicy" expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The policy value provided by get_Setting in NotificationPlatformBridgeWin
     (Windows only). Logged whenever a request to show a notification comes in.
-    Note: Not logged after M98 until end of August 2022.
+    Note: Not logged after M98 until end of August 2022, and not at the
+    beginning of Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.GetSettingPolicyStartup"
-    enum="WindowsNotificationGetSettingPolicy" expires_after="2023-09-01">
+    enum="WindowsNotificationGetSettingPolicy" expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
-  <owner>knollr@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The policy value provided by get_Setting in NotificationPlatformBridgeWin
-    (Windows only). Logged only once at startup on a task runner.
+    (Windows only). Logged only once at startup on a task runner. Note: Not
+    logged at the beginning of Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.GetSettingStatus"
-    enum="WindowsNotificationGetSettingStatus" expires_after="2023-09-01">
+    enum="WindowsNotificationGetSettingStatus" expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The return value of get_Setting calls in NotificationPlatformBridgeWin
     (Windows only). Logged whenever a request to show a notification comes in.
+    Note: Not logged at the beginning of Sept 2023
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.GetSettingStatusStartup"
-    enum="WindowsNotificationGetSettingStatus" expires_after="2023-09-01">
+    enum="WindowsNotificationGetSettingStatus" expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
-  <owner>knollr@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The return value of get_Setting calls in NotificationPlatformBridgeWin
-    (Windows only). Logged only once at startup on a task runner.
+    (Windows only). Logged only once at startup on a task runner. Note: Not
+    logged at the beginning of Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.HandleEventStatus"
-    enum="WindowsNotificationHandleEventStatus" expires_after="2023-09-01">
+    enum="WindowsNotificationHandleEventStatus" expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The status of HandleEvent requests in NotificationPlatformBridgeWin (Windows
     only). Logged whenever a notification event is being handled. Note: Not
-    logged between January 2022 and end of August 2022.
+    logged between January 2022 and end of August 2022, and not at the beginning
+    of Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.HistoryStatus"
-    enum="WindowsNotificationHistoryStatus" expires_after="2023-09-01">
+    enum="WindowsNotificationHistoryStatus" expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The status of History requests in NotificationPlatformBridgeWin (Windows
     only). Logged whenever history is requested for notifications. Note: Not
-    logged after M98 until end of August 2022.
+    logged after M98 until end of August 2022, and also not at the beginning of
+    Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.LaunchIdDecodeStatus"
-    enum="WindowsNotificationLaunchIdDecodeStatus" expires_after="2023-09-01">
-  <owner>chengx@chromium.org</owner>
+    enum="WindowsNotificationLaunchIdDecodeStatus" expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
+  <owner>peter@chromium.org</owner>
   <summary>
     Used to indicate the status of decoding an input launch id string (Windows
     only). Logged whenever a notification event is being handled. Note: Not
-    logged after M87 until end of August 2022.
+    logged after M87 until end of August 2022, and also not at the beginning of
+    Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.OnFailedStatus"
-    enum="WindowsNotificationOnFailedStatus" expires_after="2023-09-01">
+    enum="WindowsNotificationOnFailedStatus" expires_after="2024-09-01">
   <owner>chengx@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The status of OnFailed requests in NotificationPlatformBridgeWin (Windows
     only). Logged whenever a failed event is handled. Note: Not logged after M98
-    until end of August 2022.
+    until end of August 2022, and also not at the beginning of Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.SetReadyCallbackStatus2"
     enum="WindowsNotificationSetReadyCallbackStatus2"
-    expires_after="2023-09-01">
-  <owner>chengx@chromium.org</owner>
+    expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The status of SetReadyCallback requests in NotificationPlatformBridgeWin
     (Windows only). Logged once at startup. Note: Not logged after M98 until end
-    of August 2022.
+    of August 2022, and also not at the beginning of Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.ShowFailedErrorCode" enum="Hresult"
-    expires_after="2023-09-01">
+    expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     The HRESULT returned by the Windows Action Center, when trying to create a
     toast manager fails. This provides a more detailed error in the cases the
     histogram Notifications.Windows.DisplayStatus reported SHOWING_TOAST_FAILED.
-    Note: Not logged after M98 until end of August 2022.
+    Note: Not logged after M98 until end of August 2022, and not at the
+    beginning of Sept 2023.
   </summary>
 </histogram>
 
 <histogram name="Notifications.Windows.StartMenuShortcutStatus"
     enum="WindowsNotificationStartMenuShortcutStatus"
-    expires_after="2023-09-01">
-  <owner>chengx@chromium.org</owner>
+    expires_after="2024-09-01">
   <owner>finnur@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     Used to indicate the status of start menu shortcut (Windows only). Logged
     whenever a notification display attempt is made. Note: Not logged after M98
-    until end of August 2022.
+    until end of August 2022, and also not at the beginning of Sept 2023.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml
index 0ad9fda..0f519bb2 100644
--- a/tools/metrics/histograms/metadata/omnibox/histograms.xml
+++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -456,6 +456,16 @@
   </summary>
 </histogram>
 
+<histogram name="Omnibox.CalculateVisibleHint.Duration" units="ms"
+    expires_after="2024-02-25">
+  <owner>peilinwang@google.com</owner>
+  <owner>woa-performance-bugs+jank@google.com</owner>
+  <summary>
+    Measures the amount of time it takes to call UrlBar.calculateVisibleHint().
+    Recorded once per call.
+  </summary>
+</histogram>
+
 <histogram name="Omnibox.CharTypedToRepaintLatency" units="ms"
     expires_after="2024-02-01">
   <owner>jdonnelly@chromium.org</owner>
@@ -1309,6 +1319,16 @@
       variants="OmniboxAutocompleteUpdateSlice"/>
 </histogram>
 
+<histogram name="Omnibox.NumberOfVisibleCharacters" units="characters"
+    expires_after="2023-12-24">
+  <owner>peilinwang@google.com</owner>
+  <owner>woa-performance-bugs+jank@google.com</owner>
+  <summary>
+    Records the number of characters visible in the omnibox. Recorded once per
+    call to UrlBar.calculateVisibleHint().
+  </summary>
+</histogram>
+
 <histogram name="Omnibox.NumTypedTerms" units="terms"
     expires_after="2024-02-25">
   <owner>jdonnelly@chromium.org</owner>
@@ -1581,6 +1601,32 @@
   </summary>
 </histogram>
 
+<histogram name="Omnibox.Search.CtrlEnter.ResolvedAsUrl" enum="Boolean"
+    expires_after="2024-04-01">
+  <owner>ender@google.com</owner>
+  <owner>chrome-search@google.com</owner>
+  <summary>
+    Whenever Ctrl+Enter is used to complete an interaction with the Omnibox,
+    this metric captures whether the keystroke was used to initiate navigation
+    to a website (by affixing &quot;.com&quot;) or execute a search query (if
+    affixing &quot;.com&quot; would not produce a valid URL).
+
+    Recorded each time Ctrl+Enter is used to complete an interaction.
+  </summary>
+</histogram>
+
+<histogram name="Omnibox.Search.CtrlEnter.Used" enum="BooleanUsage"
+    expires_after="2024-04-01">
+  <owner>ender@google.com</owner>
+  <owner>chrome-search@google.com</owner>
+  <summary>
+    Whether Ctrl+Enter key combination was used to complete an interaction with
+    the Omnibox.
+
+    Recorded each time user accepts Omnibox text via Keyboard.
+  </summary>
+</histogram>
+
 <histogram name="Omnibox.Search.OffTheRecord" enum="BooleanOffTheRecord"
     expires_after="2024-02-01">
   <owner>jdonnelly@chromium.org</owner>
@@ -1704,6 +1750,16 @@
   </summary>
 </histogram>
 
+<histogram name="Omnibox.SetText.TextLength" units="characters"
+    expires_after="2023-12-24">
+  <owner>peilinwang@google.com</owner>
+  <owner>woa-performance-bugs+jank@google.com</owner>
+  <summary>
+    Records the length of the text to set when calling UrlBar.setText().
+    Recorded once per call to setText().
+  </summary>
+</histogram>
+
 <histogram name="Omnibox.setText.TruncatedTooMuch" units="boolean"
     expires_after="2023-12-24">
   <owner>peilinwang@google.com</owner>
@@ -2241,7 +2297,7 @@
 
 <histogram
     name="Omnibox.SuggestionUsed.URL.NavigationToLargestContentfulPaint2.1"
-    units="ms" expires_after="2023-09-03">
+    units="ms" expires_after="2024-09-03">
   <owner>robertlin@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <owner>chrome-omnibox-team@google.com</owner>
@@ -2497,6 +2553,19 @@
   </summary>
 </histogram>
 
+<histogram name="Omnibox.Views.PopupFirstPaint" units="ms"
+    expires_after="2024-08-01">
+  <owner>tluk@chromium.org</owner>
+  <owner>chrome-desktop-search@google.com</owner>
+  <summary>
+    Records the number of milliseconds between the views omnibox popup
+    construction and the first time content for the popup is displayed on the
+    screen. This is emitted once each time the omnibox is opened. It is recorded
+    again if the omnibox has closed and later re-opened. It is not emitted more
+    than once for a single opened instance of the ombibox popup.
+  </summary>
+</histogram>
+
 <histogram name="Omnibox.WebUI.FirstUpdate" units="ms"
     expires_after="2024-08-01">
   <owner>orinj@chromium.org</owner>
@@ -2507,30 +2576,22 @@
     long the popup existed before first use. Since the webui begins the
     asynchronous process of initialization and remote binding immediately on
     construction, this metric can be seen as a time budget for handler
-    preparation. See also Omnibox.WebUI.HandlerReady.
+    preparation. See also Omnibox.WebUI.HandlerReadyOnFirstAccess.
   </summary>
 </histogram>
 
-<histogram name="Omnibox.WebUI.HandlerReady" enum="Boolean"
+<histogram name="Omnibox.WebUI.HandlerReadyOnFirstAccess" enum="Boolean"
     expires_after="2024-08-01">
   <owner>orinj@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
-    Records the ready state of the webui handler when first waiting for it to
-    initialize. This is expected to be true in nearly all cases, but when this
-    is false, Omnibox.WebUI.HandlerWait will be recorded to measure wait
-    duration. See also Omnibox.WebUI.FirstUpdate.
-  </summary>
-</histogram>
-
-<histogram name="Omnibox.WebUI.HandlerWait" units="ms"
-    expires_after="2024-08-01">
-  <owner>orinj@chromium.org</owner>
-  <owner>chrome-desktop-search@google.com</owner>
-  <summary>
-    Records the number of milliseconds spent waiting for the webui handler to
-    fully initialize. This wait duration is recorded only when
-    Omnibox.WebUI.HandlerReady records false.
+    Records the ready state of the webui handler when first accessed. When this
+    is true, the page loaded and the handler was ready on time. When this is
+    false, it indicates that OmniboxPopupPresenter::GetHandler returned nullptr
+    at least once because the page wasn't loaded before the first attempt to
+    communicate via the handler. Recorded once per omnibox popup presenter
+    instantiation, when the webui omnibox popup page handler is first used; so,
+    at most once per browser window.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/oobe/histograms.xml b/tools/metrics/histograms/metadata/oobe/histograms.xml
index dbade8d..ccbb15f 100644
--- a/tools/metrics/histograms/metadata/oobe/histograms.xml
+++ b/tools/metrics/histograms/metadata/oobe/histograms.xml
@@ -308,7 +308,7 @@
 </histogram>
 
 <histogram name="OOBE.BootToOOBECompleted.{CompletedOobeFlowType}" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>osamafathy@chromium.org</owner>
   <owner>cros-oobe@google.com</owner>
   <summary>
@@ -323,7 +323,7 @@
 </histogram>
 
 <histogram name="OOBE.BootToSignInCompleted" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>alemate@chromium.org</owner>
   <owner>rsorokin@chromium.org</owner>
   <owner>cros-oac@google.com</owner>
@@ -386,7 +386,7 @@
 </histogram>
 
 <histogram name="OOBE.ConsolidatedConsentScreen.RecoveryOptInResult"
-    enum="RecoveryOptInResult" expires_after="2023-12-31">
+    enum="RecoveryOptInResult" expires_after="2024-03-03">
   <owner>anastasiian@chromium.org</owner>
   <owner>cros-lurs@google.com</owner>
   <owner>cros-oobe@google.com</owner>
@@ -397,7 +397,7 @@
 </histogram>
 
 <histogram name="OOBE.ConsolidatedConsentScreen.UserActions"
-    enum="ConsolidatedConsentScreenUserAction" expires_after="2023-12-31">
+    enum="ConsolidatedConsentScreenUserAction" expires_after="2024-03-03">
   <owner>osamafathy@google.com</owner>
   <owner>cros-oobe@google.com</owner>
   <summary>
@@ -461,7 +461,7 @@
 </histogram>
 
 <histogram name="OOBE.Enrollment.IsUserEnrollingAConsumer" enum="Boolean"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>osamafathy@google.com</owner>
   <owner>cros-oobe@google.com</owner>
   <summary>
@@ -486,7 +486,7 @@
 </histogram>
 
 <histogram name="OOBE.FingerprintSetupScreen.UserActions"
-    enum="FingerprintSetupScreenUserAction" expires_after="2023-12-31">
+    enum="FingerprintSetupScreenUserAction" expires_after="2024-03-03">
   <owner>dkuzmin@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -495,7 +495,7 @@
   </summary>
 </histogram>
 
-<histogram name="OOBE.GaiaLoginTime" units="ms" expires_after="2023-12-31">
+<histogram name="OOBE.GaiaLoginTime" units="ms" expires_after="2024-03-03">
   <owner>dkuzmin@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -506,7 +506,7 @@
 </histogram>
 
 <histogram name="OOBE.GaiaPasswordChangedScreen.UserActions"
-    enum="GaiaPasswordChangedScreenUserAction" expires_after="2023-12-31">
+    enum="GaiaPasswordChangedScreenUserAction" expires_after="2024-03-03">
   <owner>dkuzmin@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -516,7 +516,7 @@
 </histogram>
 
 <histogram name="OOBE.GaiaScreen.LoginRequests" enum="GaiaLoginVariant"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>dkuzmin@google.com</owner>
   <owner>rsorokin@google.com</owner>
   <owner>cros-oobe@google.com</owner>
@@ -531,7 +531,7 @@
 </histogram>
 
 <histogram name="OOBE.GaiaScreen.PasswordIgnoredChars" enum="Boolean"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>anastasiian@chromium.org</owner>
   <owner>cros-lurs@google.com</owner>
   <summary>
@@ -541,7 +541,7 @@
 </histogram>
 
 <histogram name="OOBE.GaiaScreen.SuccessLoginRequests" enum="GaiaLoginVariant"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>dkuzmin@google.com</owner>
   <owner>rsorokin@google.com</owner>
   <owner>cros-oobe@google.com</owner>
@@ -612,7 +612,7 @@
 </histogram>
 
 <histogram name="OOBE.HidDetectionScreen.BluetoothPairingAttempts"
-    units="attempts" expires_after="2024-01-07">
+    units="attempts" expires_after="2024-03-10">
   <owner>gordonseto@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -648,7 +648,7 @@
 </histogram>
 
 <histogram name="OOBE.HidDetectionScreen.InitialHidsMissing" enum="HidsMissing"
-    expires_after="2023-12-31">
+    expires_after="2024-03-10">
   <owner>gordonseto@google.com</owner>
   <owner>cros-connectivity@google.com</owner>
   <summary>
@@ -684,7 +684,7 @@
 </histogram>
 
 <histogram name="OOBE.MarketingOptInScreen.GeolocationResolve"
-    enum="MarketingOptInGeolocationEvent" expires_after="2023-12-31">
+    enum="MarketingOptInGeolocationEvent" expires_after="2024-03-10">
   <owner>rrsilva@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -705,7 +705,7 @@
 </histogram>
 
 <histogram name="OOBE.PinSetupScreen.UserActions"
-    enum="PinSetupScreenUserAction" expires_after="2023-12-31">
+    enum="PinSetupScreenUserAction" expires_after="2024-03-03">
   <owner>dkuzmin@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -731,7 +731,7 @@
 </histogram>
 
 <histogram name="OOBE.RecommendApps.Screen.Action"
-    enum="RecommendAppsScreenAction" expires_after="2023-12-31">
+    enum="RecommendAppsScreenAction" expires_after="2024-03-03">
   <owner>dkuzmin@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <owner>chromesky-eng@google.com</owner>
@@ -739,7 +739,7 @@
 </histogram>
 
 <histogram name="OOBE.RecommendApps.Screen.SelectedAppCount" units="apps"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>dkuzmin@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <owner>chromesky-eng@google.com</owner>
@@ -755,7 +755,7 @@
 </histogram>
 
 <histogram name="OOBE.RecommendApps.Screen.State"
-    enum="RecommendAppsScreenState" expires_after="2023-12-31">
+    enum="RecommendAppsScreenState" expires_after="2024-03-03">
   <owner>dkuzmin@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <owner>chromesky-eng@google.com</owner>
@@ -784,7 +784,7 @@
 </histogram>
 
 <histogram name="OOBE.StepShownStatus.Multidevice-setup-screen.Skipped"
-    enum="OobeMultideviceScreenSkippedReason" expires_after="2023-12-31">
+    enum="OobeMultideviceScreenSkippedReason" expires_after="2024-03-03">
   <owner>bhartmire@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -809,7 +809,7 @@
 </histogram>
 
 <histogram name="OOBE.SyncConsentScreen.Behavior" enum="SyncConsentBehavior"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>osamafathy@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -821,7 +821,7 @@
 </histogram>
 
 <histogram name="OOBE.SyncConsentScreen.IsCapabilityKnown" enum="BooleanKnown"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>osamafathy@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -831,7 +831,7 @@
 </histogram>
 
 <histogram name="OOBE.SyncConsentScreen.IsMinorUser" enum="Boolean"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>osamafathy@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -868,7 +868,7 @@
 </histogram>
 
 <histogram name="OOBE.SyncConsentScreen.LoadingTime" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>osamafathy@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -878,7 +878,7 @@
 </histogram>
 
 <histogram name="OOBE.SyncConsentScreen.ReviewFollowingSetup"
-    enum="BooleanChecked" expires_after="2023-12-31">
+    enum="BooleanChecked" expires_after="2024-03-03">
   <owner>dkuzmin@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -888,7 +888,7 @@
 </histogram>
 
 <histogram name="OOBE.SyncConsentScreen.SyncEnabled" enum="BooleanEnabled"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>osamafathy@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -899,7 +899,7 @@
 </histogram>
 
 <histogram name="OOBE.SyncConsentScreen.UserChoice"
-    enum="SyncConsentUserChoice" expires_after="2023-12-31">
+    enum="SyncConsentUserChoice" expires_after="2024-03-03">
   <owner>osamafathy@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -941,7 +941,7 @@
 </histogram>
 
 <histogram name="OOBE.WebUI.LoadTime.FirstRun" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>rsorokin@chromium.org</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -972,7 +972,7 @@
 </histogram>
 
 <histogram name="OOBE.WelcomeScreen.A11yUserActions"
-    enum="WelcomeScreenA11yUserAction" expires_after="2023-12-31">
+    enum="WelcomeScreenA11yUserAction" expires_after="2024-03-03">
   <owner>dkuzmin@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -983,7 +983,7 @@
 </histogram>
 
 <histogram name="OOBE.WelcomeScreen.AcceptChromeVoxHint" enum="BooleanEnabled"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>akihiroota@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -993,7 +993,7 @@
 </histogram>
 
 <histogram name="OOBE.WelcomeScreen.ChromeVoxHintSpokenSuccess"
-    enum="BooleanEnabled" expires_after="2023-12-31">
+    enum="BooleanEnabled" expires_after="2024-03-03">
   <owner>akihiroota@google.com</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -1006,7 +1006,7 @@
 </histogram>
 
 <histogram name="OOBE.WelcomeScreen.UserChangedLocale" enum="Boolean"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>bohdanty@google.com</owner>
   <owner>cros-oobe@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml
index b8d4950..34ad34d 100644
--- a/tools/metrics/histograms/metadata/optimization/histograms.xml
+++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -133,6 +133,9 @@
       summary="Validates metadata fetch on navigation"/>
   <variant name="PageEntities"
       summary="Provides the entities that are present on the page"/>
+  <variant name="PageInsights"
+      summary="This optimization provides helpful context and insights about
+               a page."/>
   <variant name="PerformanceHints"
       summary="Provides aggregated performance information about the page"/>
   <variant name="PriceInsights"
@@ -187,8 +190,18 @@
   <variant name="PageNavigation" summary="Page navigation"/>
 </variants>
 
+<histogram name="OptimizationGuide.AccessTokenHelper.Result"
+    enum="OptimizationGuideAccessTokenResult" expires_after="M121">
+  <owner>rajendrant@chromium.org</owner>
+  <owner>sophiechang@google.com</owner>
+  <summary>
+    Records the result of an OAuth access token request. Recorded every time a
+    request was made for allowed request contexts for on-demand hints.
+  </summary>
+</histogram>
+
 <histogram name="OptimizationGuide.ApplyDecision.{OptimizationType}"
-    enum="OptimizationGuideOptimizationTypeDecision" expires_after="M121">
+    enum="OptimizationGuideOptimizationTypeDecision" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -233,7 +246,7 @@
 </histogram>
 
 <histogram name="OptimizationGuide.HintCache.HintType.Loaded"
-    enum="HintCacheStoreEntryType" expires_after="M121">
+    enum="HintCacheStoreEntryType" expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -265,7 +278,12 @@
 
 <histogram
     name="OptimizationGuide.HintsFetcher.GetHintsRequest.ActiveRequestCanceled.{RequestContext}"
-    units="counts" expires_after="M121">
+    units="counts" expires_after="2024-03-10">
+  <obsolete>
+    Recorded as RequestCanceled in
+    OptimizationGuide.HintsFetcher.GetHintsRequest.RequestStatus.* as of
+    2023-09-14.
+  </obsolete>
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -303,7 +321,7 @@
 
 <histogram
     name="OptimizationGuide.HintsFetcher.GetHintsRequest.FetchLatency.{RequestContext}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -344,6 +362,19 @@
   </summary>
 </histogram>
 
+<histogram
+    name="OptimizationGuide.HintsFetcher.GetHintsRequest.RequestStatus.{RequestContext}"
+    enum="OptimizationGuideFetcherRequestStatus" expires_after="2024-03-10">
+  <owner>mcrouse@chromium.org</owner>
+  <owner>sophiechang@chromium.org</owner>
+  <summary>
+    The status of making a request using {RequestContext} of the
+    OptmizationGuide HintsFetcher. This includes whether a network request was
+    actually sent or not.
+  </summary>
+  <token key="RequestContext" variants="RequestContext"/>
+</histogram>
+
 <histogram name="OptimizationGuide.HintsFetcher.GetHintsRequest.Status"
     enum="HttpResponseCode" expires_after="2024-02-11">
   <owner>mcrouse@chromium.org</owner>
@@ -365,7 +396,11 @@
 </histogram>
 
 <histogram name="OptimizationGuide.HintsFetcher.RequestStatus.{RequestContext}"
-    enum="OptimizationGuideHintsFetcherRequestStatus" expires_after="M121">
+    enum="OptimizationGuideFetcherRequestStatus" expires_after="2024-03-10">
+  <obsolete>
+    Renamed to OptimizationGuide.HintsFetcher.GetHintsRequest.RequestStatus.* as
+    of 2023-09-14.
+  </obsolete>
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -377,7 +412,7 @@
 </histogram>
 
 <histogram name="OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor"
-    units="counts" expires_after="M121">
+    units="counts" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -389,7 +424,7 @@
 </histogram>
 
 <histogram name="OptimizationGuide.HintsManager.ConcurrentBatchUpdateFetches"
-    units="counts" expires_after="M121">
+    units="counts" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -437,7 +472,7 @@
 </histogram>
 
 <histogram name="OptimizationGuide.IsPredictionModelValid.{OptimizationTarget}"
-    enum="BooleanValid" expires_after="M121">
+    enum="BooleanValid" expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -460,7 +495,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecutor.DidTimeout.{OptimizationTarget}"
-    enum="Boolean" expires_after="M121">
+    enum="Boolean" expires_after="2024-03-10">
   <owner>robertogden@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -473,7 +508,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecutor.ExecutionLatency.{OptimizationTarget}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -487,7 +522,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecutor.ExecutionStatus.{OptimizationTarget}"
-    enum="OptimizationGuideExecutionStatus" expires_after="M121">
+    enum="OptimizationGuideExecutionStatus" expires_after="2024-03-10">
   <owner>robertogden@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -501,7 +536,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecutor.ExecutionThreadTime.{OptimizationTarget}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -517,7 +552,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecutor.ExecutionThreadTimeMicroseconds.{OptimizationTarget}"
-    units="microseconds" expires_after="M121">
+    units="microseconds" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -531,7 +566,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecutor.ModelAvailableToLoad.{OptimizationTarget}"
-    enum="BooleanAvailable" expires_after="M121">
+    enum="BooleanAvailable" expires_after="2024-03-10">
   <owner>robertogden@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -548,7 +583,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecutor.ModelLoadingDuration2.{OptimizationTarget}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>robertogden@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -561,7 +596,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecutor.TaskExecutionLatency.{OptimizationTarget}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -579,7 +614,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecutor.TaskSchedulingLatency.{OptimizationTarget}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>robertogden@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -605,7 +640,7 @@
 </histogram>
 
 <histogram name="OptimizationGuide.ModelFilesVerified.{OptimizationTarget}"
-    enum="BooleanValid" expires_after="M121">
+    enum="BooleanValid" expires_after="2024-03-10">
   <owner>robertogden@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -620,7 +655,7 @@
 
 <histogram
     name="OptimizationGuide.ModelHandler.HandlerCreated.{OptimizationTarget}"
-    enum="BooleanCreated" expires_after="M121">
+    enum="BooleanCreated" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -633,7 +668,7 @@
 
 <histogram
     name="OptimizationGuide.ModelHandler.HandlerCreatedToModelAvailable.{OptimizationTarget}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -645,7 +680,7 @@
 </histogram>
 
 <histogram name="OptimizationGuide.OptimizationFilterStatus.{OptimizationType}"
-    enum="OptimizationGuideOptimizationFilterStatus" expires_after="M121">
+    enum="OptimizationGuideOptimizationFilterStatus" expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -657,7 +692,7 @@
 </histogram>
 
 <histogram name="OptimizationGuide.OptimizationHintsComponent.MajorVersion"
-    units="major version number" expires_after="M121">
+    units="major version number" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -693,7 +728,7 @@
 
 <histogram
     name="OptimizationGuide.PageContentAnnotations.BatchSuccess.{AnnotationType}"
-    enum="BooleanSuccess" expires_after="M121">
+    enum="BooleanSuccess" expires_after="2024-03-10">
   <owner>robertogden@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -731,7 +766,7 @@
 
 <histogram
     name="OptimizationGuide.PageContentAnnotations.JobExecutionTime.{AnnotationType}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>robertogden@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -743,7 +778,7 @@
 
 <histogram
     name="OptimizationGuide.PageContentAnnotations.JobScheduleTime.{AnnotationType}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>robertogden@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -842,7 +877,7 @@
 <histogram
     name="OptimizationGuide.PageContentAnnotationsService.ContentAnnotationsStorageStatus.{PageContentAnnotationsStorageType}"
     enum="OptimizationGuidePageContentAnnotationsStorageStatus"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -1144,7 +1179,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionManager.IsDownloadUrlValid.{OptimizationTarget}"
-    enum="BooleanValid" expires_after="M121">
+    enum="BooleanValid" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -1156,7 +1191,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionManager.ModelAvailableAtRegistration.{OptimizationTarget}"
-    enum="BooleanAvailable" expires_after="M121">
+    enum="BooleanAvailable" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -1170,7 +1205,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionManager.ModelDeliveryEvents.{OptimizationTarget}"
-    enum="OptimizationGuideModelDeliveryEvent" expires_after="M121">
+    enum="OptimizationGuideModelDeliveryEvent" expires_after="2024-03-10">
   <owner>rajendrant@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -1200,7 +1235,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionManager.RegistrationTimeSinceServiceInit.{OptimizationTarget}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>rajendrant@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -1214,7 +1249,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelDownloadManager.DownloadStartLatency.{OptimizationTarget}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>rajendrant@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -1228,7 +1263,8 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelDownloadManager.DownloadStatus"
-    enum="OptimizationGuidePredictionModelDownloadStatus" expires_after="M121">
+    enum="OptimizationGuidePredictionModelDownloadStatus"
+    expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -1239,7 +1275,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelDownloadManager.DownloadSucceeded"
-    enum="BooleanSuccess" expires_after="M121">
+    enum="BooleanSuccess" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
   <summary>
@@ -1264,7 +1300,8 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelDownloadManager.State.{OptimizationTarget}"
-    enum="OptimizationGuidePredictionModelDownloadState" expires_after="M121">
+    enum="OptimizationGuidePredictionModelDownloadState"
+    expires_after="2024-03-10">
   <owner>rajendrant@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -1275,7 +1312,7 @@
 </histogram>
 
 <histogram name="OptimizationGuide.PredictionModelExpired.{OptimizationTarget}"
-    enum="BooleanExpired" expires_after="M121">
+    enum="BooleanExpired" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -1289,7 +1326,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelExpiredVersion.{OptimizationTarget}"
-    units="version number" expires_after="M121">
+    units="version number" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>chrome-intelligence-core@google.com</owner>
   <summary>
@@ -1317,7 +1354,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelFetcher.GetModelsResponse.NetErrorCode.{OptimizationTarget}"
-    enum="NetErrorCodes" expires_after="M121">
+    enum="NetErrorCodes" expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -1347,7 +1384,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelFetcher.GetModelsResponse.Status.{OptimizationTarget}"
-    enum="HttpResponseCode" expires_after="M121">
+    enum="HttpResponseCode" expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -1363,7 +1400,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelLoadedVersion.{OptimizationTarget}"
-    units="version number" expires_after="M121">
+    units="version number" expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -1375,7 +1412,7 @@
 </histogram>
 
 <histogram name="OptimizationGuide.PredictionModelRemoved.{OptimizationTarget}"
-    enum="Boolean" expires_after="M121">
+    enum="Boolean" expires_after="2024-03-10">
   <owner>rajendrant@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -1401,7 +1438,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelStore.ModelCount.{OptimizationTarget}"
-    units="counts" expires_after="M121">
+    units="counts" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>rajendrant@chromium.org</owner>
   <summary>
@@ -1413,7 +1450,7 @@
 
 <histogram name="OptimizationGuide.PredictionModelStore.ModelRemovalReason"
     enum="OptimizationGuidePredictionModelStoreModelRemovalReason"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>rajendrant@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -1425,7 +1462,7 @@
 <histogram
     name="OptimizationGuide.PredictionModelStore.ModelRemovalReason.{OptimizationTarget}"
     enum="OptimizationGuidePredictionModelStoreModelRemovalReason"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>rajendrant@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -1437,7 +1474,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelStore.TotalDirectorySize.{OptimizationTarget}"
-    units="MB" expires_after="M121">
+    units="MB" expires_after="2024-03-10">
   <owner>sophiechang@chromium.org</owner>
   <owner>rajendrant@chromium.org</owner>
   <summary>
@@ -1449,7 +1486,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelUpdateVersion.{OptimizationTarget}"
-    units="version number" expires_after="M121">
+    units="version number" expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -1461,7 +1498,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelValidationLatency.{OptimizationTarget}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>mcrouse@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index d0a7e524..15d6682 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -265,7 +265,7 @@
 </histogram>
 
 <histogram name="AccessCodeCast.Session.FreezeDuration" units="ms"
-    expires_after="2023-12-01">
+    expires_after="2024-03-03">
   <owner>bzielinski@google.com</owner>
   <owner>cros-edu-eng@google.com</owner>
   <summary>
@@ -276,7 +276,7 @@
 </histogram>
 
 <histogram name="AccessCodeCast.Session.NewDeviceRouteCreationDuration"
-    units="ms" expires_after="2023-11-12">
+    units="ms" expires_after="2024-03-03">
   <owner>bzielinski@google.com</owner>
   <owner>cros-edu-eng@google.com</owner>
   <summary>
@@ -470,32 +470,6 @@
   </summary>
 </histogram>
 
-<histogram name="Ads.InterestGroup.Auction.AbortTime" units="ms"
-    expires_after="2024-06-20">
-  <owner>mmenke@chromium.org</owner>
-  <owner>morlovich@chromium.org</owner>
-  <summary>
-    The length of time it took to run a FLEDGE auction that was aborted. This
-    only happens on frame destruction. Recorded when the frame is destroyed.
-
-    See https://github.com/WICG/turtledove/blob/main/FLEDGE.md for the latest
-    version of the FLEDGE explainer.
-  </summary>
-</histogram>
-
-<histogram name="Ads.InterestGroup.Auction.AuctionWithWinnerTime" units="ms"
-    expires_after="2024-06-20">
-  <owner>mmenke@chromium.org</owner>
-  <owner>morlovich@chromium.org</owner>
-  <summary>
-    The length of time it took to run a FLEDGE auction that had a winning bid.
-    Recorded on auction complete.
-
-    See https://github.com/WICG/turtledove/blob/main/FLEDGE.md for the latest
-    version of the FLEDGE explainer.
-  </summary>
-</histogram>
-
 <histogram name="Ads.InterestGroup.Auction.BidFiltered" enum="Boolean"
     expires_after="2024-06-20">
   <owner>pauljensen@chromium.org</owner>
@@ -511,22 +485,6 @@
   </summary>
 </histogram>
 
-<histogram name="Ads.InterestGroup.Auction.CompletedWithoutWinnerTime"
-    units="ms" expires_after="2024-06-20">
-  <owner>mmenke@chromium.org</owner>
-  <owner>morlovich@chromium.org</owner>
-  <summary>
-    The length of time it took to run a FLEDGE auction that completed
-    successfully without a winner either due to no bidders making a bid, or the
-    seller script rejecting all bidders. Not recoded when there are no bidders,
-    or when an auction fails due to the seller worklet failing to load. Recorded
-    on auction complete.
-
-    See https://github.com/WICG/turtledove/blob/main/FLEDGE.md for the latest
-    version of the FLEDGE explainer.
-  </summary>
-</histogram>
-
 <histogram name="Ads.InterestGroup.Auction.ContextReused" enum="Boolean"
     expires_after="2024-06-20">
   <owner>pauljensen@chromium.org</owner>
@@ -663,16 +621,6 @@
   </summary>
 </histogram>
 
-<histogram name="Ads.InterestGroup.Auction.NonKAnonWinnerIsKAnon"
-    enum="Boolean" expires_after="2024-06-20">
-  <owner>behamilton@google.com</owner>
-  <owner>morlovich@chromium.org</owner>
-  <summary>
-    Recorded at the end of a FLEDGE auction when there is a non-k-anonymous
-    winner. True when the non-k-anonymous winner is k-anonymous.
-  </summary>
-</histogram>
-
 <histogram name="Ads.InterestGroup.Auction.NumAuctionsPerPage" units="auctions"
     expires_after="2024-06-20">
   <owner>caraitto@chromium.org</owner>
@@ -758,7 +706,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.ParseBaServerResponseDuration"
-    units="ms" expires_after="M120">
+    units="ms" expires_after="2024-03-10">
   <owner>behamilton@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -799,19 +747,6 @@
   </summary>
 </histogram>
 
-<histogram name="Ads.InterestGroup.Auction.Result" enum="AuctionResult"
-    expires_after="2024-06-20">
-  <owner>mmenke@chromium.org</owner>
-  <owner>morlovich@chromium.org</owner>
-  <summary>
-    The final result type of running a FLEDGE auction. Recorded on auction
-    completion/cancellation.
-
-    See https://github.com/WICG/turtledove/blob/main/FLEDGE.md for the latest
-    version of the FLEDGE explainer.
-  </summary>
-</histogram>
-
 <histogram name="Ads.InterestGroup.Auction.ScoreAdTime" units="ms"
     expires_after="2024-06-20">
   <owner>pauljensen@chromium.org</owner>
@@ -842,7 +777,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.BaDataConstructionTime" units="ms"
-    expires_after="M120">
+    expires_after="2024-03-03">
   <owner>behamilton@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -859,7 +794,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.BaDataSize" units="bytes"
-    expires_after="M120">
+    expires_after="2024-03-03">
   <owner>behamilton@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -957,6 +892,150 @@
   </summary>
 </histogram>
 
+<histogram name="Ads.InterestGroup.ServerAuction.EndToEndTime" units="ms"
+    expires_after="M121">
+  <owner>behamilton@google.com</owner>
+  <owner>pauljensen@chromium.org</owner>
+  <owner>privacy-sandbox-dev@chromium.org</owner>
+  <summary>
+    The length of time it took to run a Bidding and Auction Services auction.
+    This includes all of the time from the call to
+    `navigator.getInterestGroupAdAuctionData()` to the completion of the
+    `navigator.runAdAuction()` call. This metric is only recorded if there was a
+    winning bid.
+
+    See
+    https://github.com/WICG/turtledove/blob/main/FLEDGE_browser_bidding_and_auction_API.md
+    for the latest version of the Protected Audience Bidding &amp; Auction
+    Services explainer.
+  </summary>
+</histogram>
+
+<histogram name="Ads.InterestGroup.ServerAuction.EndToEndTimeNoWinner"
+    units="ms" expires_after="M121">
+  <owner>behamilton@google.com</owner>
+  <owner>pauljensen@chromium.org</owner>
+  <owner>privacy-sandbox-dev@chromium.org</owner>
+  <summary>
+    The length of time it took to run a Bidding and Auction Services auction.
+    This includes all of the time from the call to
+    `navigator.getInterestGroupAdAuctionData()` to the completion of the
+    `navigator.runAdAuction()` call. This metric is only recorded if there was
+    *no* winning bid.
+
+    See
+    https://github.com/WICG/turtledove/blob/main/FLEDGE_browser_bidding_and_auction_API.md
+    for the latest version of the Protected Audience Bidding &amp; Auction
+    Services explainer.
+  </summary>
+</histogram>
+
+<histogram name="Ads.InterestGroup.{AuctionType}.AbortTime" units="ms"
+    expires_after="2024-06-20">
+  <owner>mmenke@chromium.org</owner>
+  <owner>morlovich@chromium.org</owner>
+  <summary>
+    The length of time it took to run a {AuctionType} auction that was aborted.
+    This only happens on frame destruction. Recorded when the frame is
+    destroyed.
+
+    See https://github.com/WICG/turtledove/blob/main/FLEDGE.md for the latest
+    version of the FLEDGE explainer.
+  </summary>
+  <token key="AuctionType">
+    <variant name="Auction" summary="FLEDGE"/>
+    <variant name="ServerAuction" summary="Bidding and Auction Services">
+      <owner>behamilton@google.com</owner>
+      <owner>pauljensen@chromium.org</owner>
+      <owner>privacy-sandbox-dev@chromium.org</owner>
+    </variant>
+  </token>
+</histogram>
+
+<histogram name="Ads.InterestGroup.{AuctionType}.AuctionWithWinnerTime"
+    units="ms" expires_after="2024-06-20">
+  <owner>mmenke@chromium.org</owner>
+  <owner>morlovich@chromium.org</owner>
+  <summary>
+    The length of time it took to run a {AuctionType} auction that had a winning
+    bid. Recorded on auction complete.
+
+    See https://github.com/WICG/turtledove/blob/main/FLEDGE.md for the latest
+    version of the FLEDGE explainer.
+  </summary>
+  <token key="AuctionType">
+    <variant name="Auction" summary="FLEDGE"/>
+    <variant name="ServerAuction" summary="Bidding and Auction Services">
+      <owner>behamilton@google.com</owner>
+      <owner>pauljensen@chromium.org</owner>
+      <owner>privacy-sandbox-dev@chromium.org</owner>
+    </variant>
+  </token>
+</histogram>
+
+<histogram name="Ads.InterestGroup.{AuctionType}.CompletedWithoutWinnerTime"
+    units="ms" expires_after="2024-06-20">
+  <owner>mmenke@chromium.org</owner>
+  <owner>morlovich@chromium.org</owner>
+  <summary>
+    The length of time it took to run a {AuctionType} auction that completed
+    successfully without a winner either due to no bidders making a bid, or the
+    seller script rejecting all bidders. Not recoded when there are no bidders,
+    or when an auction fails due to the seller worklet failing to load. Recorded
+    on auction complete.
+
+    See https://github.com/WICG/turtledove/blob/main/FLEDGE.md for the latest
+    version of the FLEDGE explainer.
+  </summary>
+  <token key="AuctionType">
+    <variant name="Auction" summary="FLEDGE"/>
+    <variant name="ServerAuction" summary="Bidding and Auction Services">
+      <owner>behamilton@google.com</owner>
+      <owner>pauljensen@chromium.org</owner>
+      <owner>privacy-sandbox-dev@chromium.org</owner>
+    </variant>
+  </token>
+</histogram>
+
+<histogram name="Ads.InterestGroup.{AuctionType}.NonKAnonWinnerIsKAnon"
+    enum="Boolean" expires_after="2024-06-20">
+  <owner>behamilton@google.com</owner>
+  <owner>morlovich@chromium.org</owner>
+  <summary>
+    Recorded at the end of a {AuctionType} auction when there is a
+    non-k-anonymous winner. True when the non-k-anonymous winner is k-anonymous.
+  </summary>
+  <token key="AuctionType">
+    <variant name="Auction" summary="FLEDGE"/>
+    <variant name="ServerAuction" summary="Bidding and Auction Services">
+      <owner>behamilton@google.com</owner>
+      <owner>pauljensen@chromium.org</owner>
+      <owner>privacy-sandbox-dev@chromium.org</owner>
+    </variant>
+  </token>
+</histogram>
+
+<histogram name="Ads.InterestGroup.{AuctionType}.Result" enum="AuctionResult"
+    expires_after="2024-06-20">
+  <owner>mmenke@chromium.org</owner>
+  <owner>morlovich@chromium.org</owner>
+  <summary>
+    The final result type of running a {AuctionType} auction. Recorded on
+    auction completion/cancellation.
+
+    See https://github.com/WICG/turtledove/blob/main/FLEDGE.md for the latest
+    version of the FLEDGE explainer.
+  </summary>
+  <token key="AuctionType">
+    <variant name="Auction" summary="FLEDGE"/>
+    <variant name="ServerAuction" summary="Bidding and Auction Services">
+      <owner>behamilton@google.com</owner>
+      <owner>pauljensen@chromium.org</owner>
+      <owner>privacy-sandbox-dev@chromium.org</owner>
+    </variant>
+  </token>
+</histogram>
+
 <histogram name="Ads.Media.Duration" units="ms" expires_after="2022-10-30">
   <obsolete>
     Expired and removed 10/2022.
@@ -2486,7 +2565,7 @@
 </histogram>
 
 <histogram name="ChromiumAndroidLinker.RelroProvidedSuccessfully"
-    enum="BooleanSuccess" expires_after="2023-12-29">
+    enum="BooleanSuccess" expires_after="2024-03-03">
   <owner>lizeb@chromium.org</owner>
   <owner>pasko@chromium.org</owner>
   <summary>
@@ -2516,7 +2595,7 @@
 </histogram>
 
 <histogram name="ChromiumAndroidLinker.RelroSharingStatus2"
-    enum="RelroSharingStatus" expires_after="2022-12-04">
+    enum="RelroSharingStatus" expires_after="2024-03-10">
   <owner>lizeb@chromium.org</owner>
   <owner>pasko@chromium.org</owner>
   <summary>
@@ -2526,6 +2605,9 @@
 
     See a description of RELRO sharing here:
     https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/android_native_libraries.md#RELRO-Sharing
+
+    Warning: this histogram was expired from 2022-12-04 to 2023-09-07; data may
+    be missing.
   </summary>
 </histogram>
 
@@ -2881,7 +2963,7 @@
 </histogram>
 
 <histogram name="ClientHints.AcceptCHFrame" enum="AcceptCHFrameRestart"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>victortan@chromium.org</owner>
   <owner>miketaylr@chromium.org</owner>
   <summary>
@@ -2893,7 +2975,7 @@
 </histogram>
 
 <histogram name="ClientHints.CriticalCHRestart" enum="CriticalCHRestart"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>victortan@chromium.org</owner>
   <owner>miketaylr@chromium.org</owner>
   <summary>
@@ -2937,7 +3019,7 @@
 </histogram>
 
 <histogram name="ClientHints.StoreLatency" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>miketaylr@chromium.org</owner>
   <owner>potassium-katabolism@google.com</owner>
   <summary>
@@ -2957,7 +3039,7 @@
 </histogram>
 
 <histogram name="ClientHints.UpdateSize" units="count"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>victortan@chromium.org</owner>
   <owner>potassium-katabolism@google.com</owner>
   <summary>
@@ -3375,7 +3457,7 @@
 </histogram>
 
 <histogram name="ContextMenu.TimeToTakeAction.SelectedItem" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>twellington@chromium.org</owner>
   <owner>clank-app-team@google.com</owner>
   <summary>
@@ -3410,7 +3492,7 @@
 </histogram>
 
 <histogram name="Conversions.AggregatableKeysPerSource" units="keys"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3422,7 +3504,8 @@
 </histogram>
 
 <histogram name="Conversions.AggregatableReport.AssembleReportStatus"
-    enum="ConversionAssembleAggregatableReportStatus" expires_after="M121">
+    enum="ConversionAssembleAggregatableReportStatus"
+    expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3434,7 +3517,7 @@
 </histogram>
 
 <histogram name="Conversions.AggregatableReport.CreateReportStatus4"
-    enum="ConversionCreateAggregatableReportStatus" expires_after="M121">
+    enum="ConversionCreateAggregatableReportStatus" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3447,7 +3530,7 @@
 </histogram>
 
 <histogram name="Conversions.AggregatableReport.DroppedKeysPercentage"
-    units="%" expires_after="M121">
+    units="%" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3474,7 +3557,7 @@
 
 <histogram
     name="Conversions.AggregatableReport.ExtraReportDelayForSuccessfulSend"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>tquintanilla@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3514,7 +3597,7 @@
 
 <histogram
     name="Conversions.AggregatableReport.PendingAndBrowserWentOffline.{TimeSpan}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>anthonygarant@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -3557,7 +3640,7 @@
 </histogram>
 
 <histogram name="Conversions.AggregatableReport.SchedulerReportDelay"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3573,7 +3656,7 @@
 
 <histogram
     name="Conversions.AggregatableReport.TimeFromTriggerToReportAssembly2"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3586,7 +3669,7 @@
 
 <histogram
     name="Conversions.AggregatableReport.TimeFromTriggerToReportSentSuccessfully"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3598,7 +3681,7 @@
 </histogram>
 
 <histogram name="Conversions.AndroidRegistrationResult.{Type}2"
-    enum="ConversionAndroidRegistrationResult" expires_after="M121">
+    enum="ConversionAndroidRegistrationResult" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3615,7 +3698,7 @@
 </histogram>
 
 <histogram name="Conversions.AttributionSrcRequestStatus"
-    enum="ConversionAttributionSrcRequestStatus" expires_after="M121">
+    enum="ConversionAttributionSrcRequestStatus" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3626,7 +3709,7 @@
 </histogram>
 
 <histogram name="Conversions.AttributionSupport"
-    enum="ConversionAttributionSupport" expires_after="M121">
+    enum="ConversionAttributionSupport" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3647,7 +3730,7 @@
 </histogram>
 
 <histogram name="Conversions.CreateReportStatus8"
-    enum="ConversionStorageCreateReportStatus" expires_after="M121">
+    enum="ConversionStorageCreateReportStatus" expires_after="2024-03-10">
   <owner>tquintanilla@chromium.org</owner>
   <owner>apaseltiner@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3732,7 +3815,7 @@
 </histogram>
 
 <histogram name="Conversions.DeferredDataHostProcessedAfterTimeout"
-    enum="Boolean" expires_after="M121">
+    enum="Boolean" expires_after="2024-03-10">
   <owner>anthonygarant@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -3759,7 +3842,7 @@
 </histogram>
 
 <histogram name="Conversions.EnqueueEventAllowed" enum="BooleanAllowed"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>apaseltiner@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3772,7 +3855,7 @@
 </histogram>
 
 <histogram name="Conversions.EnqueueOsEventAllowed" enum="BooleanAllowed"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>apaseltiner@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3785,7 +3868,8 @@
   </summary>
 </histogram>
 
-<histogram name="Conversions.ExtraReportDelay2" units="ms" expires_after="M121">
+<histogram name="Conversions.ExtraReportDelay2" units="ms"
+    expires_after="2024-03-10">
   <owner>apaseltiner@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
@@ -3798,7 +3882,7 @@
 </histogram>
 
 <histogram name="Conversions.ExtraReportDelayForSuccessfulSend" units="ms"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>tquintanilla@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3824,7 +3908,7 @@
 </histogram>
 
 <histogram name="Conversions.GetMeasurementStatusTime" units="ms"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3838,7 +3922,7 @@
 </histogram>
 
 <histogram name="Conversions.HttpResponseOrNetErrorCodeAggregatable"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="M121">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2024-03-10">
   <owner>anthonygarant@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3851,7 +3935,7 @@
 </histogram>
 
 <histogram name="Conversions.HttpResponseOrNetErrorCodeEventLevel"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="M121">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2024-03-10">
   <owner>anthonygarant@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3864,7 +3948,7 @@
 </histogram>
 
 <histogram name="Conversions.ImpressionNavigationHasDeadInitiator"
-    enum="Boolean" expires_after="M121">
+    enum="Boolean" expires_after="2024-03-10">
   <owner>johnidel@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <summary>
@@ -3874,7 +3958,7 @@
 </histogram>
 
 <histogram name="Conversions.ImpressionsDeletedInDataClearOperation"
-    units="impressions" expires_after="M121">
+    units="impressions" expires_after="2024-03-10">
   <owner>johnidel@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <owner>linnan@chromium.org</owner>
@@ -3884,7 +3968,7 @@
 </histogram>
 
 <histogram name="Conversions.IncrementalTaintingFailures"
-    units="failed registrations" expires_after="M121">
+    units="failed registrations" expires_after="2024-03-10">
   <owner>csharrison@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -3900,7 +3984,7 @@
 </histogram>
 
 <histogram name="Conversions.NavigationDataHostStatus3"
-    enum="ConversionNavigationDataHostStatus" expires_after="M121">
+    enum="ConversionNavigationDataHostStatus" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3912,7 +3996,7 @@
 </histogram>
 
 <histogram name="Conversions.OsRegistrationResult.{Type}"
-    enum="ConversionOsRegistrationResult" expires_after="M121">
+    enum="ConversionOsRegistrationResult" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3929,7 +4013,7 @@
 </histogram>
 
 <histogram name="Conversions.ProcessRegisterDataHostDelay" units="ms"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>anthonygarant@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -3940,7 +4024,7 @@
 </histogram>
 
 <histogram name="Conversions.RegisterDataHostOutcome"
-    enum="ConversionRegisterDataHostOutcome" expires_after="M121">
+    enum="ConversionRegisterDataHostOutcome" expires_after="2024-03-10">
   <owner>anthonygarant@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -3972,7 +4056,7 @@
 </histogram>
 
 <histogram name="Conversions.ReportRetrySucceedEventLevel"
-    enum="BooleanSuccess" expires_after="M121">
+    enum="BooleanSuccess" expires_after="2024-03-10">
   <owner>anthonygarant@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3983,7 +4067,7 @@
 </histogram>
 
 <histogram name="Conversions.ReportsDeletedInDataClearOperation.Aggregatable"
-    units="conversions" expires_after="M121">
+    units="conversions" expires_after="2024-03-10">
   <owner>johnidel@chromium.org</owner>
   <owner>tquintanilla@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -3994,7 +4078,7 @@
 </histogram>
 
 <histogram name="Conversions.ReportsDeletedInDataClearOperation.Event"
-    units="conversions" expires_after="M121">
+    units="conversions" expires_after="2024-03-10">
   <owner>johnidel@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <owner>linnan@chromium.org</owner>
@@ -4005,7 +4089,7 @@
 </histogram>
 
 <histogram name="Conversions.ReportSendOutcome3"
-    enum="ConversionReportSendOutcome" expires_after="M121">
+    enum="ConversionReportSendOutcome" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -4017,7 +4101,7 @@
 </histogram>
 
 <histogram name="Conversions.ReportStatusAggregatable"
-    enum="ConversionReportStatus" expires_after="M121">
+    enum="ConversionReportStatus" expires_after="2024-03-10">
   <owner>anthonygarant@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -4029,7 +4113,7 @@
 </histogram>
 
 <histogram name="Conversions.ReportStatusEventLevel"
-    enum="ConversionReportStatus" expires_after="M121">
+    enum="ConversionReportStatus" expires_after="2024-03-10">
   <owner>anthonygarant@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -4124,7 +4208,7 @@
 </histogram>
 
 <histogram name="Conversions.SchedulerReportDelay" units="ms"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -4163,7 +4247,7 @@
 </histogram>
 
 <histogram name="Conversions.SourceStoredStatus6"
-    enum="ConversionStorageSourceStatus" expires_after="M121">
+    enum="ConversionStorageSourceStatus" expires_after="2024-03-10">
   <owner>tquintanilla@chromium.org</owner>
   <owner>anthonygarant@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -4187,7 +4271,7 @@
 </histogram>
 
 <histogram name="Conversions.Storage.CreationTime" units="ms"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>johnidel@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <summary>
@@ -4198,7 +4282,7 @@
 </histogram>
 
 <histogram name="Conversions.Storage.MigrationTime" units="ms"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>johnidel@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <summary>
@@ -4208,6 +4292,55 @@
   </summary>
 </histogram>
 
+<histogram name="Conversions.Storage.Sql.FileSize" units="KB"
+    expires_after="M121">
+  <owner>tquintanilla@chromium.org</owner>
+  <owner>johnidel@chromium.org</owner>
+  <owner>measurement-api-dev+metrics@google.com</owner>
+  <summary>
+    When the storage database is initialized upon the API's first use, records
+    the file size of the database in KB. Only recorded if initialization is
+    successful.
+  </summary>
+</histogram>
+
+<histogram name="Conversions.Storage.Sql.FileSize.PerSource" units="bytes"
+    expires_after="M121">
+  <owner>anthonygarant@chromium.org</owner>
+  <owner>johnidel@chromium.org</owner>
+  <owner>measurement-api-dev+metrics@google.com</owner>
+  <summary>
+    When the storage database is initialized upon the API's first use, records
+    the file size of the database in bytes divided by the number of sources in
+    storage. Only recorded if initialization is successful.
+  </summary>
+</histogram>
+
+<histogram name="Conversions.Storage.Sql.FileSizeSourcesPerOriginLimitReached"
+    units="KB" expires_after="M121">
+  <owner>tquintanilla@chromium.org</owner>
+  <owner>johnidel@chromium.org</owner>
+  <owner>measurement-api-dev+metrics@google.com</owner>
+  <summary>
+    Records the file size of the storage database in KB when the max sources per
+    origin limit is reached. Emitted whenever a source fails to be stored due to
+    this limit.
+  </summary>
+</histogram>
+
+<histogram
+    name="Conversions.Storage.Sql.FileSizeSourcesPerOriginLimitReached.PerSource"
+    units="bytes" expires_after="M121">
+  <owner>anthonygarant@chromium.org</owner>
+  <owner>johnidel@chromium.org</owner>
+  <owner>measurement-api-dev+metrics@google.com</owner>
+  <summary>
+    Records the file size of the storage database in bytes divided by the number
+    of sources in storage. Reported when the max sources per origin limit is
+    reached. Emitted whenever a source fails to be stored due to this limit.
+  </summary>
+</histogram>
+
 <histogram name="Conversions.Storage.Sql.InitStatus2"
     enum="ConversionStorageSqlInitStatus" expires_after="M121">
   <owner>johnidel@chromium.org</owner>
@@ -4219,7 +4352,7 @@
 </histogram>
 
 <histogram name="Conversions.TimeFromConversionToReportSend" units="hours"
-    expires_after="M121">
+    expires_after="2024-03-10">
   <owner>johnidel@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <summary>
@@ -4229,7 +4362,7 @@
 </histogram>
 
 <histogram name="Conversions.TimeFromTriggerToReportSentSuccessfully"
-    units="hours" expires_after="M121">
+    units="hours" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -4265,7 +4398,7 @@
 </histogram>
 
 <histogram name="Conversions.VerboseDebugReport.HttpResponseOrNetErrorCode"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="M121">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -4276,8 +4409,27 @@
   </summary>
 </histogram>
 
+<histogram name="Conversions.{RegistrationType}.UsesReservedKeys"
+    enum="Boolean" expires_after="M121">
+  <owner>anthonygarant@chromium.org</owner>
+  <owner>johnidel@chromium.org</owner>
+  <owner>measurement-api-dev+metrics@google.com</owner>
+  <summary>
+    Per the spec, {RegistrationType} filtering keys prefixed with &quot;_&quot;
+    should only be used for specified features, e.g., lookback window.
+
+    Before enforcing this, we use this metric to measure the number of
+    {RegistrationType}s that would be affected by the change. Recorded for
+    {RegistrationType} registrations which can otherwise be parsed successfully.
+  </summary>
+  <token key="RegistrationType">
+    <variant name="Source" summary="source"/>
+    <variant name="Trigger" summary="trigger"/>
+  </token>
+</histogram>
+
 <histogram name="Conversions.{ReportType}.NetworkConnectionTypeOnFailure"
-    enum="NetworkConnectionType" expires_after="M121">
+    enum="NetworkConnectionType" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -4292,6 +4444,22 @@
   </token>
 </histogram>
 
+<histogram name="Conversions.{ReportType}.ReportRetriesTillSuccessOrFailure"
+    enum="ConversionReportSendRetryCount" expires_after="M121">
+  <owner>tquintanilla@chromium.org</owner>
+  <owner>johnidel@chromium.org</owner>
+  <owner>measurement-api-dev+metrics@google.com</owner>
+  <summary>
+    Records the number of retries before a report is successfully sent or
+    records 'Failed' if report delivery fails after reaching the max number of
+    retries (2).
+  </summary>
+  <token key="ReportType">
+    <variant name="AggregatableReport"/>
+    <variant name="EventLevelReport"/>
+  </token>
+</histogram>
+
 <histogram name="CopylessPaste.CacheHit" enum="CopylessCacheHit"
     expires_after="2020-03-01">
   <owner>wychen@chromium.org</owner>
@@ -4802,7 +4970,8 @@
   </summary>
 </histogram>
 
-<histogram name="DemoMode.Setup.NumRetries" units="units" expires_after="M121">
+<histogram name="DemoMode.Setup.NumRetries" units="units"
+    expires_after="2024-03-10">
   <owner>llin@chromium.org</owner>
   <owner>xiqiruan@chromium.org</owner>
   <owner>yilkal@chromium.org</owner>
@@ -4840,7 +5009,7 @@
 </histogram>
 
 <histogram name="DirectSockets.PermissionDeniedFailures"
-    enum="DirectSocketPermissionFailureType" expires_after="2023-09-13">
+    enum="DirectSocketPermissionFailureType" expires_after="2024-09-13">
   <owner>glenrob@chromium.org</owner>
   <owner>greengrape@google.com</owner>
   <summary>
@@ -4852,7 +5021,7 @@
 </histogram>
 
 <histogram name="DirectSockets.TCPNetworkFailures" enum="NetErrorCodes"
-    expires_after="2023-09-13">
+    expires_after="2024-09-13">
   <owner>bartfab@chromium.org</owner>
   <owner>greengrape@google.com</owner>
   <summary>
@@ -4861,7 +5030,7 @@
 </histogram>
 
 <histogram name="DirectSockets.TCPServerNetworkFailures" enum="NetErrorCodes"
-    expires_after="2023-09-13">
+    expires_after="2024-09-13">
   <owner>bartfab@chromium.org</owner>
   <owner>greengrape@google.com</owner>
   <summary>
@@ -4870,7 +5039,7 @@
 </histogram>
 
 <histogram name="DirectSockets.UDPNetworkFailures" enum="NetErrorCodes"
-    expires_after="2023-09-13">
+    expires_after="2024-09-13">
   <owner>bartfab@chromium.org</owner>
   <owner>greengrape@google.com</owner>
   <summary>
@@ -4889,18 +5058,6 @@
   </summary>
 </histogram>
 
-<histogram name="DisplayManager.MirroringDisplayCountRanges"
-    enum="MultiDisplayModeDisplayCountRanges" expires_after="2022-12-04">
-  <owner>zentaro@chromium.org</owner>
-  <owner>cros-peripherals@google.com</owner>
-  <summary>
-    The number of displays connected to the device that are in software or
-    hardware mirror mode. This is emitted once when the normal or mixed mirror
-    mode is enabled through API call, or the display configuration changes (e.g.
-    adding or removing a display) when mirror mode is on.
-  </summary>
-</histogram>
-
 <histogram name="DisplayManager.MirroringImplementation"
     enum="DisplayMirroringImplementation" expires_after="2024-02-25">
   <owner>jshargo@chromium.org</owner>
@@ -5810,7 +5967,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.CanContactUser"
-    enum="FeedbackAppContactUserConsentType" expires_after="2023-12-04">
+    enum="FeedbackAppContactUserConsentType" expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -5821,7 +5978,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.DescriptionLength" units="characters"
-    expires_after="2023-10-01">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -5832,7 +5989,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.Duration.GetBigFeedbackLogs" units="ms"
-    expires_after="2024-01-14">
+    expires_after="2024-08-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
   <summary>
@@ -5845,7 +6002,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.ExitPath" enum="FeedbackAppExitPath"
-    expires_after="2024-02-04">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -5862,7 +6019,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.GetBigFeedbackLogs.EmptyCount"
-    units="logs" expires_after="2024-04-13">
+    units="logs" expires_after="2024-08-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
   <summary>
@@ -5874,7 +6031,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.GetBigFeedbackLogs.NotAvailableCount"
-    units="logs" expires_after="2024-04-13">
+    units="logs" expires_after="2024-08-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
   <summary>
@@ -5886,7 +6043,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.GetBigFeedbackLogs.OtherCount"
-    units="logs" expires_after="2024-04-13">
+    units="logs" expires_after="2024-08-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
   <summary>
@@ -5898,7 +6055,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.GetBigFeedbackLogs.Success"
-    units="boolean" expires_after="2024-01-14">
+    units="boolean" expires_after="2024-08-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
   <summary>
@@ -5910,7 +6067,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.GetFeedbackLogsV2.DBusResult"
-    enum="GetFeedbackLogsV2DbusResult" expires_after="2023-12-31">
+    enum="GetFeedbackLogsV2DbusResult" expires_after="2024-03-03">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
   <summary>
@@ -5922,7 +6079,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.HelpContentOutcome"
-    enum="FeedbackAppHelpContentOutcome" expires_after="2024-02-04">
+    enum="FeedbackAppHelpContentOutcome" expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -5934,7 +6091,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.HelpContentSearchResultCount"
-    units="numbers" expires_after="2024-02-20">
+    units="numbers" expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -5945,7 +6102,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.IncludedEmail" units="boolean"
-    expires_after="2024-06-04">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -5956,7 +6113,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.IncludedFile" units="boolean"
-    expires_after="2024-06-04">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -5967,7 +6124,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.IncludedScreenshot" units="boolean"
-    expires_after="2024-06-04">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -5978,7 +6135,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.IncludedSystemInfo" units="boolean"
-    expires_after="2024-06-04">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -5989,7 +6146,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.IncludedUrl" units="boolean"
-    expires_after="2024-06-04">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -6000,7 +6157,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.Openduration" units="ms"
-    expires_after="2024-06-04">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -6011,7 +6168,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.PostSubmitAction"
-    enum="FeedbackAppPostSubmitAction" expires_after="2023-11-19">
+    enum="FeedbackAppPostSubmitAction" expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -6023,7 +6180,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.TimeOnPage.{FeedbackAppPage}" units="s"
-    expires_after="2024-06-04">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -6040,7 +6197,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.ViewedHelpContent" units="boolean"
-    expires_after="2024-02-04">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -6051,7 +6208,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.ViewedImage" units="boolean"
-    expires_after="2024-06-04">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -6062,7 +6219,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.ViewedMetrics" units="boolean"
-    expires_after="2023-10-01">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -6073,7 +6230,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.ViewedScreenshot" units="boolean"
-    expires_after="2024-06-04">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -6084,7 +6241,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.ViewedSystemAndAppInfo" units="boolean"
-    expires_after="2024-06-04">
+    expires_after="2024-08-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -6095,7 +6252,7 @@
 </histogram>
 
 <histogram name="Feedback.Duration.FetchSystemInformation" units="ms"
-    expires_after="2024-02-11">
+    expires_after="2024-08-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>fernandex@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -6107,7 +6264,7 @@
 </histogram>
 
 <histogram name="Feedback.Duration.FormOpenToSubmit" units="ms"
-    expires_after="2024-02-20">
+    expires_after="2024-08-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>fernandex@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
@@ -6132,7 +6289,7 @@
 </histogram>
 
 <histogram name="Feedback.Duration.FormSubmitToSendQueue" units="ms"
-    expires_after="2024-01-14">
+    expires_after="2024-08-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-feedback-app@google.com</owner>
   <summary>
@@ -6167,7 +6324,7 @@
 </histogram>
 
 <histogram name="Feedback.RedactionTool" enum="PIIType"
-    expires_after="2023-12-30">
+    expires_after="2024-03-03">
   <owner>nikj@google.com</owner>
   <owner>dpchromeos-core-eng@google.com</owner>
   <summary>
@@ -6192,7 +6349,7 @@
 </histogram>
 
 <histogram name="Feedback.RedactionTool.TimeSpentRedacting" units="ms"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>cschlosser@chromium.org</owner>
   <owner>dpchromeos-core-eng@google.com</owner>
   <summary>
@@ -6204,7 +6361,7 @@
 </histogram>
 
 <histogram name="Feedback.RedactionTool.TimeSpentRedactingCrash" units="ms"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>cschlosser@chromium.org</owner>
   <owner>dpchromeos-core-eng@google.com</owner>
   <summary>
@@ -6242,6 +6399,19 @@
   <summary>Records the source that requested showing the feedback app.</summary>
 </histogram>
 
+<histogram name="Feedback.TrustSafetySentiment.CallTriggerOccurred"
+    enum="TrustSafetySentimentFeatureArea" expires_after="2023-10-14">
+  <owner>skrakowi@google.com</owner>
+  <owner>chrome-counter-abuse-alerts@google.com</owner>
+  <summary>
+    Records the associated feature area when the Trust and Safety sentiment
+    service detects that the user has performed a trigger action. This is
+    recorded before the associated probability check and will be used to verify
+    the infrastructure of newly integrated feature areas. We will remove this
+    histogram once we verify the implementation.
+  </summary>
+</histogram>
+
 <histogram name="Feedback.TrustSafetySentiment.SurveyRequested"
     enum="TrustSafetySentimentFeatureArea" expires_after="2024-01-14">
   <owner>sauski@google.com</owner>
@@ -6456,7 +6626,7 @@
 </histogram>
 
 <histogram name="FirstUserAction.BackgroundTime" units="minutes"
-    expires_after="2023-09-12">
+    expires_after="2024-09-12">
 <!-- Name completed by histogram_suffixes name="FirstUserActionType" and name="FirstUserActionTypeDevice" -->
 
   <owner>justincohen@chromium.org</owner>
@@ -6473,7 +6643,7 @@
 </histogram>
 
 <histogram name="FirstUserAction.HandsetUserActionType"
-    enum="FirstUserActionType" expires_after="2023-09-12">
+    enum="FirstUserActionType" expires_after="2024-09-12">
   <owner>justincohen@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -6488,7 +6658,7 @@
 </histogram>
 
 <histogram name="FirstUserAction.TabletUserActionType"
-    enum="FirstUserActionType" expires_after="2023-09-12">
+    enum="FirstUserActionType" expires_after="2024-09-12">
   <owner>justincohen@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -6894,7 +7064,7 @@
 </histogram>
 
 <histogram name="Hwsec.Attestation.PrepareDuration" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>chingkang@chromium.org</owner>
   <owner>cros-hwsec-userland-eng+uma@google.com</owner>
   <summary>The duration of preparation for enrollment in attestation.</summary>
@@ -7217,7 +7387,7 @@
 </histogram>
 
 <histogram name="InstanceID.GetToken.RequestStatus.SyncInvalidations"
-    enum="GCMRegistrationRequestStatus" expires_after="2024-01-07">
+    enum="GCMRegistrationRequestStatus" expires_after="2024-03-10">
   <owner>peter@chromium.org</owner>
   <owner>rushans@chromium.org</owner>
   <owner>treib@chromium.org</owner>
@@ -7719,14 +7889,14 @@
 </histogram>
 
 <histogram name="Linux.SystemTheme.Default" enum="Ui.SystemTheme"
-    expires_after="2023-12-10">
+    expires_after="2024-03-03">
   <owner>thomasanderson@chromium.org</owner>
   <owner>thestig@chromium.org</owner>
   <summary>The default system theme. Logged once on startup.</summary>
 </histogram>
 
 <histogram name="Linux.SystemTheme.Profile" enum="Ui.SystemTheme"
-    expires_after="M120">
+    expires_after="2024-03-03">
   <owner>thomasanderson@chromium.org</owner>
   <owner>thestig@chromium.org</owner>
   <summary>
@@ -7776,7 +7946,7 @@
 
 <histogram name="LoadingPredictor.OptimizationHintsReceiveStatus"
     enum="LoadingPredictorOptimizationHintsReceiveStatus"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>sophiechang@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <owner>spelchat@chromium.org</owner>
@@ -7919,7 +8089,7 @@
 </histogram>
 
 <histogram name="Mac.LaunchApplicationResult" enum="MacLaunchApplicationResult"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>mek@chromium.org</owner>
   <owner>src/base/mac/OWNERS</owner>
   <summary>
@@ -8395,28 +8565,6 @@
   </summary>
 </histogram>
 
-<histogram name="OAuth2Login.MergeSessionFailure" enum="GoogleServiceAuthError"
-    expires_after="2023-09-10">
-  <owner>droger@chromium.org</owner>
-  <owner>msarda@chromium.org</owner>
-  <owner>chrome-signin-team@google.com</owner>
-  <summary>
-    Failure reason of MergeSession call during Chrome OS login, Chrome Signin or
-    account addition. On all OSes as of M44 (previously CrOS only).
-  </summary>
-</histogram>
-
-<histogram name="OAuth2Login.MergeSessionRetry" enum="GoogleServiceAuthError"
-    expires_after="2023-10-01">
-  <owner>droger@chromium.org</owner>
-  <owner>msarda@chromium.org</owner>
-  <owner>chrome-signin-team@google.com</owner>
-  <summary>
-    Retry reason of failed MergeSession call during Chrome OS login, Chrome
-    Signin or account addition. On all OSes as of M44 (previously CrOS only).
-  </summary>
-</histogram>
-
 <histogram name="OAuth2Login.SessionRestore" enum="GaiaSessionRestoreOutcome"
     expires_after="2023-10-31">
   <owner>anastasiian@chromium.org</owner>
@@ -9090,14 +9238,16 @@
   <token key="ClientId" variants="PageImageServiceClientId"/>
 </histogram>
 
-<histogram name="PageImageService.ConsentSuccess{ClientId}"
-    enum="BooleanSuccess" expires_after="2024-02-20">
+<histogram name="PageImageService.ConsentStatus{ClientId}"
+    enum="PageImageServiceConsentStatus" expires_after="2024-02-20">
   <owner>tommycli@chromium.org</owner>
   <owner>chrome-journeys@google.com</owner>
   <component>UI&gt;Browser&gt;Journeys</component>
   <summary>
-    Records whether the URL consent check was successfully passed for this
-    request.
+    Records the result of the URL consent check for this request.
+
+    Note that only success and failure are captured if the &quot;old&quot;
+    unified consent throttle is used.
   </summary>
   <token key="ClientId" variants="PageImageServiceClientId"/>
 </histogram>
@@ -9818,7 +9968,7 @@
 </histogram>
 
 <histogram name="PushMessaging.DeliveryStatus" enum="PushEventStatus"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>peter@chromium.org</owner>
   <owner>knollr@chromium.org</owner>
   <summary>
@@ -10066,7 +10216,7 @@
 </histogram>
 
 <histogram name="ReadingList.WebUI.LoadCompletedTime" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>corising@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -10423,7 +10573,7 @@
 </histogram>
 
 <histogram name="ReportingAndNEL.NumberOfLoadedReportingEndpointGroups2"
-    units="endpoint group count" expires_after="2023-11-12">
+    units="endpoint group count" expires_after="2024-03-10">
   <owner>yhirano@chromium.org</owner>
   <owner>src/net/reporting/OWNERS</owner>
   <summary>
@@ -10435,7 +10585,7 @@
 </histogram>
 
 <histogram name="ReportingAndNEL.NumberOfLoadedReportingEndpoints2"
-    units="endpoint count" expires_after="2023-11-12">
+    units="endpoint count" expires_after="2024-03-10">
   <owner>yhirano@chromium.org</owner>
   <owner>src/net/reporting/OWNERS</owner>
   <summary>
@@ -10458,7 +10608,7 @@
 </histogram>
 
 <histogram name="ReportingAndNEL.WinGetLastErrorInitializeDB"
-    enum="WinGetLastError" expires_after="2023-11-12">
+    enum="WinGetLastError" expires_after="2024-03-10">
   <owner>wfh@chromium.org</owner>
   <owner>src/net/reporting/OWNERS</owner>
   <summary>
@@ -11240,7 +11390,7 @@
 </histogram>
 
 <histogram name="Servicification.Startup2" enum="ServicificationStartupMode"
-    expires_after="2023-09-10">
+    expires_after="2024-02-25">
   <owner>hanxi@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <owner>hnakashima@chromium.org</owner>
@@ -11450,7 +11600,7 @@
 </histogram>
 
 <histogram name="Shutdown.OtherExit.Time2" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
@@ -11475,7 +11625,7 @@
 </histogram>
 
 <histogram name="Shutdown.SilentExit.Time2" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
@@ -12941,7 +13091,7 @@
 </histogram>
 
 <histogram name="Touchpad.HapticClickSensitivity.Changed"
-    enum="HapticClickSensitivity" expires_after="2023-12-24">
+    enum="HapticClickSensitivity" expires_after="2024-03-10">
   <owner>gavinwill@chromium.org</owner>
   <owner>cros-peripherals@chromium.org</owner>
   <summary>
@@ -13139,6 +13289,17 @@
   </summary>
 </histogram>
 
+<histogram name="Tracing.Background.CompressedTraceSizeInKB" units="KB"
+    expires_after="2023-12-10">
+  <owner>etiennep@chromium.org</owner>
+  <owner>tracing@chromium.org</owner>
+  <owner>chrometto-team@google.com</owner>
+  <summary>
+    The size, in kilobytes, of a compressed trace ready to be uploaded. Values
+    can range from 1KB to 100MB.
+  </summary>
+</histogram>
+
 <histogram name="Tracing.Background.FinalizationDisallowedReason"
     enum="TracingFinalizationDisallowedReason" expires_after="2024-02-25">
   <owner>ssid@chromium.org</owner>
@@ -13342,12 +13503,15 @@
   </summary>
 </histogram>
 
-<histogram name="Uptime.DBusCrash" units="ms" expires_after="M85">
+<histogram name="Uptime.DBusCrash" units="ms" expires_after="2024-02-11">
   <owner>satorux@chromium.org</owner>
   <owner>hashimoto@chromium.org</owner>
   <summary>
     The system uptime on Chrome OS when the dbus-daemon process crashes,
     resulting in a reboot.
+
+    Warning: this histogram was expired from M85 to M118 some data may be
+    missing.
   </summary>
 </histogram>
 
@@ -14044,7 +14208,7 @@
 </histogram>
 
 <histogram name="WebFont.CacheHit" enum="WebFontCacheHit"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@chromium.org</owner>
   <owner>kouhei@chromium.org</owner>
@@ -14569,7 +14733,7 @@
   </summary>
 </histogram>
 
-<histogram name="WrenchMenu.TimeToAction.{Action}" units="units"
+<histogram name="WrenchMenu.TimeToAction.{Action}" units="ms"
     expires_after="2023-10-01">
   <owner>ainslie@chromium.org</owner>
   <owner>edwardjung@chromium.org</owner>
@@ -14637,6 +14801,7 @@
     <variant name="ShowKaleidoscope"/>
     <variant name="ShowPasswordManager"/>
     <variant name="ShowPaymentMethods"/>
+    <variant name="ShowSearchCompanion"/>
     <variant name="ShowSigninWhenPaused"/>
     <variant name="ShowSyncSettings"/>
     <variant name="ShowTranslate"/>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index cbc9a06..5c66f1a0 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -606,7 +606,7 @@
 
 <histogram
     name="PageLoad.Clients.FencedFrames.InteractiveTiming.FirstInputDelay4"
-    units="ms" expires_after="2023-10-08">
+    units="ms" expires_after="2024-10-08">
   <owner>lbrady@google.com</owner>
   <owner>shivanisha@chromium.org</owner>
   <owner>dom@chromium.org</owner>
@@ -620,7 +620,7 @@
 
 <histogram
     name="PageLoad.Clients.FencedFrames.LayoutInstability.CumulativeShiftScore"
-    units="scorex10" expires_after="2024-01-14">
+    units="scorex10" expires_after="2024-10-08">
   <owner>toyoshim@chromium.org</owner>
   <owner>mparch-dev@chromium.org</owner>
   <summary>
@@ -634,7 +634,7 @@
 
 <histogram
     name="PageLoad.Clients.FencedFrames.LayoutInstability.CumulativeShiftScore.MainFrame"
-    units="scorex10" expires_after="2024-02-11">
+    units="scorex10" expires_after="2024-10-08">
   <owner>lbrady@google.com</owner>
   <owner>shivanisha@chromium.org</owner>
   <owner>dom@chromium.org</owner>
@@ -648,7 +648,7 @@
 
 <histogram
     name="PageLoad.Clients.FencedFrames.PaintTiming.NavigationToFirstContentfulPaint"
-    units="ms" expires_after="2024-01-21">
+    units="ms" expires_after="2024-10-08">
   <owner>toyoshim@chromium.org</owner>
   <owner>mparch-dev@chromium.org</owner>
   <summary>
@@ -660,7 +660,7 @@
 
 <histogram
     name="PageLoad.Clients.FencedFrames.PaintTiming.NavigationToFirstImagePaint"
-    units="ms" expires_after="2024-02-11">
+    units="ms" expires_after="2024-10-08">
   <owner>lbrady@google.com</owner>
   <owner>shivanisha@chromium.org</owner>
   <owner>dom@chromium.org</owner>
@@ -674,7 +674,7 @@
 
 <histogram
     name="PageLoad.Clients.FencedFrames.PaintTiming.NavigationToFirstPaint"
-    units="ms" expires_after="2024-01-21">
+    units="ms" expires_after="2024-10-08">
   <owner>toyoshim@chromium.org</owner>
   <owner>mparch-dev@chromium.org</owner>
   <summary>
@@ -686,7 +686,7 @@
 
 <histogram
     name="PageLoad.Clients.FencedFrames.PaintTiming.NavigationToLargestContentfulPaint2"
-    units="ms" expires_after="2024-01-21">
+    units="ms" expires_after="2024-10-08">
   <owner>toyoshim@chromium.org</owner>
   <owner>mparch-dev@chromium.org</owner>
   <summary>
@@ -719,7 +719,7 @@
 
 <histogram
     name="PageLoad.Clients.FromGoogleSearch.FromSidePanel.LayoutInstability.MaxCumulativeShiftScore.SessionWindow.Gap1000ms.Max5000ms2"
-    units="scorex10000" expires_after="2023-12-31">
+    units="scorex10000" expires_after="2024-03-03">
   <owner>tluk@chromium.org</owner>
   <owner>chrome-cros@chromium.org</owner>
   <summary>
@@ -735,7 +735,7 @@
 
 <histogram
     name="PageLoad.Clients.FromGoogleSearch.FromSidePanel.PaintTiming.NavigationToFirstContentfulPaint"
-    units="ms" expires_after="2024-01-07">
+    units="ms" expires_after="2024-03-10">
   <owner>tluk@chromium.org</owner>
   <owner>chrome-cros@chromium.org</owner>
   <summary>
@@ -763,7 +763,7 @@
 
 <histogram
     name="PageLoad.Clients.FromGoogleSearch.FromSidePanel.PaintTiming.NavigationToLargestContentfulPaint2"
-    units="ms" expires_after="2024-01-07">
+    units="ms" expires_after="2024-03-10">
   <owner>tluk@chromium.org</owner>
   <owner>chrome-cros@chromium.org</owner>
   <summary>
@@ -972,7 +972,7 @@
 
 <histogram
     name="PageLoad.Clients.Prerender.LayoutInstability.MaxCumulativeShiftScore.SessionWindow.Gap1000ms.Max5000ms2{PrerenderTriggerType}"
-    units="ms" expires_after="2023-09-03">
+    units="ms" expires_after="2024-09-03">
   <owner>kenoss@chromium.org</owner>
   <owner>src/content/browser/preloading/prerender/OWNERS</owner>
   <summary>
@@ -1044,7 +1044,7 @@
 
 <histogram
     name="PageLoad.Clients.PrivacySandboxAds.InteractiveTiming.FirstInputDelay4.{PrivacySandboxAdsApi}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -1057,7 +1057,7 @@
 
 <histogram
     name="PageLoad.Clients.PrivacySandboxAds.LayoutInstability.MaxCumulativeShiftScore.SessionWindow.Gap1000ms.Max5000ms2.{PrivacySandboxAdsApi}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -1070,7 +1070,7 @@
 
 <histogram
     name="PageLoad.Clients.PrivacySandboxAds.PaintTiming.NavigationToFirstContentfulPaint.{PrivacySandboxAdsApi}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -1083,7 +1083,7 @@
 
 <histogram
     name="PageLoad.Clients.PrivacySandboxAds.PaintTiming.NavigationToLargestContentfulPaint2.{PrivacySandboxAdsApi}"
-    units="ms" expires_after="M121">
+    units="ms" expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -1192,7 +1192,7 @@
 
 <histogram
     name="PageLoad.Clients.ThirdParty.Frames.NavigationToFirstContentfulPaint3"
-    units="ms" expires_after="2024-01-07">
+    units="ms" expires_after="2024-03-10">
   <owner>jkarlin@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <summary>
@@ -1451,7 +1451,7 @@
 </histogram>
 
 <histogram name="PageLoad.DocumentTiming.NavigationToLoadEventFired" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>bmcquade@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -1915,6 +1915,17 @@
   </summary>
 </histogram>
 
+<histogram name="PageLoad.Experimental.PageVisitType" enum="PageVisitType"
+    expires_after="2024-02-25">
+  <owner>toyoshim@chromium.org</owner>
+  <owner>chrome-prerendering@google.com</owner>
+  <summary>
+    The page visit type that represents if the page follows a link navigation,
+    and the page is followed by another link navigation. This metrics is
+    recorded when the page is destructed.
+  </summary>
+</histogram>
+
 <histogram
     name="PageLoad.Experimental.PaintTiming.FirstEligibleToPaintToFirstPaint"
     units="ms" expires_after="2023-04-16">
@@ -1935,20 +1946,37 @@
   </summary>
 </histogram>
 
-<histogram name="PageLoad.Experimental.TotalForegroundDuration" units="ms"
-    expires_after="2024-02-25">
+<histogram name="PageLoad.Experimental.TotalForegroundDuration{PageVisitType}"
+    units="ms" expires_after="2024-02-25">
   <owner>npm@chromium.org</owner>
+  <owner>toyoshim@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
+  <owner>chrome-prerendering@google.com</owner>
   <summary>
-    The total amount of time the page spent in the foreground. Note that this
-    metric adds all foreground durations occurring for the page. For example: if
-    the page starts foregrounded during 1 second, then goes to the background
-    for a while, then is foregrounded again for 2 seconds, and then is unloaded,
-    this metric reports 3 seconds. The metric is recorded at the end of each
-    page load. As usual with PageLoad metrics, we consider app backgrounding on
-    Android to be the end of page load as well as the app could be evicted by
-    Android anytime after that happens.
+    The total amount of time the page spent in the foreground on
+    {PageVisitType}.
+
+    Note that this metric adds all foreground durations occurring for the page.
+    For example: if the page starts foregrounded during 1 second, then goes to
+    the background for a while, then is foregrounded again for 2 seconds, and
+    then is unloaded, this metric reports 3 seconds. The metric is recorded at
+    the end of each page load. As usual with PageLoad metrics, we consider app
+    backgrounding on Android to be the end of page load as well as the app could
+    be evicted by Android anytime after that happens.
+
+    See also PageLoad.Experimental.PageVisitType for each page visit type
+    definition.
   </summary>
+  <token key="PageVisitType">
+    <variant name=""
+        summary="all page visits, recorded in UkmPageLoadMetricsObserver"/>
+    <variant name=".AllVisit"
+        summary="all page visits, recorded in PreviewPageLoadMetricsObserver"/>
+    <variant name=".IndependentVisit" summary="independent page visits"/>
+    <variant name=".OriginVisit" summary="origin page visits"/>
+    <variant name=".PassingVisit" summary="passing page visits"/>
+    <variant name=".TerminalVisit" summary="terminal page visits"/>
+  </token>
 </histogram>
 
 <histogram name="PageLoad.FrameCounts.AdFrames.PerFrame.CreativeOriginStatus"
@@ -2363,7 +2391,7 @@
 
 <histogram
     name="PageLoad.Internal.PaintTiming.LargestContentfulPaint.ContentType"
-    enum="LargestContentType" expires_after="2024-01-03">
+    enum="LargestContentType" expires_after="2024-03-03">
   <owner>iclelland@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
@@ -2835,7 +2863,7 @@
 </histogram>
 
 <histogram name="PageLoad.PaintTiming.NavigationToFirstPaint" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
@@ -3029,7 +3057,7 @@
 </histogram>
 
 <histogram name="PageLoad.ParseTiming.NavigationToParseStart" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>bmcquade@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <summary>
@@ -3039,7 +3067,7 @@
 </histogram>
 
 <histogram name="PageLoad.ParseTiming.ParseBlockedOnScriptExecution" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>cduvall@chromium.org</owner>
   <owner>swarm-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml
index b0374e0..b2c1e02 100644
--- a/tools/metrics/histograms/metadata/password/histograms.xml
+++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -54,7 +54,6 @@
 
 <variants name="PasswordStoreBackendFunction">
   <variant name="AddLoginAsync" summary="AddLoginAsync()"/>
-  <variant name="ClearAllLocalPasswords" summary="ClearAllLocalPasswords()"/>
   <variant name="DisableAutoSignInForOriginsAsync"
       summary="DisableAutoSignInForOriginsAsync()"/>
   <variant name="FillMatchingLoginsAsync" summary="FillMatchingLoginsAsync()"/>
@@ -139,7 +138,7 @@
 </variants>
 
 <histogram name="KeyboardAccessory.AccessoryActionImpression"
-    enum="AccessoryAction" expires_after="2024-01-07">
+    enum="AccessoryAction" expires_after="2024-03-10">
   <owner>fhorschig@chromium.org</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -149,7 +148,7 @@
 </histogram>
 
 <histogram name="KeyboardAccessory.AccessoryActionSelected"
-    enum="AccessoryAction" expires_after="2024-01-07">
+    enum="AccessoryAction" expires_after="2024-03-10">
   <owner>fhorschig@chromium.org</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -159,7 +158,7 @@
 </histogram>
 
 <histogram name="KeyboardAccessory.AccessorySheetSuggestionsSelected"
-    enum="AccessorySuggestionType" expires_after="2024-01-07">
+    enum="AccessorySuggestionType" expires_after="2024-03-10">
   <owner>fhorschig@chromium.org</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -169,7 +168,7 @@
 </histogram>
 
 <histogram name="KeyboardAccessory.AccessorySheetTriggered"
-    enum="AccessorySheetTrigger" expires_after="2024-01-07">
+    enum="AccessorySheetTrigger" expires_after="2024-03-10">
   <owner>fhorschig@chromium.org</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -180,7 +179,7 @@
 </histogram>
 
 <histogram name="KeyboardAccessory.AccessoryToggleClicked"
-    enum="AccessoryToggleType" expires_after="2024-01-07">
+    enum="AccessoryToggleType" expires_after="2024-03-10">
   <owner>ioanap@chromium.org</owner>
   <owner>fhorschig@chromium.org</owner>
   <summary>
@@ -191,7 +190,7 @@
 </histogram>
 
 <histogram name="KeyboardAccessory.AccessoryToggleImpression"
-    enum="AccessoryToggleType" expires_after="2024-01-07">
+    enum="AccessoryToggleType" expires_after="2024-03-10">
   <owner>ioanap@chromium.org</owner>
   <owner>fhorschig@chromium.org</owner>
   <summary>
@@ -249,7 +248,7 @@
 </histogram>
 
 <histogram name="PasswordBubble.CompromisedBubble.Type"
-    enum="PasswordBubbleFollowupType" expires_after="2023-12-31">
+    enum="PasswordBubbleFollowupType" expires_after="2024-03-03">
   <owner>vasilii@chromium.org</owner>
   <owner>kazinova@google.com</owner>
   <summary>
@@ -430,26 +429,6 @@
   </summary>
 </histogram>
 
-<histogram name="PasswordManager.AccountChooserDialogMultipleAccounts"
-    enum="AccountChooserDismissalReason" expires_after="2023-10-08">
-  <owner>vasilii@chromium.org</owner>
-  <owner>kazinova@google.com</owner>
-  <summary>
-    The dismissal reason of the account chooser with multiple accounts. Recorded
-    when the account chooser is dismissed.
-  </summary>
-</histogram>
-
-<histogram name="PasswordManager.AccountChooserDialogOneAccount"
-    enum="AccountChooserDismissalReason" expires_after="2023-10-15">
-  <owner>vasilii@chromium.org</owner>
-  <owner>kazinova@google.com</owner>
-  <summary>
-    The dismissal reason of the account chooser with one account. Recorded when
-    the account chooser is dismissed.
-  </summary>
-</histogram>
-
 <histogram
     name="PasswordManager.AccountStorage.MoveToAccountStoreFlowAccepted2"
     enum="PasswordManager.MoveToAccountStoreTrigger" expires_after="2024-02-04">
@@ -661,7 +640,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationBackend.FetchSize" units="facets"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -672,7 +651,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationBackend.FirstFetchDelay" units="ms"
-    expires_after="M120">
+    expires_after="M123">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -683,7 +662,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationBackend.SubsequentFetchDelay"
-    units="ms" expires_after="M120">
+    units="ms" expires_after="M123">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -704,14 +683,14 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationDatabase.StoreResult"
-    enum="StoreAffiliationResult" expires_after="2023-12-31">
+    enum="StoreAffiliationResult" expires_after="2024-03-03">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>The result of AffiliationDatabase::Store call.</summary>
 </histogram>
 
 <histogram name="PasswordManager.AffiliationFetcher.FailedToParseResponse"
-    enum="Boolean" expires_after="M120">
+    enum="Boolean" expires_after="M123">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -721,7 +700,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationFetcher.FetchErrorCode"
-    enum="NetErrorCodes" expires_after="2023-10-08">
+    enum="NetErrorCodes" expires_after="M121">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -732,7 +711,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationFetcher.FetchHttpResponseCode"
-    enum="HttpResponseCode" expires_after="M121">
+    enum="HttpResponseCode" expires_after="2024-03-10">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -743,7 +722,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationFetcher.FetchResult"
-    enum="AffiliationFetchResult" expires_after="2024-01-07">
+    enum="AffiliationFetchResult" expires_after="2024-03-10">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -753,7 +732,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationFetcher.FetchTime.{Status}"
-    units="ms" expires_after="2024-02-20">
+    units="ms" expires_after="M123">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -768,7 +747,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationFetcher.ResponseSize.{Status}"
-    units="bytes" expires_after="M120">
+    units="bytes" expires_after="M123">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -782,7 +761,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationService.GetChangePasswordUsage"
-    enum="GetChangePasswordUrlMetric" expires_after="M120">
+    enum="GetChangePasswordUrlMetric" expires_after="M123">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1055,7 +1034,7 @@
 </histogram>
 
 <histogram name="PasswordManager.BulkCheck.TimePerCredential" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>vasilii@chromium.org</owner>
   <owner>vsemeniuk@google.com</owner>
   <summary>
@@ -1169,7 +1148,7 @@
 
 <histogram
     name="PasswordManager.CredentialManager.{ProfileType}.GetIntent.APIError"
-    enum="PasswordStoreAndroidBackendAPIError" expires_after="M120">
+    enum="PasswordStoreAndroidBackendAPIError" expires_after="M123">
   <owner>ioanap@chromium.org</owner>
   <owner>izuzic@google.com</owner>
   <summary>
@@ -1183,7 +1162,7 @@
 
 <histogram
     name="PasswordManager.CredentialManager.{ProfileType}.GetIntent.APIError.ConnectionResultCode"
-    enum="PasswordStoreAndroidBackendConnectionResultCode" expires_after="M120">
+    enum="PasswordStoreAndroidBackendConnectionResultCode" expires_after="M123">
   <owner>ioanap@chromium.org</owner>
   <owner>izuzic@google.com</owner>
   <summary>
@@ -1197,7 +1176,7 @@
 
 <histogram
     name="PasswordManager.CredentialManager.{ProfileType}.GetIntent.Error"
-    enum="CredentialManagerError" expires_after="M120">
+    enum="CredentialManagerError" expires_after="M123">
   <owner>ioanap@chromium.org</owner>
   <owner>fhorschig@chromium.org</owner>
   <summary>
@@ -1211,7 +1190,7 @@
 
 <histogram
     name="PasswordManager.CredentialManager.{ProfileType}.GetIntent.Latency"
-    units="ms" expires_after="M120">
+    units="ms" expires_after="M123">
   <owner>ioanap@chromium.org</owner>
   <owner>fhorschig@chromium.org</owner>
   <summary>
@@ -1226,7 +1205,7 @@
 
 <histogram
     name="PasswordManager.CredentialManager.{ProfileType}.GetIntent.Success"
-    enum="BooleanSuccess" expires_after="M120">
+    enum="BooleanSuccess" expires_after="M123">
   <owner>ioanap@chromium.org</owner>
   <owner>fhorschig@chromium.org</owner>
   <summary>
@@ -1239,7 +1218,7 @@
 
 <histogram
     name="PasswordManager.CredentialManager.{ProfileType}.Launch.Success"
-    enum="BooleanSuccess" expires_after="M120">
+    enum="BooleanSuccess" expires_after="M123">
   <owner>ioanap@chromium.org</owner>
   <owner>fhorschig@chromium.org</owner>
   <summary>
@@ -1279,7 +1258,7 @@
 </histogram>
 
 <histogram name="PasswordManager.CredentialsWithMismatchedDuplicates3"
-    units="units" expires_after="2023-10-15">
+    units="units" expires_after="2024-02-15">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1350,7 +1329,7 @@
 </histogram>
 
 <histogram name="PasswordManager.EditsInSaveBubble"
-    enum="PasswordManagerEditsInSaveBubbleEnum" expires_after="2024-01-07">
+    enum="PasswordManagerEditsInSaveBubbleEnum" expires_after="2024-03-10">
   <owner>vasilii@chromium.org</owner>
   <owner>kazinova@google.com</owner>
   <summary>
@@ -1441,7 +1420,7 @@
 </histogram>
 
 <histogram name="PasswordManager.FillingAssistance"
-    enum="PasswordManagerFillingAssistance" expires_after="2024-01-07">
+    enum="PasswordManagerFillingAssistance" expires_after="2024-03-10">
   <owner>kazinova@google.com</owner>
   <owner>battre@chromium.org</owner>
   <summary>
@@ -1548,7 +1527,7 @@
 </histogram>
 
 <histogram name="PasswordManager.GeneratedFormHasNoFormManager"
-    enum="BooleanFormManager" expires_after="2023-10-08">
+    enum="BooleanFormManager" expires_after="2024-03-31">
   <owner>kazinova@google.com</owner>
   <owner>kolos@chromium.org</owner>
   <summary>
@@ -1557,6 +1536,17 @@
   </summary>
 </histogram>
 
+<histogram name="PasswordManager.GetLogins.GroupedMatchesStatus"
+    enum="PasswordManager.GroupedPasswordFetchResult" expires_after="M121">
+  <owner>vasilii@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
+  <summary>
+    Represent all possible states of GetLogins call in regards to grouped
+    matches. This metric helps to evaluate grouped matches usefulness. Recorded
+    when a call finished and only if it was successful.
+  </summary>
+</histogram>
+
 <histogram name="PasswordManager.HttpCredentials2"
     enum="PasswordManagerHttpCredentialType" expires_after="2024-02-04">
   <owner>kazinova@google.com</owner>
@@ -1570,7 +1560,7 @@
 </histogram>
 
 <histogram name="PasswordManager.HttpPasswordMigrationCount2"
-    units="saved credentials" expires_after="2023-09-30">
+    units="saved credentials" expires_after="2024-03-31">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1581,7 +1571,7 @@
 </histogram>
 
 <histogram name="PasswordManager.HttpPasswordMigrationMode2"
-    enum="HttpPasswordMigrationMode" expires_after="2023-09-30">
+    enum="HttpPasswordMigrationMode" expires_after="2024-03-31">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1612,7 +1602,7 @@
 </histogram>
 
 <histogram name="PasswordManager.Import.Only{ErrorType}" units="Boolean"
-    expires_after="2023-09-15">
+    expires_after="2024-02-15">
   <owner>eliaskh@chromium.org</owner>
   <owner>natiahlyi@google.com</owner>
   <summary>
@@ -1639,7 +1629,7 @@
 </histogram>
 
 <histogram name="PasswordManager.Import.PerFile.Notes.{Type}" units="units"
-    expires_after="2023-09-15">
+    expires_after="2024-02-15">
   <owner>eliaskh@chromium.org</owner>
   <owner>natiahlyi@google.com</owner>
   <summary>
@@ -1664,7 +1654,7 @@
 </histogram>
 
 <histogram name="PasswordManager.Import.PerFile.{ErrorType}" units="units"
-    expires_after="2023-09-15">
+    expires_after="2024-02-15">
   <owner>eliaskh@chromium.org</owner>
   <owner>natiahlyi@google.com</owner>
   <summary>
@@ -1764,7 +1754,7 @@
 </histogram>
 
 <histogram name="PasswordManager.iOS.InfoBar.PasswordSave" enum="Boolean"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>djean@chromium.org</owner>
   <owner>sczs@google.com</owner>
   <summary>
@@ -1772,17 +1762,6 @@
   </summary>
 </histogram>
 
-<histogram name="PasswordManager.iOS.PasswordDetails.CopyDetailsFailed"
-    enum="Boolean" expires_after="2023-09-24">
-  <owner>eic@google.com</owner>
-  <owner>tmartino@chromium.com</owner>
-  <summary>
-    This metric counts how many times we fail to copy a field in the Passwords
-    Details to the pastboard. Only the true bucket is logged. See
-    crbug.com/1359331.
-  </summary>
-</histogram>
-
 <histogram name="PasswordManager.iOS.PasswordManagerVisit" enum="Boolean"
     expires_after="2023-12-21">
   <owner>eic@google.com</owner>
@@ -1852,7 +1831,7 @@
 </histogram>
 
 <histogram name="PasswordManager.JavaScriptOnlyValueInSubmittedForm"
-    enum="JavaScriptOnlyValueInPasswordForm" expires_after="2023-09-30">
+    enum="JavaScriptOnlyValueInPasswordForm" expires_after="2024-03-31">
   <owner>kazinova@google.com</owner>
   <owner>battre@chromium.org</owner>
   <summary>
@@ -1919,7 +1898,7 @@
 </histogram>
 
 <histogram name="PasswordManager.LeakDetection.ObtainAccessTokenTime"
-    units="ms" expires_after="M120">
+    units="ms" expires_after="M123">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1958,6 +1937,16 @@
   </summary>
 </histogram>
 
+<histogram name="PasswordManager.LoginDatabase.DeleteFromKeychain"
+    enum="ErrSecOSStatus" expires_after="M119">
+  <owner>vsemeniuk@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
+  <summary>
+    Records status of keychain item removal. Recorded after SecItemDelete is
+    called.
+  </summary>
+</histogram>
+
 <histogram name="PasswordManager.LoginDatabaseInit2"
     enum="LoginDatabaseInitError" expires_after="2024-02-25">
   <owner>vasilii@chromium.org</owner>
@@ -2057,8 +2046,20 @@
   </summary>
 </histogram>
 
+<histogram
+    name="PasswordManager.MigrationToOSCrypt.{Store}DeletedPasswordCount"
+    units="count" expires_after="M119">
+  <owner>vsemeniuk@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
+  <summary>
+    Records number of passwords which are missing from the keychain during
+    migration to OSCrypt on iOS. Recorded when migration succeeds.
+  </summary>
+  <token key="Store" variants="Store"/>
+</histogram>
+
 <histogram name="PasswordManager.MigrationToOSCrypt.{Store}ErrorLatency"
-    units="ms" expires_after="M119">
+    units="ms" expires_after="2024-03-10">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -2070,7 +2071,7 @@
 
 <histogram
     name="PasswordManager.MigrationToOSCrypt.{Store}KeychainRetrievalError"
-    enum="ErrSecOSStatus" expires_after="M119">
+    enum="ErrSecOSStatus" expires_after="2024-03-10">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -2080,8 +2081,20 @@
   <token key="Store" variants="Store"/>
 </histogram>
 
+<histogram
+    name="PasswordManager.MigrationToOSCrypt.{Store}MigratedPasswordCount"
+    units="count" expires_after="M119">
+  <owner>vsemeniuk@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
+  <summary>
+    Records number of passwords successfully migrated to encryption with OSCrypt
+    on iOS. Recorded when migration succeeds.
+  </summary>
+  <token key="Store" variants="Store"/>
+</histogram>
+
 <histogram name="PasswordManager.MigrationToOSCrypt.{Store}SuccessLatency"
-    units="ms" expires_after="M119">
+    units="ms" expires_after="2024-03-10">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -2092,7 +2105,7 @@
 </histogram>
 
 <histogram name="PasswordManager.MigrationToOSCrypt{StoreType}"
-    enum="MigrationToOSCryptEnum" expires_after="M119">
+    enum="MigrationToOSCryptEnum" expires_after="2024-03-03">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -2132,7 +2145,7 @@
 </histogram>
 
 <histogram name="PasswordManager.NewlySavedPasswordIsGenerated"
-    enum="BooleanNewlySavedPasswordIsGenerated" expires_after="2024-01-07">
+    enum="BooleanNewlySavedPasswordIsGenerated" expires_after="2024-03-10">
   <owner>nepper@chromium.org</owner>
   <owner>battre@chromium.org</owner>
   <owner>kolos@chromium.org</owner>
@@ -2164,7 +2177,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ParserDetectedOtpFieldWithRegex"
-    enum="Boolean" expires_after="2024-01-07">
+    enum="Boolean" expires_after="2024-03-10">
   <owner>kolos@chromium.org</owner>
   <owner>shaikhitdin@google.com</owner>
   <summary>
@@ -2254,7 +2267,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordCheckup.{Operation}.APIError"
-    enum="PasswordStoreAndroidBackendAPIError" expires_after="M120">
+    enum="PasswordStoreAndroidBackendAPIError" expires_after="M123">
   <owner>ioanap@chromium.org</owner>
   <owner>izuzic@google.com</owner>
   <summary>
@@ -2267,7 +2280,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordCheckup.{Operation}.Error"
-    enum="CredentialManagerError" expires_after="M120">
+    enum="CredentialManagerError" expires_after="M123">
   <owner>ioanap@chromium.org</owner>
   <owner>izuzic@google.com</owner>
   <owner>vsemeniuk@google.com</owner>
@@ -2282,7 +2295,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordCheckup.{Operation}.ErrorLatency"
-    units="ms" expires_after="M120">
+    units="ms" expires_after="M123">
   <owner>ioanap@chromium.org</owner>
   <owner>izuzic@google.com</owner>
   <summary>
@@ -2360,6 +2373,19 @@
   </summary>
 </histogram>
 
+<histogram name="PasswordManager.PasswordMigrationWarning.EmptySheetTrigger2"
+    enum="PasswordMigrationWarningTriggers" expires_after="2024-01-29">
+  <owner>izuzic@google.com</owner>
+  <owner>ioanap@chromium.org</owner>
+  <summary>
+    This histogram logs the UI surface that led to showing an empty local
+    passwords migration warning sheet. Recorded when the sheet is closing, but
+    only if it was blank. Android only. This replaces
+    PasswordManager.PasswordMigrationWarning.EmptySheetTrigger which had a bug
+    causing it to also report triggers of non-empty sheets.
+  </summary>
+</histogram>
+
 <histogram name="PasswordManager.PasswordMigrationWarning.Export.Event"
     enum="PasswordExportEvent" expires_after="2024-04-19">
   <owner>ioanap@chromium.org</owner>
@@ -2384,6 +2410,17 @@
   </summary>
 </histogram>
 
+<histogram name="PasswordManager.PasswordMigrationWarning.SheetStateAtClosing"
+    enum="PasswordMigrationWarningSheetStateAtClosing"
+    expires_after="2024-01-29">
+  <owner>izuzic@google.com</owner>
+  <owner>ioanap@chromium.org</owner>
+  <summary>
+    This histogram logs the state of the local passwords migration warning
+    bottom sheet. Recorded when the sheet is closing. Android only.
+  </summary>
+</histogram>
+
 <histogram name="PasswordManager.PasswordMigrationWarning.Trigger"
     enum="PasswordMigrationWarningTriggers" expires_after="2024-01-29">
   <owner>izuzic@google.com</owner>
@@ -2433,6 +2470,33 @@
   </summary>
 </histogram>
 
+<histogram
+    name="PasswordManager.PasswordNotesMigrationToOSCrypt.{Store}.KeychainRetrievalError"
+    enum="ErrSecOSStatus" expires_after="M120">
+  <owner>rgod@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
+  <summary>
+    Records keychain retrieval error code received during the migration of
+    password notes to OSCrypt on iOS {Store}. Recorded when retrieval fails.
+  </summary>
+  <token key="Store" variants="Store"/>
+</histogram>
+
+<histogram name="PasswordManager.PasswordNotesMigrationToOSCrypt{StoreType}"
+    enum="PasswordNotesMigrationToOSCryptEnum" expires_after="M120">
+  <owner>rgod@google.com</owner>
+  <owner>vasilii@chromium.org</owner>
+  <summary>
+    Records the migration status of password notes to OSCrypt on iOS for
+    {StoreType}. Recorded when migration starts and finishes.
+  </summary>
+  <token key="StoreType">
+    <variant name="" summary="both profile and account store"/>
+    <variant name=".AccountStore" summary="the AccountStore"/>
+    <variant name=".ProfileStore" summary="the ProfileStore"/>
+  </token>
+</histogram>
+
 <histogram name="PasswordManager.PasswordReuse.NumberOfMatches"
     units="credentials" expires_after="2024-02-25">
   <owner>vakh@chromium.org</owner>
@@ -2501,7 +2565,7 @@
 
 <histogram
     name="PasswordManager.PasswordSettings.{Function}.{Setting}.ErrorCode"
-    enum="PasswordStoreAndroidBackendError" expires_after="M120">
+    enum="PasswordStoreAndroidBackendError" expires_after="M123">
   <owner>izuzic@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -2564,6 +2628,28 @@
   </summary>
 </histogram>
 
+<histogram
+    name="PasswordManager.PasswordSharingRecipients.FetchAccessTokenResult"
+    enum="GoogleServiceAuthError" expires_after="2024-09-15">
+  <owner>rushans@google.com</owner>
+  <owner>mamir@chromium.org</owner>
+  <summary>
+    Records the result of access token fetch for the password sharing recipients
+    request. Recorded when a token fetch completes (including retries).
+  </summary>
+</histogram>
+
+<histogram name="PasswordManager.PasswordSharingRecipients.ResponseOrErrorCode"
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2024-09-15">
+  <owner>rushans@google.com</owner>
+  <owner>mamir@chromium.org</owner>
+  <summary>
+    Records the response (both HTTP code and net error code) for password
+    sharing recipients URL fetches, recorded when the request completes or fails
+    (does not include transient errors if request is retried).
+  </summary>
+</histogram>
+
 <histogram name="PasswordManager.PasswordStore.OnLoginsChanged" enum="Boolean"
     expires_after="2023-12-10">
   <owner>vsemeniuk@google.com</owner>
@@ -2590,7 +2676,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordStore.TimesAttemptedToReenrollInUPM"
-    units="Times" expires_after="2023-09-30">
+    units="Times" expires_after="2024-03-31">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -2632,31 +2718,8 @@
 </histogram>
 
 <histogram
-    name="PasswordManager.PasswordStoreAndroidBackend.ClearAllLocalPasswords.LoginsToRemove"
-    units="count" expires_after="M120">
-  <owner>vsemeniuk@google.com</owner>
-  <owner>fhorschig@chromium.org</owner>
-  <summary>
-    Total number of logins to be removed by ClearAllLocalPasswords.
-  </summary>
-</histogram>
-
-<histogram
-    name="PasswordManager.PasswordStoreAndroidBackend.ClearAllLocalPasswords.SuccessRate"
-    units="%" expires_after="M120">
-  <owner>vsemeniuk@google.com</owner>
-  <owner>fhorschig@chromium.org</owner>
-  <summary>
-    Ratio between successfully removed logins and total number of logins in the
-    GMS's local storage. Removal is considered successful when change list is
-    non-empty. Recorded when all the logins have been processed. If total number
-    of logins is 0, nothing is recorded.
-  </summary>
-</histogram>
-
-<histogram
     name="PasswordManager.PasswordStoreAndroidBackend.Retry{Operation}.APIError"
-    enum="PasswordStoreAndroidBackendAPIError" expires_after="M120">
+    enum="PasswordStoreAndroidBackendAPIError" expires_after="M123">
   <owner>izuzic@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -2668,7 +2731,6 @@
   <token key="Operation">
     <variant name=""/>
     <variant name=".AddLoginAsync" summary="AddLogin"/>
-    <variant name=".ClearAllLocalPasswords" summary="ClearAllLocalPasswords"/>
     <variant name=".DisableAutoSignInForOriginsAsync"
         summary="DisableAutoSignInForOrigins"/>
     <variant name=".FillMatchingLoginsAsync" summary="FillMatchingLogins"/>
@@ -2702,7 +2764,6 @@
   <token key="Operation">
     <variant name=""/>
     <variant name=".AddLoginAsync" summary="AddLoginAsync"/>
-    <variant name=".ClearAllLocalPasswords" summary="ClearAllLocalPasswords"/>
     <variant name=".DisableAutoSignInForOriginsAsync"
         summary="DisableAutoSignInForOriginsAsync"/>
     <variant name=".FillMatchingLoginsAsync" summary="FillMatchingLoginsAsync"/>
@@ -2792,16 +2853,15 @@
   </token>
 </histogram>
 
-<histogram name="PasswordManager.PasswordStoreInitResult2"
-    enum="BooleanSuccess" expires_after="M120">
+<histogram
+    name="PasswordManager.PasswordStoreBuiltInBackend.RemoveLoginsCreatedBetween.KeychainLatency"
+    units="ms" expires_after="M121">
   <owner>vasilii@chromium.org</owner>
-  <owner>src/components/password_manager/OWNERS</owner>
+  <owner>vsemeniuk@google.com</owner>
   <summary>
-    Success rate of initialization of password store. Recorded for every user
-    once on the Chrome profile startup. Only recorded for &quot;regular&quot;
-    profiles, i.e. those in which Password Manager might actually work. This
-    excludes incognito profiles, guest profiles, system profiles (used for the
-    profile picker), lockscreen profiles, etc.
+    Real-time duration of passwords bulk deletion from the Keychain inside
+    RemoveLoginsCreatedBetween() method on iOS. Recorded as soon as it
+    completes.
   </summary>
 </histogram>
 
@@ -2876,7 +2936,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordSyncState3" enum="PasswordSyncState"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -2912,7 +2972,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ProfileStore.TotalAccountsBeforeInitialSync"
-    units="accounts" expires_after="M120">
+    units="accounts" expires_after="M123">
   <owner>vasilii@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
@@ -2969,7 +3029,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ProvisionalSaveFailure2"
-    enum="ProvisionalSaveFailure" expires_after="2023-12-31">
+    enum="ProvisionalSaveFailure" expires_after="2024-03-03">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -3008,7 +3068,7 @@
 </histogram>
 
 <histogram name="PasswordManager.RequirementsSpecFetcher.NetworkDuration"
-    units="ms" expires_after="2023-10-15">
+    units="ms" expires_after="2024-04-15">
   <owner>kazinova@google.com</owner>
   <owner>battre@chromium.org</owner>
   <summary>
@@ -3071,7 +3131,7 @@
 
 <histogram
     name="PasswordManager.SavedGaiaPasswordHashCount2{SyncConsentStatus}"
-    units="count" expires_after="2023-12-31">
+    units="count" expires_after="2024-03-03">
   <owner>vsemeniuk@google.com</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -3096,7 +3156,9 @@
   <owner>mamir@chromium.org</owner>
   <summary>
     Why was the save password UI (bubble or infobar) closed? Recorded for
-    {UserSyncingType}
+    {UserSyncingType}. Note that on Automotive, closing the save password UI
+    might not result in the password being saved in some cases (e.g. when the
+    activity is destroyed or the device lock can't be set).
   </summary>
   <token key="UserSyncingType" variants="UserSyncingType"/>
 </histogram>
@@ -3125,7 +3187,9 @@
     to save/update the password in the edit dialog (which can be navigated from
     the message), to cancel in the dialog, tell to never save password for the
     site. Records the user action when the message is dismissed as well as when
-    the dialog opened from the message is dismissed.
+    the dialog opened from the message is dismissed. Note that on Automotive,
+    clicking save/update might not result in the password being saved in some
+    cases (e.g. when the activity is destroyed or the device lock can't be set).
   </summary>
   <token key="Dialog">
     <variant name="" summary="Aggregated across all breakdowns"/>
@@ -3221,6 +3285,17 @@
   </summary>
 </histogram>
 
+<histogram
+    name="PasswordManager.SingleUsername.ForgotPasswordServerPredictionUsed"
+    enum="Boolean" expires_after="M122">
+  <owner>kazinova@google.com</owner>
+  <owner>shaikhitdin@google.com</owner>
+  <summary>
+    Recorded when a single username form is detected using server predictions.
+    Records whether the prediction is SINGLE_USERNAME_FORGOT_PASSWORD.
+  </summary>
+</histogram>
+
 <histogram name="PasswordManager.SingleUsername.PasswordFormHadUsernameField"
     enum="PasswordFormHadUsernameField" expires_after="2024-01-28">
   <owner>kolos@chromium.org</owner>
@@ -3242,6 +3317,18 @@
   </summary>
 </histogram>
 
+<histogram name="PasswordManager.SingleUsername.VoteDataAvailability"
+    enum="SingleUsernameVoteDataAvailability" expires_after="M122">
+  <owner>kazinova@google.com</owner>
+  <owner>kolos@chromium.org</owner>
+  <owner>shaikhitdin@google.com</owner>
+  <summary>
+    This metric records whether username first and forgot password form voting
+    data is available, and whether it contains information about the same form.
+    Recorded during single username votes uploading.
+  </summary>
+</histogram>
+
 <histogram name="PasswordManager.StoreDecryptionResult"
     enum="PasswordDecryptionResult" expires_after="2024-03-30">
   <owner>mamir@chromium.org</owner>
@@ -3517,7 +3604,7 @@
 </histogram>
 
 <histogram name="PasswordManager.UnifiedPasswordManager.ActiveStatus2"
-    enum="UnifiedPasswordManagerActiveStatus" expires_after="M120">
+    enum="UnifiedPasswordManagerActiveStatus" expires_after="M123">
   <owner>kazinova@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <owner>fhorschig@chromium.org</owner>
@@ -3545,7 +3632,7 @@
 
 <histogram
     name="PasswordManager.UnifiedPasswordManager.{UPMMigrationType}.Latency"
-    units="ms" expires_after="M120">
+    units="ms" expires_after="M123">
   <owner>vsemeniuk@google.com</owner>
   <owner>fhorschig@chromium.org</owner>
   <summary>
@@ -3557,7 +3644,7 @@
 
 <histogram
     name="PasswordManager.UnifiedPasswordManager.{UPMMigrationType}.Success"
-    enum="BooleanSuccess" expires_after="2024-02-20">
+    enum="BooleanSuccess" expires_after="M123">
   <owner>vsemeniuk@google.com</owner>
   <owner>fhorschig@chromium.org</owner>
   <summary>
@@ -3575,7 +3662,7 @@
 
 <histogram
     name="PasswordManager.UpdateUIOnClearedPasswordChangeFormDismissalReason"
-    enum="PasswordManagerUIDismissalReason" expires_after="2023-10-15">
+    enum="PasswordManagerUIDismissalReason" expires_after="2024-04-15">
   <owner>kazinova@google.com</owner>
   <owner>khamutov@google.com</owner>
   <summary>
@@ -3909,7 +3996,7 @@
 </histogram>
 
 <histogram name="PasswordProtection.PageInfoAction"
-    enum="PasswordProtectionWarningAction" expires_after="2023-12-31">
+    enum="PasswordProtectionWarningAction" expires_after="2024-03-10">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -3967,7 +4054,7 @@
 </histogram>
 
 <histogram base="true" name="PasswordProtection.RequestOutcome"
-    enum="PasswordProtectionRequestOutcome" expires_after="2024-01-07">
+    enum="PasswordProtectionRequestOutcome" expires_after="2024-03-10">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -4012,7 +4099,7 @@
 </histogram>
 
 <histogram name="PasswordProtection.Verdict" enum="PasswordProtectionVerdict"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/pdf/histograms.xml b/tools/metrics/histograms/metadata/pdf/histograms.xml
index 05d4bffe..aafc4e2 100644
--- a/tools/metrics/histograms/metadata/pdf/histograms.xml
+++ b/tools/metrics/histograms/metadata/pdf/histograms.xml
@@ -86,7 +86,7 @@
 </histogram>
 
 <histogram name="PDF.LoadStatus" enum="ChromePDFViewerLoadStatus"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>kmoon@chromium.org</owner>
   <owner>thestig@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/performance_manager/histograms.xml b/tools/metrics/histograms/metadata/performance_manager/histograms.xml
index c3afe9b..9d4de27d 100644
--- a/tools/metrics/histograms/metadata/performance_manager/histograms.xml
+++ b/tools/metrics/histograms/metadata/performance_manager/histograms.xml
@@ -139,7 +139,7 @@
 </histogram>
 
 <histogram name="PerformanceManager.UserTuning.BatterySaverModeEnabledPercent"
-    units="%" expires_after="2023-12-31">
+    units="%" expires_after="2024-03-03">
   <owner>anthonyvd@chromium.org</owner>
   <owner>chrome-catan@google.com</owner>
   <summary>
@@ -163,7 +163,7 @@
 </histogram>
 
 <histogram name="PerformanceManager.UserTuning.MemorySaverModeEnabledPercent"
-    units="%" expires_after="2023-12-31">
+    units="%" expires_after="2024-03-03">
   <owner>anthonyvd@chromium.org</owner>
   <owner>chrome-catan@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/permissions/histograms.xml b/tools/metrics/histograms/metadata/permissions/histograms.xml
index 372d406..8c9f4fa 100644
--- a/tools/metrics/histograms/metadata/permissions/histograms.xml
+++ b/tools/metrics/histograms/metadata/permissions/histograms.xml
@@ -353,7 +353,7 @@
 </histogram>
 
 <histogram name="Permissions.ConfirmationChip.PageInfoDialogAccessType"
-    enum="PageInfoDialogAccessType" expires_after="2023-12-31">
+    enum="PageInfoDialogAccessType" expires_after="2024-03-03">
   <owner>fjacky@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -1329,7 +1329,7 @@
 </histogram>
 
 <histogram base="true" name="Permissions.Revocation.ElapsedTimeSinceGrant"
-    units="seconds" expires_after="2023-12-10">
+    units="seconds" expires_after="2024-03-03">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -1339,7 +1339,7 @@
 </histogram>
 
 <histogram name="Permissions.Revocation.Notifications.DidRecordUkm"
-    enum="Boolean" expires_after="2024-01-01">
+    enum="Boolean" expires_after="2024-03-03">
   <owner>engedy@chromium.org</owner>
   <owner>willxu@google.com</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
@@ -1489,7 +1489,7 @@
 </histogram>
 
 <histogram name="WebsiteSettings.AllSitesAction2"
-    enum="WebSiteSettingsAllSitesAction2" expires_after="2023-12-31">
+    enum="WebSiteSettingsAllSitesAction2" expires_after="2024-03-03">
   <owner>sauski@google.com</owner>
   <owner>alimariam@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/phonehub/histograms.xml b/tools/metrics/histograms/metadata/phonehub/histograms.xml
index 7e6af392..12e41dca 100644
--- a/tools/metrics/histograms/metadata/phonehub/histograms.xml
+++ b/tools/metrics/histograms/metadata/phonehub/histograms.xml
@@ -73,7 +73,7 @@
 </histogram>
 
 <histogram name="PhoneHub.BubbleOpened.Connectable.Failed.HostLastSeen"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -83,7 +83,7 @@
 </histogram>
 
 <histogram name="PhoneHub.BubbleOpened.Connectable.Page" enum="PhoneHubScreen"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -95,7 +95,7 @@
 
 <histogram name="PhoneHub.CameraRoll.AndroidHasStoragePermission"
     enum="PhoneHubCameraRollBooleanStorageAccessPermission"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -106,7 +106,7 @@
 </histogram>
 
 <histogram name="PhoneHub.CameraRoll.Content.Clicked{MediaType}"
-    enum="PhoneHubCameraRollContentClicked" expires_after="2023-12-31">
+    enum="PhoneHubCameraRollContentClicked" expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -117,7 +117,7 @@
 </histogram>
 
 <histogram name="PhoneHub.CameraRoll.Content.Present" enum="BooleanPresent"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jasonsun@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -128,7 +128,7 @@
 </histogram>
 
 <histogram name="PhoneHub.CameraRoll.Content.Shown{MediaType}"
-    enum="PhoneHubCameraRollContentShown" expires_after="2023-12-31">
+    enum="PhoneHubCameraRollContentShown" expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -139,7 +139,7 @@
 </histogram>
 
 <histogram name="PhoneHub.CameraRoll.ContextMenu.Download{MediaType}"
-    enum="PhoneHubCameraRollContextMenuDownload" expires_after="2023-12-31">
+    enum="PhoneHubCameraRollContextMenuDownload" expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -150,7 +150,7 @@
 </histogram>
 
 <histogram name="PhoneHub.CameraRoll.DownloadItem.Result"
-    enum="PhoneHubCameraRollDownloadResult" expires_after="2023-12-31">
+    enum="PhoneHubCameraRollDownloadResult" expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -160,7 +160,7 @@
 </histogram>
 
 <histogram name="PhoneHub.CameraRoll.DownloadItem.TransferRate" units="KB/s"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jasonsun@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -171,7 +171,7 @@
 </histogram>
 
 <histogram name="PhoneHub.CameraRoll.Latency.RefreshItems" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jasonsun@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -182,7 +182,7 @@
 </histogram>
 
 <histogram name="PhoneHub.CameraRoll.OptInEntryPoint"
-    enum="PhoneHubCameraRollOptInEntryPoint" expires_after="2023-12-31">
+    enum="PhoneHubCameraRollOptInEntryPoint" expires_after="2024-03-03">
   <owner>jianbing@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -209,7 +209,7 @@
 </histogram>
 
 <histogram name="PhoneHub.CompletedUserAction" enum="PhoneHubUserAction"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -221,7 +221,7 @@
 </histogram>
 
 <histogram name="PhoneHub.Connection.Duration" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -231,7 +231,7 @@
 </histogram>
 
 <histogram name="PhoneHub.Connection.Latency" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>crisrael@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -241,7 +241,7 @@
 </histogram>
 
 <histogram name="PhoneHub.Connection.Result" enum="BooleanSuccess"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -255,7 +255,7 @@
 
 <histogram name="PhoneHub.Connection.Result.FailureReason"
     enum="SecureChannelConnectionAttemptFailureReason"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -280,7 +280,7 @@
 </histogram>
 
 <histogram name="PhoneHub.InitialPhoneStatusSnapshot.Latency" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>pushi@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -291,7 +291,7 @@
 </histogram>
 
 <histogram name="PhoneHub.InitialPhoneStatusSnapshot.Received"
-    enum="BooleanSuccess" expires_after="2023-12-31">
+    enum="BooleanSuccess" expires_after="2024-03-03">
   <owner>pushi@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -353,7 +353,7 @@
 </histogram>
 
 <histogram name="PhoneHub.MultiDeviceFeatureState{PhoneHubFeature}"
-    enum="MultiDevice_FeatureState" expires_after="2023-12-31">
+    enum="MultiDevice_FeatureState" expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -370,7 +370,7 @@
 </histogram>
 
 <histogram name="PhoneHub.NotificationAccessSetup.SuccessfulSetupDuration"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-10">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -383,7 +383,7 @@
 </histogram>
 
 <histogram name="PhoneHub.NotificationAccessSetup.{AllStatusesOrLastStatus}"
-    enum="PhoneHubNotificationAccessSetupStatus" expires_after="2023-12-31">
+    enum="PhoneHubNotificationAccessSetupStatus" expires_after="2024-03-10">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -401,7 +401,7 @@
 </histogram>
 
 <histogram name="PhoneHub.NotificationCount" units="notifications"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -411,7 +411,7 @@
 </histogram>
 
 <histogram name="PhoneHub.NotificationInteraction"
-    enum="PhoneHubNotificationInteraction" expires_after="2023-12-31">
+    enum="PhoneHubNotificationInteraction" expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -421,7 +421,7 @@
 </histogram>
 
 <histogram name="PhoneHub.NotificationMessageLength" units="characters"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -442,7 +442,7 @@
 </histogram>
 
 <histogram name="PhoneHub.OptInEntryPoint" enum="PhoneHubOptInEntryPoint"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>Tracks the UI surface with which users enable Phone Hub.</summary>
@@ -450,7 +450,7 @@
 
 <histogram
     name="PhoneHub.PermissionsOnboarding.DialogScreenEvents.{SetupScreen}Screen"
-    enum="PhoneHubPermissionsOnboardingScreenEvent" expires_after="2023-12-31">
+    enum="PhoneHubPermissionsOnboardingScreenEvent" expires_after="2024-03-03">
   <owner>jianbing@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -511,7 +511,7 @@
 </histogram>
 
 <histogram name="PhoneHub.PhoneAvailabilityCheck.Latency" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-10">
   <owner>crisrael@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -522,7 +522,7 @@
 </histogram>
 
 <histogram name="PhoneHub.PhoneAvailabilityCheck.Result" enum="BooleanSuccess"
-    expires_after="2023-12-31">
+    expires_after="2024-03-10">
   <owner>crisrael@google.com</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -534,14 +534,14 @@
 </histogram>
 
 <histogram name="PhoneHub.QuickActionClicked" enum="PhoneHubQuickAction"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>Event logged after the user clicks on a quick action.</summary>
 </histogram>
 
 <histogram name="PhoneHub.RecentApps.State.OnBubbleOpened"
-    enum="RecentAppsViewUiState" expires_after="2023-12-31">
+    enum="RecentAppsViewUiState" expires_after="2024-03-03">
   <owner>crisrael@google.com</owner>
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -551,7 +551,7 @@
 </histogram>
 
 <histogram name="PhoneHub.RecentApps.TransitionToFailed.Latency" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>crisrael@google.com</owner>
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -562,7 +562,7 @@
 </histogram>
 
 <histogram name="PhoneHub.RecentApps.TransitionToSuccess.Latency" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>crisrael@google.com</owner>
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
@@ -583,7 +583,7 @@
 </histogram>
 
 <histogram name="PhoneHub.ScreenOn{BubbleEvent}" enum="PhoneHubScreen"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -597,7 +597,7 @@
 </histogram>
 
 <histogram name="PhoneHub.TabContinuationChipClicked" units="tab index"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -608,7 +608,7 @@
 </histogram>
 
 <histogram name="PhoneHub.TaskCompletion.TetherConnection.Result"
-    enum="PhoneHubTetherConnectionResult" expires_after="2023-12-31">
+    enum="PhoneHubTetherConnectionResult" expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
@@ -618,7 +618,7 @@
 </histogram>
 
 <histogram name="PhoneHub.TaskCompletion.{MessageType}.Result"
-    enum="PhoneHubMessageResult" expires_after="2023-12-31">
+    enum="PhoneHubMessageResult" expires_after="2024-03-03">
   <owner>jonmann@chromium.org</owner>
   <owner>chromeos-cross-device-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/platform/histograms.xml b/tools/metrics/histograms/metadata/platform/histograms.xml
index 3660dab..6e2f25fba 100644
--- a/tools/metrics/histograms/metadata/platform/histograms.xml
+++ b/tools/metrics/histograms/metadata/platform/histograms.xml
@@ -99,7 +99,7 @@
 </histogram>
 
 <histogram name="Platform.Chaps.ReinitializingToken"
-    enum="ChapsReinitializingToken" expires_after="2024-01-07">
+    enum="ChapsReinitializingToken" expires_after="2024-03-10">
   <owner>chenyian@google.com</owner>
   <owner>cros-hwsec-userland-eng+uma@google.com</owner>
   <summary>
@@ -108,7 +108,7 @@
 </histogram>
 
 <histogram name="Platform.Chaps.Session.Decrypt" enum="ChapsSessionStatus"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>chenyian@google.com</owner>
   <owner>cros-hwsec-userland-eng+uma@google.com</owner>
   <summary>
@@ -141,7 +141,7 @@
 </histogram>
 
 <histogram name="Platform.Chaps.Session.Sign" enum="ChapsSessionStatus"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>chenyian@google.com</owner>
   <owner>cros-hwsec-userland-eng+uma@google.com</owner>
   <summary>
@@ -163,7 +163,7 @@
 </histogram>
 
 <histogram name="Platform.Chaps.TokenManager.LoadToken"
-    enum="TokenManagerStatus" expires_after="2024-01-07">
+    enum="TokenManagerStatus" expires_after="2024-03-10">
   <owner>chenyian@google.com</owner>
   <owner>cros-hwsec-userland-eng+uma@google.com</owner>
   <summary>
@@ -185,7 +185,7 @@
 </histogram>
 
 <histogram name="Platform.Chaps.TPMAvailability" enum="ChapsTPMAvailability"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>chenyian@google.com</owner>
   <owner>cros-hwsec-userland-eng+uma@google.com</owner>
   <summary>Each sample is the TPM Availability status.</summary>
@@ -200,6 +200,21 @@
   </summary>
 </histogram>
 
+<histogram name="Platform.CrashCollector.AddWeightResult"
+    enum="CrosCrashCollectorAddWeightResult" expires_after="2024-09-01">
+  <owner>mutexlox@google.com</owner>
+  <owner>kendraketsui@google.com</owner>
+  <owner>cros-telemetry@google.com</owner>
+  <summary>
+    (ChromeOS only) An enum indicating the reasons why adding a weight to crash
+    reports succeeded or failed. This is recorded after each crash with
+    client-side weighting -- most commonly, those detected by anomaly_detector.
+    Specifically, these metrics are recorded in
+    CrashCollector::AddCrashMetaWeight() and
+    CrashCollector::AddCrashMetaUploadData().
+  </summary>
+</histogram>
+
 <histogram name="Platform.CrOS.CrashSenderRemoveReason"
     enum="CrosCrashSenderRemoveReason" expires_after="2024-07-10">
   <owner>iby@chromium.org</owner>
@@ -468,7 +483,7 @@
 </histogram>
 
 <histogram name="Platform.Featured.BootAttemptsSinceLastSafeSeed"
-    units="number of boot attempts" expires_after="2023-10-06">
+    units="number of boot attempts" expires_after="2024-10-06">
   <owner>kendraketsui@google.com</owner>
   <owner>mutexlox@google.com</owner>
   <owner>cros-telemetry@google.com</owner>
@@ -1854,7 +1869,7 @@
 </histogram>
 
 <histogram name="Platform.TPM.DictionaryAttackResetStatus"
-    enum="CrosTPMDictionaryAttackResetStatusEnum" expires_after="2024-01-07">
+    enum="CrosTPMDictionaryAttackResetStatusEnum" expires_after="2024-03-10">
   <owner>yich@google.com</owner>
   <owner>cros-hwsec-userland-eng+uma@google.com</owner>
   <summary>
@@ -1919,7 +1934,7 @@
 </histogram>
 
 <histogram name="Platform.TPM.PowerWashResult" enum="TPMPowerWashResult"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>chenyian@google.com</owner>
   <owner>cros-hwsec-userland-eng+uma@google.com</owner>
   <summary>
@@ -2011,7 +2026,7 @@
 </histogram>
 
 <histogram name="Platform.Trunks.FirstTimeoutWritingCommand"
-    enum="TPMCommandCode" expires_after="2024-01-07">
+    enum="TPMCommandCode" expires_after="2024-03-10">
   <owner>chingkang@chromium.org</owner>
   <owner>cros-hwsec+uma@google.com</owner>
   <summary>Command code of the first timeout writing TPM command</summary>
@@ -2181,7 +2196,7 @@
 </histogram>
 
 <histogram name="Platform.WriteSectorsShort" units="sectors per second"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>gwendal@google.com</owner>
   <owner>chromeos-storage@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/power/histograms.xml b/tools/metrics/histograms/metadata/power/histograms.xml
index dc137fa..24981fb 100644
--- a/tools/metrics/histograms/metadata/power/histograms.xml
+++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -1226,6 +1226,16 @@
   </summary>
 </histogram>
 
+<histogram name="Power.BatterySaver.UserBrightenedSec" units="seconds"
+    expires_after="2024-02-28">
+  <owner>cwd@google.com</owner>
+  <owner>chromeos-bsm@google.com</owner>
+  <summary>
+    ChromeOS time from Battery Saver activation that it took the user to
+    increase the backlight brightness above what Battery Saver set.
+  </summary>
+</histogram>
+
 <histogram name="Power.BitfixChunks" units="units" expires_after="M77">
   <owner>dianders@chromium.org</owner>
   <summary>
@@ -2163,7 +2173,7 @@
   </summary>
 </histogram>
 
-<histogram name="Power.SuspendDelay" units="seconds" expires_after="2023-12-31">
+<histogram name="Power.SuspendDelay" units="seconds" expires_after="2024-03-03">
   <owner>niwa@chromium.org</owner>
   <owner>puthik@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
@@ -2243,7 +2253,7 @@
 </histogram>
 
 <histogram name="PowerML.DimImminent.Action" enum="PowerMLDimImminentAction"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>napper@chromium.org</owner>
   <owner>thanhdng@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/prefetch/histograms.xml b/tools/metrics/histograms/metadata/prefetch/histograms.xml
index 1a86a1ff..60a9ed93 100644
--- a/tools/metrics/histograms/metadata/prefetch/histograms.xml
+++ b/tools/metrics/histograms/metadata/prefetch/histograms.xml
@@ -347,7 +347,7 @@
 </histogram>
 
 <histogram name="PrefetchProxy.Prefetch.Mainframe.CookiesToCopy" units="count"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>liviutinta@chromium.org</owner>
   <owner>jbroman@chromium.org</owner>
   <owner>curranmax@chromium.org</owner>
@@ -370,7 +370,7 @@
 </histogram>
 
 <histogram name="PrefetchProxy.Prefetch.Mainframe.RespCode"
-    enum="HttpResponseCode" expires_after="2024-01-07">
+    enum="HttpResponseCode" expires_after="2024-03-10">
   <owner>liviutinta@chromium.org</owner>
   <owner>jbroman@chromium.org</owner>
   <owner>curranmax@chromium.org</owner>
@@ -393,7 +393,7 @@
 </histogram>
 
 <histogram name="PrefetchProxy.Prefetch.Mainframe.TotalTime" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>liviutinta@chromium.org</owner>
   <owner>jbroman@chromium.org</owner>
   <owner>curranmax@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/print/histograms.xml b/tools/metrics/histograms/metadata/print/histograms.xml
index 9ac28ee..956a83d7 100644
--- a/tools/metrics/histograms/metadata/print/histograms.xml
+++ b/tools/metrics/histograms/metadata/print/histograms.xml
@@ -36,7 +36,7 @@
 </histogram>
 
 <histogram name="PrintPreview.InitialDisplayTime" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>thestig@chromium.org</owner>
   <owner>dhoss@chromium.org</owner>
   <summary>
@@ -273,7 +273,7 @@
 </histogram>
 
 <histogram name="PrintPreview.UserAction" enum="PrintPreviewUserActionType"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>thestig@chromium.org</owner>
   <owner>awscreen@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/printing/histograms.xml b/tools/metrics/histograms/metadata/printing/histograms.xml
index f478b1b8..3ee3bd8 100644
--- a/tools/metrics/histograms/metadata/printing/histograms.xml
+++ b/tools/metrics/histograms/metadata/printing/histograms.xml
@@ -33,7 +33,7 @@
 </histogram>
 
 <histogram name="Printing.ConversionSize.EmfWithReducedRasterization"
-    units="KB" expires_after="2023-12-31">
+    units="KB" expires_after="2024-03-03">
   <owner>thestig@chromium.org</owner>
   <owner>awscreen@chromium.org</owner>
   <summary>
@@ -352,6 +352,35 @@
 
 <histogram name="Printing.CUPS.TotalNetworkPrintersCount" units="printers"
     expires_after="2024-01-14">
+  <obsolete>
+    Replaced in M116 by Printing.CUPS.TotalNetworkPrintersCount.SettingsOpened
+  </obsolete>
+  <owner>bmgordon@chromium.org</owner>
+  <owner>project-bolton@google.com</owner>
+  <summary>
+    The total number of detected network printers. Recorded when the user
+    navigates to the OS Settings Printing page to set up printers. Only recorded
+    on Chrome OS.
+  </summary>
+</histogram>
+
+<histogram name="Printing.CUPS.TotalNetworkPrintersCount2" units="printers"
+    expires_after="2024-05-26">
+  <owner>bmgordon@chromium.org</owner>
+  <owner>project-bolton@google.com</owner>
+  <summary>
+    The total number of detected network printers. Recorded whenever the
+    background running mDNS detector reports detected printers. The mDNS
+    detector reports more often when printers are detected on the network, so
+    the &quot;0 printers&quot; case might be underrepresented in this metric.
+    Look to &quot;Printing.CUPS.TotalNetworkPrintersCount2.SettingsOpened&quot;
+    for more accurate &quot;0 printers&quot; representation. Only recorded on
+    Chrome OS.
+  </summary>
+</histogram>
+
+<histogram name="Printing.CUPS.TotalNetworkPrintersCount2.SettingsOpened"
+    units="printers" expires_after="2024-05-26">
   <owner>bmgordon@chromium.org</owner>
   <owner>project-bolton@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/privacy/histograms.xml b/tools/metrics/histograms/metadata/privacy/histograms.xml
index e888e3d..fb03b083 100644
--- a/tools/metrics/histograms/metadata/privacy/histograms.xml
+++ b/tools/metrics/histograms/metadata/privacy/histograms.xml
@@ -126,7 +126,7 @@
 </histogram>
 
 <histogram name="Privacy.CookieControlsActivated.PageRefreshCount"
-    units="count" expires_after="M120">
+    units="count" expires_after="2024-03-10">
   <owner>olesiamarukhno@google.com</owner>
   <owner>sauski@google.com</owner>
   <owner>kmg@google.com</owner>
@@ -137,7 +137,7 @@
 </histogram>
 
 <histogram name="Privacy.CookieControlsActivated.SaaRequested"
-    enum="BooleanEnabled" expires_after="M120">
+    enum="BooleanEnabled" expires_after="2024-03-10">
   <owner>olesiamarukhno@google.com</owner>
   <owner>sauski@google.com</owner>
   <owner>kmg@google.com</owner>
@@ -148,7 +148,7 @@
 </histogram>
 
 <histogram name="Privacy.CookieControlsActivated.SiteDataAccessType"
-    enum="ThirdPartySiteDataAccessType" expires_after="M120">
+    enum="ThirdPartySiteDataAccessType" expires_after="2024-03-10">
   <owner>olesiamarukhno@google.com</owner>
   <owner>sauski@google.com</owner>
   <owner>kmg@google.com</owner>
@@ -160,7 +160,7 @@
 </histogram>
 
 <histogram name="Privacy.CookieControlsActivated.SiteEngagementScore"
-    units="units" expires_after="M120">
+    units="units" expires_after="2024-03-10">
   <owner>olesiamarukhno@google.com</owner>
   <owner>sauski@google.com</owner>
   <owner>kmg@google.com</owner>
@@ -328,7 +328,7 @@
 </histogram>
 
 <histogram name="Privacy.DIPS.DeletionLatency2" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-10">
   <owner>wanderview@chromium.org</owner>
   <owner>src/chrome/browser/dips/OWNERS</owner>
   <summary>
@@ -800,18 +800,45 @@
 </histogram>
 
 <histogram
-    name="PrivacySandbox.PrivateAggregation.Host.SendHistogramReportResult"
-    enum="PrivacySandboxPrivateAggregationHostSendHistogramReportResult"
+    name="PrivacySandbox.PrivateAggregation.Host.PipeOpenDurationOnShutdown"
+    units="ms" expires_after="2024-02-25">
+  <owner>alexmt@chromium.org</owner>
+  <owner>linnan@chromium.org</owner>
+  <summary>
+    On browser or profile shutdown, records the length of time that each mojo
+    pipe still open has been open for. Recorded for every mojo pipe that is
+    still open during shutdown. This is intended to provide a signal if mojo
+    pipes are not being closed.
+  </summary>
+</histogram>
+
+<histogram name="PrivacySandbox.PrivateAggregation.Host.PipeResult"
+    enum="PrivacySandboxPrivateAggregationHostPipeResult"
     expires_after="2024-02-11">
   <owner>alexmt@chromium.org</owner>
   <owner>linnan@chromium.org</owner>
   <summary>
-    Records whether a call to PrivateAggregationHost::SendHistogramReport()
-    successfully resulted in the report request being forwarded to the manager
-    and, if not, the reason for failure. Further, breaks out the case of too
-    many contributions, where the request is forwarded but is truncated. Note
-    that, even if successfully forwarded, the report may still be rejected by
-    the budgeter or in the aggregation_service layer. Recorded for every call.
+    Records whether a PrivateAggregationHost mojo pipe successfully resulted in
+    a report request being forwarded to the manager and, if not, the reason for
+    failure or no report. Further, breaks out the case of too many
+    contributions, where the request is forwarded but is truncated. Note that,
+    even if successfully forwarded, the report may still be rejected by the
+    budgeter, manager or in the aggregation_service layer. Recorded for every
+    mojo pipe on disconnection.
+  </summary>
+</histogram>
+
+<histogram name="PrivacySandbox.PrivateAggregation.Host.TimeoutResult"
+    enum="PrivacySandboxPrivateAggregationHostTimeoutResult"
+    expires_after="2024-03-05">
+  <owner>alexmt@chromium.org</owner>
+  <owner>linnan@chromium.org</owner>
+  <summary>
+    Some PrivateAggregation operations have an associated timeout after which a
+    report will be sent unconditionally. This metric records, for every mojo
+    pipe which specifies a timeout, the outcome of the timeout. Recorded at the
+    timeout or disconnection time whichever occurs first, or when it's canceled
+    due to error, or on browser shutdown if it's still scheduled with pipe open.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/profile/histograms.xml b/tools/metrics/histograms/metadata/profile/histograms.xml
index 1fc45c26..e6d0a44c 100644
--- a/tools/metrics/histograms/metadata/profile/histograms.xml
+++ b/tools/metrics/histograms/metadata/profile/histograms.xml
@@ -54,7 +54,7 @@
   </summary>
 </histogram>
 
-<histogram name="Profile.AppCount" units="units" expires_after="2023-12-10">
+<histogram name="Profile.AppCount" units="units" expires_after="2024-03-03">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>The number of installed apps when a profile is opened.</summary>
@@ -610,7 +610,7 @@
   </summary>
 </histogram>
 
-<histogram name="Profile.{Database}Size" units="MB" expires_after="2023-12-30">
+<histogram name="Profile.{Database}Size" units="MB" expires_after="2024-03-03">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/quickstart/histograms.xml b/tools/metrics/histograms/metadata/quickstart/histograms.xml
index 7161f76..33a6e0a 100644
--- a/tools/metrics/histograms/metadata/quickstart/histograms.xml
+++ b/tools/metrics/histograms/metadata/quickstart/histograms.xml
@@ -241,6 +241,18 @@
   </summary>
 </histogram>
 
+<histogram name="QuickStart.ScreenOpened" enum="QuickStartScreenName"
+    expires_after="2023-12-01">
+  <owner>bhartmire@google.com</owner>
+  <owner>chromeos-cross-device-eng@google.com</owner>
+  <summary>
+    The screen a user views as they go through the Quick Start flow. This
+    includes all major Quick Start screens as well as all other OOBE screens
+    that occur in the middle of the Quick Start flow. Recorded when the screen
+    is shown.
+  </summary>
+</histogram>
+
 <histogram name="QuickStart.WifiTransferResult" enum="BooleanSuccess"
     expires_after="2023-12-01">
   <owner>bhartmire@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/quota/histograms.xml b/tools/metrics/histograms/metadata/quota/histograms.xml
index 39551a27..b1f3317 100644
--- a/tools/metrics/histograms/metadata/quota/histograms.xml
+++ b/tools/metrics/histograms/metadata/quota/histograms.xml
@@ -78,7 +78,7 @@
 </histogram>
 
 <histogram name="Quota.DatabaseSpecificError.{Statement}"
-    enum="SqliteLoggedResultCode" expires_after="2024-01-01">
+    enum="SqliteLoggedResultCode" expires_after="2024-03-03">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/renderer/histograms.xml b/tools/metrics/histograms/metadata/renderer/histograms.xml
index 4435ef3..f5c5623 100644
--- a/tools/metrics/histograms/metadata/renderer/histograms.xml
+++ b/tools/metrics/histograms/metadata/renderer/histograms.xml
@@ -598,7 +598,7 @@
 </histogram>
 
 <histogram name="RendererScheduler.RendererMainThreadLoad5" units="%"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>altimin@chromium.org</owner>
   <summary>
     Renderer main thread load (percentage of time spent in tasks), reported in
diff --git a/tools/metrics/histograms/metadata/renderer4/histograms.xml b/tools/metrics/histograms/metadata/renderer4/histograms.xml
index 7c38a047..4c6ea65 100644
--- a/tools/metrics/histograms/metadata/renderer4/histograms.xml
+++ b/tools/metrics/histograms/metadata/renderer4/histograms.xml
@@ -267,7 +267,7 @@
 </histogram>
 
 <histogram name="Renderer4.Renderer.RasterTaskTotalDuration"
-    units="microseconds" expires_after="2024-01-07">
+    units="microseconds" expires_after="2024-03-10">
   <owner>khushalsagar@chromium.org</owner>
   <owner>chrome-gpu@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
index 86b05438a..33a45c5 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -135,7 +135,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.Android.RealTimeAllowlist.IsInAllowlistElapsed"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>skrakowi@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -181,7 +181,7 @@
 
 <histogram
     name="SafeBrowsing.Android.RealTimeAllowlist.PopulateResourceFileElapsed"
-    units="ms" expires_after="2023-12-31">
+    units="ms" expires_after="2024-03-03">
   <owner>skrakowi@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -228,7 +228,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.BrowserThrottle.CheckerOnIOLifetime" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>thefrog@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -283,7 +283,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.BrowserThrottle.TotalDelay2{UserCategory}"
-    units="ms" expires_after="2024-01-04">
+    units="ms" expires_after="2024-03-10">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -327,7 +327,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.CheckUrl.Timeout" enum="BooleanTimedOut"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -410,7 +410,7 @@
 
 <histogram
     name="SafeBrowsing.ClientSafeBrowsingReport.HasThreatDetailsInContainer.SecurityInterstitial"
-    enum="BooleanAvailable" expires_after="2024-01-07">
+    enum="BooleanAvailable" expires_after="2024-03-10">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -518,13 +518,14 @@
   <owner>jacastro@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
-    Records whether an ESB user has sent a Protego ping to the Safe Browsing API
-    servers within the last 24 hours. If a ping was sent since the last time
-    this metric was logged, then this metric will report the type of that ping,
-    otherwise it will report that none was sent. If the user has sent a ping of
-    multiple types since the last time this metric was logged, then only the
-    type of the most recent ping will be reported. This metric is logged at most
-    once per day and only for users that have enhanced protection enabled.
+    Records whether an ESB user has sent a Protego ping to the Safe Browsing
+    consumer API servers within the last 24 hours. If a ping was sent since the
+    last time this metric was logged, then this metric will report the type of
+    that ping, otherwise it will report that none was sent. If the user has sent
+    a ping of multiple types since the last time this metric was logged, then
+    only the type of the most recent ping will be reported. This metric is
+    logged at most once per day and only for users that have enhanced protection
+    enabled.
   </summary>
 </histogram>
 
@@ -831,7 +832,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.ExtensionTelemetry.Signals.Discarded"
-    enum="SBExtensionTelemetrySignalsSignalType" expires_after="2023-12-31">
+    enum="SBExtensionTelemetrySignalsSignalType" expires_after="2024-03-03">
   <owner>anunoy@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -900,7 +901,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.FileTypeUpdate.DynamicUpdateResult"
-    enum="SBFileTypeUpdateResult" expires_after="2024-01-07">
+    enum="SBFileTypeUpdateResult" expires_after="2024-03-10">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1055,7 +1056,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HitReport.IsSubresource"
-    enum="BooleanIsSubresource" expires_after="2024-01-07">
+    enum="BooleanIsSubresource" expires_after="2024-03-10">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1312,6 +1313,18 @@
   </summary>
 </histogram>
 
+<histogram name="SafeBrowsing.HPRT.OhttpKeyService.FetchKeyTriggerReason"
+    enum="SafeBrowsingOhttpFetchKeyTriggerReason" expires_after="2024-03-07">
+  <owner>xinghuilu@chromium.org</owner>
+  <owner>chrome-counter-abuse-alerts@google.com</owner>
+  <summary>
+    Logs how the key fetch is triggered. Logs whenever a key fetch request is
+    about to be attempted (either triggered by hash prefix lookup, asynchronous
+    workflow or server hint), which will not go through if the service is in
+    backoff mode.
+  </summary>
+</histogram>
+
 <histogram name="SafeBrowsing.HPRT.OhttpKeyService.HasCachedKey"
     enum="BooleanHasKey" expires_after="2024-02-04">
   <owner>xinghuilu@chromium.org</owner>
@@ -1651,6 +1664,28 @@
   </summary>
 </histogram>
 
+<histogram
+    name="SafeBrowsing.NavigationObserver.NotificationNavigationEventAdded"
+    enum="BooleanAccepted" expires_after="2024-02-23">
+  <owner>nwokedi@chromium.org</owner>
+  <owner>chrome-counter-abuse-alerts@google.com</owner>
+  <summary>
+    Logs the number of times we have added Push notification-intiated navigation
+    events.
+  </summary>
+</histogram>
+
+<histogram
+    name="SafeBrowsing.NavigationObserver.NotificationOriginAddedToReferrerChain"
+    enum="BooleanAccepted" expires_after="2024-02-23">
+  <owner>nwokedi@chromium.org</owner>
+  <owner>chrome-counter-abuse-alerts@google.com</owner>
+  <summary>
+    Logs the number of times a notification's service worker's URL is added as a
+    referrer in a referrer chain.
+  </summary>
+</histogram>
+
 <histogram name="SafeBrowsing.PageLoadToken.ClearReason"
     enum="SafeBrowsingPageLoadTokenClearReason" expires_after="2024-02-04">
   <owner>xinghuilu@chromium.org</owner>
@@ -2120,7 +2155,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.RT.LocalMatch.Result.{IsMainframe}{UserCategory}"
-    enum="SafeBrowsingAllowlistAsyncMatch" expires_after="2024-01-04">
+    enum="SafeBrowsingAllowlistAsyncMatch" expires_after="2024-03-10">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2168,7 +2203,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.RT.Network.Time" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2329,6 +2364,18 @@
   </summary>
 </histogram>
 
+<histogram name="SafeBrowsing.TailoredSecurity.ShouldRetryOutcome"
+    enum="SafeBrowsingTailoredSecurityShouldRetryOutcome"
+    expires_after="2024-09-06">
+  <owner>jacastro@chromium.org</owner>
+  <owner>chrome-counter-abuse-alerts@google.com</owner>
+  <summary>
+    Records the outcome of running the tailored security retry logic. It is
+    logged once each time Chrome starts for syncing users in the cases where the
+    retry attempt could occur.
+  </summary>
+</histogram>
+
 <histogram
     name="SafeBrowsing.TailoredSecurity.SyncPromptEnabledNotificationResult"
     enum="SafeBrowsingTailoredSecurityNotificationResult"
@@ -2476,7 +2523,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.Triggers.AdSampler.Action"
-    enum="AdSamplerTriggerAction" expires_after="2024-01-07">
+    enum="AdSamplerTriggerAction" expires_after="2024-03-10">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2573,7 +2620,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.V4GetHash.CacheHit.Result"
-    enum="SafeBrowsingV4FullHashCacheResult" expires_after="2024-01-07">
+    enum="SafeBrowsingV4FullHashCacheResult" expires_after="2024-03-10">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>Track cache hits for V4 full hashes.</summary>
@@ -2614,7 +2661,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.V4GetHash.Network.Time" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2638,7 +2685,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.V4GetHash.Result"
-    enum="SafeBrowsingV4OperationResult" expires_after="2024-01-07">
+    enum="SafeBrowsingV4OperationResult" expires_after="2024-03-10">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2670,7 +2717,7 @@
 
 <histogram
     name="SafeBrowsing.V4LocalDatabaseManager.TimeSinceLastUpdateResponse"
-    units="ms" expires_after="2023-10-22">
+    units="ms" expires_after="2024-09-10">
   <owner>ajuma@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2753,7 +2800,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.V4ProcessPartialUpdate.ApplyUpdate.Result"
-    enum="SafeBrowsingV4ApplyUpdateResult" expires_after="2024-01-07">
+    enum="SafeBrowsingV4ApplyUpdateResult" expires_after="2024-03-10">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/scanning/histograms.xml b/tools/metrics/histograms/metadata/scanning/histograms.xml
index d6f61ea27..1b5779c2 100644
--- a/tools/metrics/histograms/metadata/scanning/histograms.xml
+++ b/tools/metrics/histograms/metadata/scanning/histograms.xml
@@ -53,7 +53,7 @@
 </histogram>
 
 <histogram name="Scanning.MultiPageScan.PageScanResult"
-    enum="ScanJobFailureReason" expires_after="2024-01-04">
+    enum="ScanJobFailureReason" expires_after="2024-03-10">
   <owner>gavinwill@chromium.org</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>
@@ -94,7 +94,7 @@
 </histogram>
 
 <histogram name="Scanning.NumCompletedScansInSession" units="scans"
-    expires_after="2024-01-04">
+    expires_after="2024-03-10">
   <owner>gavinwill@chromium.org</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>
@@ -105,7 +105,7 @@
 </histogram>
 
 <histogram name="Scanning.NumDetectedScanners" units="scanners"
-    expires_after="2024-01-04">
+    expires_after="2024-03-10">
   <owner>gavinwill@chromium.org</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>
@@ -115,7 +115,7 @@
 </histogram>
 
 <histogram name="Scanning.NumDetectedScannersAtLogin" units="scanners"
-    expires_after="2024-01-04">
+    expires_after="2024-03-10">
   <owner>gavinwill@chromium.org</owner>
   <owner>masonwilde@google.com</owner>
   <owner>cros-peripherals@google.com</owner>
@@ -158,7 +158,7 @@
   </summary>
 </histogram>
 
-<histogram name="Scanning.ReadyTime" units="ms" expires_after="2024-01-04">
+<histogram name="Scanning.ReadyTime" units="ms" expires_after="2024-03-10">
   <owner>gavinwill@chromium.org</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>
@@ -179,7 +179,7 @@
 </histogram>
 
 <histogram name="Scanning.ScanJobFailureReason" enum="ScanJobFailureReason"
-    expires_after="2024-01-04">
+    expires_after="2024-03-10">
   <owner>gavinwill@chromium.org</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>Records the reason a scan job failed.</summary>
@@ -231,7 +231,7 @@
 </histogram>
 
 <histogram name="Scanning.ScanJobSuccessful" enum="Boolean"
-    expires_after="2024-01-04">
+    expires_after="2024-03-10">
   <owner>gavinwill@chromium.org</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/search/histograms.xml b/tools/metrics/histograms/metadata/search/histograms.xml
index 1e86bf8..408d891 100644
--- a/tools/metrics/histograms/metadata/search/histograms.xml
+++ b/tools/metrics/histograms/metadata/search/histograms.xml
@@ -41,11 +41,12 @@
   </summary>
 </histogram>
 
-<histogram name="Search.AuxiliarySearch.DeleteTime" units="ms"
-    expires_after="M130">
+<histogram name="Search.AuxiliarySearch.DeleteTime{AuxiliarySearchDataType}"
+    units="ms" expires_after="M130">
   <owner>gangwu@chromium.org</owner>
   <owner>chrome-mobile-search@google.com</owner>
   <summary>Time taken for deleting contents from the auxiliary search.</summary>
+  <token key="AuxiliarySearchDataType" variants="AuxiliarySearchDataType"/>
 </histogram>
 
 <histogram
@@ -59,7 +60,8 @@
   <token key="AuxiliarySearchDataType" variants="AuxiliarySearchDataType"/>
 </histogram>
 
-<histogram name="Search.AuxiliarySearch.DeletionRequestStatus"
+<histogram
+    name="Search.AuxiliarySearch.DeletionRequestStatus{AuxiliarySearchDataType}"
     enum="AuxiliarySearchRequestStatus" expires_after="M130">
   <owner>gangwu@chromium.org</owner>
   <owner>chrome-mobile-search@google.com</owner>
@@ -68,6 +70,7 @@
     Recorded twice for every deletion request: once to capture the request sent,
     and once to capture the consumer's response.
   </summary>
+  <token key="AuxiliarySearchDataType" variants="AuxiliarySearchDataType"/>
 </histogram>
 
 <histogram name="Search.AuxiliarySearch.DonateTime" units="ms"
@@ -117,6 +120,19 @@
   <token key="AuxiliarySearchDataType" variants="AuxiliarySearchDataType"/>
 </histogram>
 
+<histogram name="Search.ChoiceScreenEvents"
+    enum="SearchEngineChoiceScreenEvents" expires_after="2024-02-04">
+  <owner>samarchehade@chromium.org</owner>
+  <owner>chrome-waffle-eng@google.com</owner>
+  <summary>
+    Records that the search engine choice screen was displayed, and whether this
+    happened as part of the FRE. Also records when the user clicks/taps the 'Set
+    as Default' button and if this selection was in the FRE or not. On Desktop,
+    if the choice screen is shown simultaneously in multiple browsers that all
+    have the same profile, the display event is only recorded once.
+  </summary>
+</histogram>
+
 <histogram name="Search.ContextualSearch.All.ResultsSeen" enum="Boolean"
     expires_after="never">
 <!-- expires-never: dashboard metric (internal: go/cs-metrics-dashboard) -->
@@ -1713,7 +1729,7 @@
 </histogram>
 
 <histogram name="Search.RelatedSearches.CarouselLastVisibleItemPosition"
-    units="position" expires_after="2023-12-31">
+    units="position" expires_after="2024-03-03">
   <owner>donnd@chromium.org</owner>
   <owner>gangwu@chromium.org</owner>
   <owner>related-searches-vteam@google.com</owner>
@@ -1739,7 +1755,7 @@
 </histogram>
 
 <histogram name="Search.RelatedSearches.CarouselScrolled" enum="Boolean"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>donnd@chromium.org</owner>
   <owner>gangwu@chromium.org</owner>
   <owner>related-searches-vteam@google.com</owner>
@@ -1777,7 +1793,7 @@
 </histogram>
 
 <histogram name="Search.RelatedSearches.QualifiedUsers" enum="Boolean"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>donnd@chromium.org</owner>
   <owner>related-searches-vteam@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/security/histograms.xml b/tools/metrics/histograms/metadata/security/histograms.xml
index cd48459c..1d53313 100644
--- a/tools/metrics/histograms/metadata/security/histograms.xml
+++ b/tools/metrics/histograms/metadata/security/histograms.xml
@@ -314,7 +314,7 @@
 </histogram>
 
 <histogram name="Security.PageInfo.AboutThisSiteStatus"
-    enum="AboutThisSiteStatus" expires_after="2024-01-07">
+    enum="AboutThisSiteStatus" expires_after="2024-03-10">
   <owner>dullweber@chromium.org</owner>
   <owner>olesiamarukhno@chromium.org</owner>
   <summary>
@@ -387,7 +387,7 @@
 </histogram>
 
 <histogram name="Security.PrivateNetworkAccess.PrivateIpInferrable"
-    enum="Boolean" expires_after="2023-12-31">
+    enum="Boolean" expires_after="2024-03-03">
   <owner>titouan@chromium.org</owner>
   <owner>lyf@chromium.org</owner>
   <owner>clamy@chromium.org</owner>
@@ -399,7 +399,7 @@
 </histogram>
 
 <histogram name="Security.PrivateNetworkAccess.PrivateIpResolveMatch"
-    enum="Boolean" expires_after="2023-12-31">
+    enum="Boolean" expires_after="2024-03-03">
   <owner>titouan@chromium.org</owner>
   <owner>lyf@chromium.org</owner>
   <owner>clamy@chromium.org</owner>
@@ -642,7 +642,7 @@
 </histogram>
 
 <histogram name="Security.SecurityLevel.OnComplete" enum="SecurityLevel"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>cthomp@chromium.org</owner>
   <owner>security-enamel@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
index d805958..b3848d1 100644
--- a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
+++ b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
@@ -333,30 +333,6 @@
   </token>
 </histogram>
 
-<histogram name="SegmentationPlatform.DeviceSwicther.TimeFromConsentToResult"
-    units="ms" expires_after="2024-01-07">
-  <owner>ssid@chromium.org</owner>
-  <owner>chrome-segmentation-platform@google.com</owner>
-  <summary>
-    The time taken from the time user enabled sync consent to the time result is
-    available for device switcher user segment. This includes the network delay
-    for downloading the device info data. The metric is recorded once for each
-    user at the time when the user enables sync on the device.
-  </summary>
-</histogram>
-
-<histogram name="SegmentationPlatform.DeviceSwicther.TimeFromStartupToResult"
-    units="ms" expires_after="2023-10-01">
-  <owner>ssid@chromium.org</owner>
-  <owner>chrome-segmentation-platform@google.com</owner>
-  <summary>
-    The time taken from the startup to the time result is available for the
-    device switcher user segment. The metric is recorded once for each user the
-    first time the device switcher segmentation is enabled, only if the user
-    already had sync enabled.
-  </summary>
-</histogram>
-
 <histogram
     name="SegmentationPlatform.FeatureProcessing.Error.{SegmentationModel}"
     enum="SegmentationPlatformFeatureProcessingError"
@@ -457,6 +433,27 @@
     way to check if a model is available, this histogram records an entry when
     model is requested and one when model is available. The difference should
     show how often a model is not returned.
+
+    Recorded every time the {SegmentationModel} model is updated, which can
+    happen at any time, but usually happens at least once during startup. If a
+    model becomes no longer available then we'll record a value of 3 (No model
+    metadata available) once before deleting the model metadata.
+  </summary>
+  <token key="SegmentationModel" variants="SegmentationModel"/>
+</histogram>
+
+<histogram
+    name="SegmentationPlatform.ModelDelivery.DeleteResult.{SegmentationModel}"
+    enum="BooleanSuccess" expires_after="2023-10-01">
+  <owner>salg@chromium.org</owner>
+  <owner>ssid@chromium.org</owner>
+  <owner>chrome-segmentation-platform@google.com</owner>
+  <summary>
+    Records whether a deleted {SegmentationModel} server segmentation model was
+    successfully deleted from the local storage.
+
+    Recorded after deleting the local data of a server model, should only happen
+    if a server update removes a model that was stored locally.
   </summary>
   <token key="SegmentationModel" variants="SegmentationModel"/>
 </histogram>
@@ -728,6 +725,23 @@
 </histogram>
 
 <histogram
+    name="SegmentationPlatform.SegmentInfoDatabase.ProtoDBUpdateResult.{SegmentationKey}"
+    units="BooleanSuccess" expires_after="2023-10-01">
+  <owner>salg@google.com</owner>
+  <owner>chrome-segmentation-platform@google.com</owner>
+  <summary>
+    Records result of persisting SegmentInfo changes to disk. This is separate
+    to the SegmentInfoDatabase's callback which runs after updating the
+    in-memory cache.
+
+    Recorded for each call to SegmentInfoDatabase::UpdateSegment, which happens
+    at least once for each segmentation key on startup and every time training
+    data is recorded or cleared.
+  </summary>
+  <token key="SegmentationKey" variants="SegmentationKey"/>
+</histogram>
+
+<histogram
     name="SegmentationPlatform.SegmentSelectionOnDemand.Duration.{SegmentationKey}.{SelectedSegment}"
     units="ms" expires_after="2023-10-01">
   <owner>shaktisahu@chromium.org</owner>
@@ -908,7 +922,7 @@
 
 <histogram
     name="SegmentationPlatform.SyncSessions.{TimeInterval}TabCountAtFirstSyncUpdate"
-    units="tabs" expires_after="2023-10-01">
+    units="tabs" expires_after="2024-02-04">
   <owner>ritikagup@google.com</owner>
   <owner>chrome-segmentation-platform@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/service/histograms.xml b/tools/metrics/histograms/metadata/service/histograms.xml
index 5f9e359..93bf7fe 100644
--- a/tools/metrics/histograms/metadata/service/histograms.xml
+++ b/tools/metrics/histograms/metadata/service/histograms.xml
@@ -1484,7 +1484,7 @@
 </histogram>
 
 <histogram name="ServiceWorker.StartWorker.Timeout.StartPurpose"
-    enum="ServiceWorkerMetrics.EventType" expires_after="2023-12-31">
+    enum="ServiceWorkerMetrics.EventType" expires_after="2024-03-03">
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -1496,7 +1496,7 @@
 </histogram>
 
 <histogram name="ServiceWorker.StartWorker.TimeoutPhase"
-    enum="EmbeddedWorkerStartingPhase" expires_after="2023-12-31">
+    enum="EmbeddedWorkerStartingPhase" expires_after="2024-03-03">
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -1506,6 +1506,22 @@
   </summary>
 </histogram>
 
+<histogram name="ServiceWorker.StaticRouter.{Resource}.CacheStorageError"
+    enum="CacheStorageErrorType" expires_after="2024-03-01">
+  <owner>yyanagisawa@chromium.org</owner>
+  <owner>chrome-worker@google.com</owner>
+  <summary>
+    Records the cache storage error when the cache source is set by a rule for
+    the ServiceWorker static routing API and the cache storage match call
+    returns a status instead of a result. This metric is recorded for
+    {Resource}.
+  </summary>
+  <token key="Resource">
+    <variant name="MainResource" summary="main resource"/>
+    <variant name="Subresource" summary="subresource"/>
+  </token>
+</histogram>
+
 <histogram name="ServiceWorker.Storage.DeleteAndStartOverResult"
     enum="ServiceWorkerDeleteAndStartOverResult" expires_after="2024-06-01">
   <owner>yyanagisawa@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/session/histograms.xml b/tools/metrics/histograms/metadata/session/histograms.xml
index 63d15ba6a..ec4cb79 100644
--- a/tools/metrics/histograms/metadata/session/histograms.xml
+++ b/tools/metrics/histograms/metadata/session/histograms.xml
@@ -872,7 +872,7 @@
 </histogram>
 
 <histogram name="Session.WebStates.LoadingTimeOnMainThread" units="ms"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>fedegermi@chromium.org</owner>
   <owner>sdefresne@chromium.org</owner>
   <summary>
@@ -898,7 +898,7 @@
 </histogram>
 
 <histogram name="Session.WebStates.NativeRestoreSession" enum="BooleanSuccess"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>justincohen@chromium.org</owner>
   <owner>ajuma@chromium.org</owner>
   <summary>
@@ -953,7 +953,7 @@
 </histogram>
 
 <histogram name="Session.WebStates.ReadFromFileTime" units="ms"
-    expires_after="2023-09-15">
+    expires_after="2024-09-15">
   <owner>justincohen@chromium.org</owner>
   <owner>rohitrao@chromium.org</owner>
   <summary>
@@ -963,7 +963,7 @@
 </histogram>
 
 <histogram name="Session.WebStates.SavingTimeOnMainThread" units="ms"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>fedegermi@chromium.org</owner>
   <owner>sdefresne@chromium.org</owner>
   <summary>
@@ -991,7 +991,7 @@
 </histogram>
 
 <histogram name="Session.WebStates.SerializedSize" units="KB"
-    expires_after="2023-10-08">
+    expires_after="2024-10-08">
   <owner>justincohen@chromium.org</owner>
   <owner>rohitrao@chromium.org</owner>
   <summary>
@@ -1002,7 +1002,7 @@
 </histogram>
 
 <histogram name="Session.WebStates.WriteToFileTime" units="ms"
-    expires_after="2023-09-15">
+    expires_after="2024-09-15">
   <owner>justincohen@chromium.org</owner>
   <owner>rohitrao@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/settings/histograms.xml b/tools/metrics/histograms/metadata/settings/histograms.xml
index 6f1a69e2..2e8e3bd2 100644
--- a/tools/metrics/histograms/metadata/settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/settings/histograms.xml
@@ -260,6 +260,16 @@
   </summary>
 </histogram>
 
+<histogram name="Settings.Preloading.DeprecatedRedirect" enum="BooleanEnabled"
+    expires_after="2024-03-30">
+  <owner>fmacintosh@google.com</owner>
+  <owner>koilos@google.com</owner>
+  <summary>
+    Whether or not navigations to the performance page occured because the user
+    was redirected from the deprecated preloading page.
+  </summary>
+</histogram>
+
 <histogram name="Settings.PreloadStatus.OnStartup" enum="BooleanEnabled"
     expires_after="2023-04-30">
   <obsolete>
diff --git a/tools/metrics/histograms/metadata/side_search/histograms.xml b/tools/metrics/histograms/metadata/side_search/histograms.xml
index b382b91..7a548b6 100644
--- a/tools/metrics/histograms/metadata/side_search/histograms.xml
+++ b/tools/metrics/histograms/metadata/side_search/histograms.xml
@@ -72,7 +72,7 @@
 </histogram>
 
 <histogram name="SideSearch.LoadDocumentTime" units="ms"
-    expires_after="2023-12-13">
+    expires_after="2024-03-03">
   <owner>yuhengh@chromium.org</owner>
   <owner>tluk@chromium.org</owner>
   <owner>romanarora@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml
index 693a735..4325869e 100644
--- a/tools/metrics/histograms/metadata/signin/histograms.xml
+++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -248,31 +248,17 @@
   </summary>
 </histogram>
 
-<histogram name="Signin.AccountTracker.RefreshAccountInfo.IsTrackingAccount"
-    enum="Boolean" expires_after="2023-12-31">
-  <owner>msarda@chromium.org</owner>
-  <owner>chrome-signin-team@google.com</owner>
-  <summary>
-    Indicates whether the account was seeded when the account info needs to be
-    refreshed.
-
-    This histogram will be used to decide whether the account needs to be seeded
-    during while refreshing the account info.
-  </summary>
-</histogram>
-
-<histogram name="Signin.AccountTracker.SeedAccountInfo.IsAccountIdEmpty"
-    enum="BooleanEmpty" expires_after="2023-12-31">
-  <owner>msarda@chromium.org</owner>
+<histogram name="Signin.AccountTracker.IsAccountIdEmpty" enum="BooleanEmpty"
+    expires_after="2023-12-31">
   <owner>sinhak@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
-    Indicates if the account being seeded by AccountTracker has an empty account
-    id. This is in general an error as the account with an empty id cannot be
-    tracked.
+    Indicates if the account being tracked by AccountTracker has an empty
+    account id. This is recorded whenever AccountTracker starts tracking a new
+    account.
 
     This histogram will be used to decide the severity of AccountTracker
-    receiving malformed account ids during the seeding process.
+    receiving malformed account ids.
   </summary>
 </histogram>
 
@@ -328,7 +314,7 @@
 </histogram>
 
 <histogram name="Signin.AndroidGetAccountIdsTime" units="ms"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>alexilin@chromium.org</owner>
   <owner>bsazonov@chromium.org</owner>
   <summary>
@@ -375,6 +361,19 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Signin.BoundSessionCredentials.CookieRotationGenerateAssertionDuration"
+    units="ms" expires_after="2024-01-14">
+  <owner>alexilin@chromium.org</owner>
+  <owner>msalama@chromium.org</owner>
+  <owner>chrome-signin-team@google.com</owner>
+  <summary>
+    Records how long the generation of assertion for the cookie rotation request
+    in a bound session has taken. Recorded every time a server-challenge is
+    required to rotate bound cookies.
+  </summary>
+</histogram>
+
 <histogram name="Signin.BoundSessionCredentials.CookieRotationResult"
     enum="BoundSessionCredentialsCookieRotationResult"
     expires_after="2024-01-14">
@@ -402,6 +401,20 @@
   </summary>
 </histogram>
 
+<histogram name="Signin.BoundSessionCredentials.SessionRegistrationResult"
+    enum="BoundSessionCredentialsSessionRegistrationResult"
+    expires_after="2024-01-14">
+  <owner>alexilin@chromium.org</owner>
+  <owner>msalama@chromium.org</owner>
+  <owner>chrome-signin-team@google.com</owner>
+  <summary>
+    Records the result of the bound session registration request. Recorded every
+    time Chrome attempts to register a bound session after an invitation from
+    the server via an HTTP header. This will not be recorded if Chrome couldn't
+    parse the server invitation or just decided to ignore it.
+  </summary>
+</histogram>
+
 <histogram base="true" name="Signin.CookieJar.ChromeAccountRelation"
     enum="AccountRelation" expires_after="never">
 <!-- expires-never: this histogram gives important user information about user
@@ -670,6 +683,16 @@
   </summary>
 </histogram>
 
+<histogram name="Signin.Intercept.HeuristicLatency" units="ms"
+    expires_after="2024-02-01">
+  <owner>ljjlee@google.com</owner>
+  <owner>chrome-signin-team@google.com</owner>
+  <summary>
+    Records the latency for determining the signin interception heuristic, which
+    runs for each signin interception.
+  </summary>
+</histogram>
+
 <histogram name="Signin.Intercept.HeuristicOutcome"
     enum="SigninInterceptHeuristicOutcome" expires_after="2024-02-11">
   <owner>droger@chromium.org</owner>
@@ -836,31 +859,63 @@
 </histogram>
 
 <histogram name="Signin.ListFamilyMembersRequest.Latency" units="ms"
-    expires_after="2023-12-31">
-  <owner>tju@google.com</owner>
-  <owner>chrome-kids-eng@google.com</owner>
-  <summary>Tracks the latency of calls to the Kids Management API.</summary>
-</histogram>
-
-<histogram name="Signin.ListFamilyMembersRequest.RetryCount" units="retries"
-    expires_after="2024-02-11">
+    expires_after="2024-03-03">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <summary>
-    Tracks the number of retries before a decisive status (OK or permanent
-    error).
+    This metric captures the latency of one individual call to the Kids
+    Management API that might be retried if an error occurs. For the overall
+    request latency in retrying fetchers, see
+    Signin.ListFamilyMembersRequest.OverallLatency. Googlers only: See
+    go/chrome-kids-backend-monitoring for backend-related metrics.
+  </summary>
+</histogram>
+
+<histogram name="Signin.ListFamilyMembersRequest.OverallLatency" units="ms"
+    expires_after="2024-02-04">
+  <owner>tju@google.com</owner>
+  <owner>chrome-kids-eng@google.com</owner>
+  <summary>
+    Kids Management API fetchers have a retry logic that might trigger multiple
+    individual calls to the Kids Management API one after the other. This metric
+    captures the total time, including all individual latencies tracked in
+    Signin.ListFamilyMembersRequest.Latency.
+  </summary>
+</histogram>
+
+<histogram name="Signin.ListFamilyMembersRequest.OverallStatus"
+    enum="SupervisedUserProtoFetcherStatus" expires_after="2024-02-04">
+  <owner>tju@google.com</owner>
+  <owner>chrome-kids-eng@google.com</owner>
+  <summary>
+    The final status of the fetch to the Kids Management API, visible to the
+    user. Statuses of intermediate fetches (including final one) are tracked in
+    the Signin.ListFamilyMembersRequest.Status metric.
+  </summary>
+</histogram>
+
+<histogram name="Signin.ListFamilyMembersRequest.RetryCount" units="retries"
+    expires_after="2024-02-04">
+  <owner>tju@google.com</owner>
+  <owner>chrome-kids-eng@google.com</owner>
+  <summary>
+    The number of retries before a decisive status (OK or permanent error).
   </summary>
 </histogram>
 
 <histogram name="Signin.ListFamilyMembersRequest.Status"
-    enum="SupervisedUserProtoFetcherStatus" expires_after="2023-12-31">
+    enum="SupervisedUserProtoFetcherStatus" expires_after="2024-03-03">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
-  <summary>The status of the fetch to the Kids Management API.</summary>
+  <summary>
+    The status of every fetch to the Kids Management API, including the retried
+    ones. The final status is case of retrying fetchers is recorded in
+    Signin.ListFamilyMembersRequest.OverallStatus.
+  </summary>
 </histogram>
 
 <histogram name="Signin.ListFamilyMembersRequest.{Status}.Latency" units="ms"
-    expires_after="2023-11-01">
+    expires_after="2024-02-04">
   <owner>tju@google.com</owner>
   <owner>chrome-kids-eng@google.com</owner>
   <summary>
@@ -1569,34 +1624,6 @@
   </summary>
 </histogram>
 
-<histogram name="Signin.UberTokenFailure" enum="GoogleServiceAuthError"
-    expires_after="never">
-<!-- expires-never: Uber tokens are required to add accounts to the Gaia
-cookies so we need to log failures for these operations for as long as Chrome
-adds accounts to the Gaia cookies. -->
-
-  <owner>msarda@chromium.org</owner>
-  <owner>droger@chromium.org</owner>
-  <summary>
-    Reason of failure to acquiring an ubertoken based on an already-minted
-    access token. Available on all OSes.
-  </summary>
-</histogram>
-
-<histogram name="Signin.UberTokenRetry" enum="GoogleServiceAuthError"
-    expires_after="never">
-<!-- expires-never: Uber tokens are required to add accounts to the Gaia
-cookies so we need to log retry resutls for these operations for as long as
-Chrome adds accounts to the Gaia cookies. -->
-
-  <owner>msarda@chromium.org</owner>
-  <owner>droger@chromium.org</owner>
-  <summary>
-    Retry reason of failure to acquire an ubertoken based on an already-minted
-    access token. Available on all OSes.
-  </summary>
-</histogram>
-
 <histogram name="Signin.UserRequestedWipeDataOnSignout" enum="BooleanRequested"
     expires_after="2024-02-25">
   <owner>triploblastic@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/startup/histograms.xml b/tools/metrics/histograms/metadata/startup/histograms.xml
index efe92b1..23250f9 100644
--- a/tools/metrics/histograms/metadata/startup/histograms.xml
+++ b/tools/metrics/histograms/metadata/startup/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="Startup.AfterStartupTaskCount" units="units"
-    expires_after="2024-01-14">
+    expires_after="2024-03-14">
   <owner>michaeln@chromium.org</owner>
   <summary>
     The number of after-startup tasks that were queued prior to startup
@@ -32,11 +32,11 @@
 </histogram>
 
 <histogram name="Startup.AfterStartupTaskDelayedUntilTime" units="ms"
-    expires_after="2022-06-19">
+    expires_after="2024-03-14">
   <owner>michaeln@chromium.org</owner>
   <summary>
     Time from the process creation until deferred after-startup tasks began
-    running.
+    running. The histogram was expired and extended in M119 again.
   </summary>
 </histogram>
 
@@ -79,7 +79,7 @@
 </histogram>
 
 <histogram name="Startup.Android.Cold.FirstSafeBrowsingResponseTime.Tabbed"
-    units="ms" expires_after="2024-01-07">
+    units="ms" expires_after="2024-03-10">
   <owner>pasko@chromium.org</owner>
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
@@ -870,6 +870,53 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Startup.Renderer.LoadTime.ApplicationStartToRendererStartRunLoop"
+    units="ms" expires_after="2024-09-01">
+  <owner>spvw@chromium.org</owner>
+  <owner>etienneb@chromium.org</owner>
+  <summary>
+    Time from application start to renderer run loop start.
+
+    Application start is a time recorded as early as possible in renderer
+    process startup. Application start is at the start of the renderer process'
+    chrome.exe:main, before chrome.dll is loaded.
+
+    This metric is only recorded on Windows, and is recorded every time a
+    renderer process starts its run loop, meaning that many instances of this
+    metric will be recorded throughout one execution of the browser.
+  </summary>
+</histogram>
+
+<histogram name="Startup.Renderer.LoadTime.ChromeMainToRendererStartRunLoop"
+    units="ms" expires_after="2024-09-01">
+  <owner>spvw@chromium.org</owner>
+  <owner>etienneb@chromium.org</owner>
+  <summary>
+    Time from when ChromeMain in the renderer process was entered to when the
+    renderer run loop was started.
+
+    This metric is only recorded on Windows, and is recorded every time a
+    renderer process starts its run loop, meaning that many instances of this
+    metric will be recorded throughout one execution of the browser.
+  </summary>
+</histogram>
+
+<histogram
+    name="Startup.Renderer.LoadTime.ProcessCreationToRendererStartRunLoop"
+    units="ms" expires_after="2024-09-01">
+  <owner>spvw@chromium.org</owner>
+  <owner>etienneb@chromium.org</owner>
+  <summary>
+    Time from when the renderer process was created (CreateProcess call) to when
+    the renderer run loop is started.
+
+    This metric is only recorded on Windows, and is recorded every time a
+    renderer process starts its run loop, meaning that many instances of this
+    metric will be recorded throughout one execution of the browser.
+  </summary>
+</histogram>
+
 <histogram name="Startup.ShowDefaultPromoFromApps"
     enum="MobileSessionCallerApp" expires_after="2023-05-23">
   <owner>djean@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml
index 2d0cbf7e..de428b4 100644
--- a/tools/metrics/histograms/metadata/sync/histograms.xml
+++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -114,6 +114,19 @@
   </summary>
 </histogram>
 
+<histogram name="Sync.BatchUpload.Requests" enum="SyncModelTypes"
+    expires_after="2024-09-14">
+  <owner>ankushkush@google.com</owner>
+  <owner>src/components/sync/OWNERS</owner>
+  <component>Services&gt;Sync</component>
+  <summary>
+    Logged when batch upload of local data for a data type is requested.
+
+    Note that at the time of writing, this metric only supports PASSWORDS,
+    BOOKMARKS and READING_LIST.
+  </summary>
+</histogram>
+
 <histogram name="Sync.BookmarkEntityReuploadNeeded.On{UpdateType}"
     enum="Boolean" expires_after="2024-02-20">
   <owner>rushans@google.com</owner>
@@ -351,7 +364,7 @@
 <histogram
     name="Sync.Crypto.CustomPassphraseKeyDerivationMethodOnSuccessfulDecryption"
     enum="SyncCustomPassphraseKeyDerivationMethodState"
-    expires_after="2024-01-09">
+    expires_after="2024-03-10">
   <owner>mmoskvitin@google.com</owner>
   <owner>treib@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -505,6 +518,21 @@
   </token>
 </histogram>
 
+<histogram name="Sync.EntityEncryptionSucceeded{SyncModelType}"
+    units="BooleanSuccess" expires_after="2024-09-01">
+  <owner>rushans@google.com</owner>
+  <owner>treib@chromium.org</owner>
+  <component>Services&gt;Sync</component>
+  <summary>
+    Recorded for each committed sync entity ({SyncModelType}) when encryption is
+    enabled (e.g. custom passphrase, always encrypted data type). The value is
+    whether the encryption succeeded.
+  </summary>
+  <token key="SyncModelType" variants="SyncModelType">
+    <variant name="" summary="Any type"/>
+  </token>
+</histogram>
+
 <histogram name="Sync.EntitySizeOnCommit{SyncModelType}" units="bytes"
     expires_after="2024-02-20">
   <owner>ankushkush@google.com</owner>
@@ -518,7 +546,7 @@
 </histogram>
 
 <histogram name="Sync.FCMInstanceIdTokenRetrievalStatus"
-    enum="InstanceIDResult" expires_after="2023-10-22">
+    enum="InstanceIDResult" expires_after="2024-09-06">
   <owner>rushans@google.com</owner>
   <owner>treib@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -540,6 +568,19 @@
   </summary>
 </histogram>
 
+<histogram name="Sync.FcmRegistrationTokenFetchTime" units="ms"
+    expires_after="2024-09-06">
+  <owner>rushans@google.com</owner>
+  <owner>treib@chromium.org</owner>
+  <component>Services&gt;Sync</component>
+  <summary>
+    Records time required to obtain an FCM registration token for Sync
+    invalidations. Recorded on successful token fetch excluding token validation
+    requests (Sync.FCMInstanceIdTokenRetrievalStatus can be used to compare with
+    token fetch failure count).
+  </summary>
+</histogram>
+
 <histogram name="Sync.History.DatabaseError" enum="SyncHistoryDatabaseError"
     expires_after="2024-01-14">
   <owner>treib@chromium.org</owner>
@@ -978,7 +1019,7 @@
 </histogram>
 
 <histogram name="Sync.ModelTypeTimeUntilEncryptionKeyFound2{SyncModelType}"
-    units="GetUpdates" expires_after="2023-10-10">
+    units="GetUpdates" expires_after="2024-10-10">
   <owner>victorvianna@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -999,7 +1040,7 @@
 
 <histogram
     name="Sync.ModelTypeUndecryptablePendingUpdatesDropped{SyncModelType}"
-    units="SyncEntity" expires_after="2023-10-10">
+    units="SyncEntity" expires_after="2024-10-10">
   <owner>victorvianna@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -1098,6 +1139,20 @@
   </token>
 </histogram>
 
+<histogram name="Sync.OutgoingPassordSharingInvitation.CommitError"
+    units="OutgoingPasswordSharingInvitationCommitError"
+    expires_after="2024-09-18">
+  <owner>rushans@google.com</owner>
+  <owner>src/components/sync/OWNERS</owner>
+  <component>Services&gt;Sync</component>
+  <summary>
+    Recorded if commit of outgoing password sharing invitations fails with a
+    datatype-specific error code returned from the server. Records the returned
+    error. Sync.CommitResponse.OUTGOING_PASSWORD_SHARING_INVITATION can be used
+    to compare with the total number of commit requests.
+  </summary>
+</histogram>
+
 <histogram name="Sync.PassphraseType" enum="SyncPassphraseType"
     expires_after="2024-01-14">
   <owner>treib@chromium.org</owner>
@@ -1139,6 +1194,20 @@
   </summary>
 </histogram>
 
+<histogram name="Sync.PasswordsBatchUpload.Count" units="passwords"
+    expires_after="2024-09-14">
+  <owner>ankushkush@google.com</owner>
+  <owner>src/components/sync/OWNERS</owner>
+  <component>Services&gt;Sync</component>
+  <summary>
+    Logs the count of local passwords moved to the account store.
+
+    This is logged when, upon a batch upload request, passwords have been moved
+    to the account store. Note that passwords may not have been uploaded to the
+    server yet. Upload happens as part of the regular commit process.
+  </summary>
+</histogram>
+
 <histogram name="Sync.PendingInvalidationStatus"
     enum="PendingInvalidationStatus" expires_after="2024-01-14">
   <owner>shabdan@google.com</owner>
@@ -1151,8 +1220,20 @@
   </summary>
 </histogram>
 
+<histogram name="Sync.PlaceholderTabResyncResult"
+    enum="SyncPlaceholderTabResyncResult" expires_after="2024-03-10">
+  <owner>bjfong@google.com</owner>
+  <owner>ckitagawa@chromium.org</owner>
+  <component>Services&gt;Sync</component>
+  <summary>
+    Records the result of whether the placeholder tab had its local session
+    found, had its data resynced successfully, or remained unsynced. Recorded
+    once for each placeholder tab during session restore.
+  </summary>
+</histogram>
+
 <histogram name="Sync.PostedClientToServerMessage"
-    enum="SyncClientToServerMessageContents" expires_after="2024-01-07">
+    enum="SyncClientToServerMessageContents" expires_after="2024-03-10">
   <owner>mastiz@chromium.org</owner>
   <component>Services&gt;Sync</component>
   <summary>
@@ -1162,7 +1243,7 @@
 </histogram>
 
 <histogram name="Sync.PostedClientToServerMessageError2" enum="SyncErrorType"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>mastiz@chromium.org</owner>
   <owner>treib@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -1245,7 +1326,7 @@
 </histogram>
 
 <histogram name="Sync.RecordedUserEventType" enum="SyncUserEventType"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>mmoskvitin@google.com</owner>
   <owner>treib@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -1284,7 +1365,7 @@
 </histogram>
 
 <histogram name="Sync.SharingMessage.CommitResult"
-    enum="SyncSharingMessageCommitErrorCode" expires_after="2023-12-31">
+    enum="SyncSharingMessageCommitErrorCode" expires_after="2024-03-03">
   <owner>rushans@google.com</owner>
   <owner>treib@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -1437,7 +1518,7 @@
 </histogram>
 
 <histogram name="Sync.SyncErrorInfobarDisplayed" enum="SyncErrorInfobarTypes"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>jlebel@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <component>Services&gt;Sync</component>
@@ -1813,7 +1894,7 @@
 </histogram>
 
 <histogram name="Sync.TrustedVaultLocalDataDecryptionIsSuccessful"
-    enum="BooleanSuccess" expires_after="2023-10-08">
+    enum="BooleanSuccess" expires_after="2024-04-08">
   <owner>mmoskvitin@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <component>Services&gt;Sync</component>
@@ -1924,7 +2005,7 @@
 </histogram>
 
 <histogram name="Sync.URLFetchResponse"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2023-12-31">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2024-03-03">
   <owner>mastiz@chromium.org</owner>
   <owner>treib@chromium.org</owner>
   <component>Services&gt;Sync</component>
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml
index d9065e6..486f029 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -59,15 +59,6 @@
                get real interactable content displayed."/>
 </variants>
 
-<variants name="Tabs_TabUsageIntervalLength">
-  <variant name="_30" summary="30 seconds"/>
-  <variant name="_60" summary="1 minute"/>
-  <variant name="_600" summary="10 minutes"/>
-  <variant name="_3600" summary="1 hour"/>
-  <variant name="_18000" summary="5 hours"/>
-  <variant name="_43200" summary="12 hours"/>
-</variants>
-
 <histogram name="Discarding.DailyDiscards{TabDiscardReason}" units="tabs"
     expires_after="2024-02-22">
   <owner>vovoy@chromium.org</owner>
@@ -413,7 +404,7 @@
 </histogram>
 
 <histogram name="Tab.RendererTermination.TotalTabCount" units="tabs"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>ajuma@chromium.org</owner>
   <owner>thegreenfrog@chromium.org</owner>
   <summary>
@@ -527,7 +518,7 @@
 </histogram>
 
 <histogram name="TabGroups.SavedTabGroupAge" units="minutes"
-    expires_after="2023-12-27">
+    expires_after="2024-03-03">
   <owner>dljames@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -538,7 +529,7 @@
 </histogram>
 
 <histogram name="TabGroups.SavedTabGroupCount" units="groups"
-    expires_after="2023-12-27">
+    expires_after="2024-03-03">
   <owner>dljames@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -593,18 +584,6 @@
   </summary>
 </histogram>
 
-<histogram name="TabGroups.SessionsPerGroup" units="sessions"
-    expires_after="2024-02-25">
-  <owner>yusufo@chromium.org</owner>
-  <owner>wychen@chromium.org</owner>
-  <summary>
-    This histogram records the number of sessions of a selected tab group
-    whenever Chrome comes to the foreground, or switch tab in the tab switcher.
-    This number is accumulated until that group id is outdated, meaning all the
-    tabs with that group id has been closed.
-  </summary>
-</histogram>
-
 <histogram name="TabGroups.TabGroupBubble.TabCount" units="tabs"
     expires_after="2024-02-25">
   <owner>sophiechang@chromium.org</owner>
@@ -668,9 +647,9 @@
 </histogram>
 
 <histogram name="TabGroups.UserGroupCount" units="groups"
-    expires_after="2024-01-14">
-  <owner>yusufo@chromium.org</owner>
-  <owner>wychen@chromium.org</owner>
+    expires_after="2024-07-14">
+  <owner>ckitagawa@chromium.org</owner>
+  <owner>meiliang@chromium.org</owner>
   <summary>
     This histogram records the number of tab groups whenever Chrome comes to the
     foreground.
@@ -687,16 +666,6 @@
   </summary>
 </histogram>
 
-<histogram name="TabGroups.UserNamedGroupCount" units="groups"
-    expires_after="2024-01-14">
-  <owner>yusufo@chromium.org</owner>
-  <owner>wychen@chromium.org</owner>
-  <summary>
-    This histogram records the number of tab groups that have customized group
-    name whenever Chrome comes to the foreground.
-  </summary>
-</histogram>
-
 <histogram name="TabGroups.UserPinnedTabCountPerLoad" units="tabs"
     expires_after="2024-01-14">
   <owner>dpenning@chromium.org</owner>
@@ -981,7 +950,7 @@
 </histogram>
 
 <histogram name="TabManager.Discarding.DiscardCount" units="Discards"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>chrisha@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -1022,7 +991,7 @@
 </histogram>
 
 <histogram name="TabManager.Discarding.ReloadCount" units="Reloads"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>chrisha@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -1319,7 +1288,7 @@
 </histogram>
 
 <histogram name="Tabs.PageLoad.TimeSinceActive" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>emshack@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -1329,7 +1298,7 @@
 </histogram>
 
 <histogram name="Tabs.PageLoad.TimeSinceCreated" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>emshack@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -1633,27 +1602,6 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SavedTabLoadTime.{SavedTabMethod}.{SavedTabLoadResult}"
-    units="ms" expires_after="2024-05-22">
-  <owner>davidjm@chromium.org</owner>
-  <owner>nyquist@chromium.org</owner>
-  <owner>dtrainor@chromium.org</owner>
-  <owner>yusufo@chromium.org</owner>
-  <summary>
-    Records load time of a Tab using {SavedTabMethod} storage and whether the
-    {SavedTabLoadResult}
-  </summary>
-  <token key="SavedTabMethod">
-    <variant name="CriticalPersistedTabData"
-        summary="CriticalPersistedTabData"/>
-    <variant name="TabState" summary="TabState"/>
-  </token>
-  <token key="SavedTabLoadResult">
-    <variant name="Exists" summary="Tab storage file was found."/>
-    <variant name="Null" summary="Tab storage file was not found."/>
-  </token>
-</histogram>
-
 <histogram name="Tabs.ScrubbedInInterval.KeyPress" units="tabs"
     expires_after="2023-05-07">
   <owner>corising@chromium.org</owner>
@@ -1710,7 +1658,7 @@
 </histogram>
 
 <histogram name="Tabs.Startup.TabCount.{TabType}" units="count"
-    expires_after="2024-01-08">
+    expires_after="2024-03-10">
   <owner>davidjm@chromium.org</owner>
   <owner>nyquist@chromium.org</owner>
   <summary>Records the number of {TabType} Tabs loaded on startup.</summary>
@@ -2378,21 +2326,6 @@
   </summary>
 </histogram>
 
-<histogram
-    name="Tabs.UnusedAndClosedInInterval.Count{Tabs_TabUsageIntervalLength}"
-    units="tabs" expires_after="M95">
-  <owner>chrisha@chromium.org</owner>
-  <owner>fdoray@chromium.org</owner>
-  <owner>catan-team@chromium.org</owner>
-  <summary>
-    The number of tabs that haven't been interacted with, visible or audible
-    over a given interval time, but which no longer exist at all at the end of
-    this interval. {Tabs_TabUsageIntervalLength}
-  </summary>
-  <token key="Tabs_TabUsageIntervalLength"
-      variants="Tabs_TabUsageIntervalLength"/>
-</histogram>
-
 <histogram name="Tabs.UnusedCountAtStartup" units="tabs"
     expires_after="2024-01-15">
   <owner>pakzhygitov@google.com</owner>
@@ -2403,49 +2336,6 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.UnusedInInterval.Count{Tabs_TabUsageIntervalLength}"
-    units="tabs" expires_after="M95">
-  <owner>chrisha@chromium.org</owner>
-  <owner>fdoray@chromium.org</owner>
-  <owner>catan-team@chromium.org</owner>
-  <summary>
-    The number of tabs that haven't been interacted with, visible or audible or
-    visible during a given interval of time and still exist at the end of this
-    interval. {Tabs_TabUsageIntervalLength}
-  </summary>
-  <token key="Tabs_TabUsageIntervalLength"
-      variants="Tabs_TabUsageIntervalLength"/>
-</histogram>
-
-<histogram
-    name="Tabs.UsedAndClosedInInterval.Count{Tabs_TabUsageIntervalLength}"
-    units="tabs" expires_after="M95">
-  <owner>chrisha@chromium.org</owner>
-  <owner>fdoray@chromium.org</owner>
-  <owner>catan-team@chromium.org</owner>
-  <summary>
-    The number of tabs that have been interacted with, visible or audible over a
-    given interval of time, but which no longer exist at all at the end of this
-    interval. {Tabs_TabUsageIntervalLength}
-  </summary>
-  <token key="Tabs_TabUsageIntervalLength"
-      variants="Tabs_TabUsageIntervalLength"/>
-</histogram>
-
-<histogram name="Tabs.UsedInInterval.Count{Tabs_TabUsageIntervalLength}"
-    units="tabs" expires_after="M95">
-  <owner>chrisha@chromium.org</owner>
-  <owner>fdoray@chromium.org</owner>
-  <owner>catan-team@chromium.org</owner>
-  <summary>
-    The number of tabs that have been interacted with, visible or audible during
-    a given interval of time, includes tabs that don't exist at the end of this
-    interval. {Tabs_TabUsageIntervalLength}
-  </summary>
-  <token key="Tabs_TabUsageIntervalLength"
-      variants="Tabs_TabUsageIntervalLength"/>
-</histogram>
-
 <histogram name="Tabs.WindowCount{BatteryState}" units="windows"
     expires_after="never">
 <!-- expires-never: https://crbug.com/966137 -->
diff --git a/tools/metrics/histograms/metadata/translate/histograms.xml b/tools/metrics/histograms/metadata/translate/histograms.xml
index e2acddeb..ce6f898b 100644
--- a/tools/metrics/histograms/metadata/translate/histograms.xml
+++ b/tools/metrics/histograms/metadata/translate/histograms.xml
@@ -303,7 +303,7 @@
 </histogram>
 
 <histogram name="Translate.PageLoad.InitialSourceLanguage"
-    enum="LocaleCodeISO639" expires_after="2024-01-07">
+    enum="LocaleCodeISO639" expires_after="2024-03-10">
   <owner>megjablon@google.com</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -556,7 +556,7 @@
 </histogram>
 
 <histogram name="Translate.Translation.ShowErrorUI" enum="TranslateError"
-    expires_after="2023-12-10">
+    expires_after="2024-03-10">
   <owner>megjablon@google.com</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ukm/histograms.xml b/tools/metrics/histograms/metadata/ukm/histograms.xml
index 7047e26..a153f34 100644
--- a/tools/metrics/histograms/metadata/ukm/histograms.xml
+++ b/tools/metrics/histograms/metadata/ukm/histograms.xml
@@ -81,7 +81,7 @@
 </histogram>
 
 <histogram name="UKM.Entries.Dropped" enum="UkmDataDroppedReason"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -140,7 +140,7 @@
 </histogram>
 
 <histogram name="UKM.Entries.Recorded.ByEntryHash" enum="UkmEventNameHash"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>yrsun@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -152,7 +152,7 @@
 </histogram>
 
 <histogram name="UKM.Entries.SerializedCount2" units="entries"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>Number of serialized UKM entries when storing a UKM log.</summary>
@@ -199,7 +199,7 @@
   </summary>
 </histogram>
 
-<histogram name="UKM.LogSize.OnSuccess" units="KB" expires_after="2024-01-07">
+<histogram name="UKM.LogSize.OnSuccess" units="KB" expires_after="2024-03-10">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -222,7 +222,7 @@
 </histogram>
 
 <histogram name="UKM.LogUpload.ResponseOrErrorCode"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2024-01-07">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2024-03-10">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -312,7 +312,7 @@
 </histogram>
 
 <histogram name="UKM.Sources.KeptSourcesCount" units="sources"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -351,7 +351,7 @@
 </histogram>
 
 <histogram name="UKM.Sources.UnsentSourcesCount" units="sources"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
@@ -371,7 +371,7 @@
 </histogram>
 
 <histogram name="UKM.UnsentLogs.NumDropped" units="units"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/uma/histograms.xml b/tools/metrics/histograms/metadata/uma/histograms.xml
index 79c3581..4235b80 100644
--- a/tools/metrics/histograms/metadata/uma/histograms.xml
+++ b/tools/metrics/histograms/metadata/uma/histograms.xml
@@ -57,7 +57,7 @@
 </histogram>
 
 <histogram name="Histogram.MismatchedConstructionArguments"
-    enum="HistogramNameHash" expires_after="2023-12-31">
+    enum="HistogramNameHash" expires_after="2024-03-03">
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -186,7 +186,7 @@
   </summary>
 </histogram>
 
-<histogram name="UMA.ClientIdCleared" enum="Boolean" expires_after="2023-12-24">
+<histogram name="UMA.ClientIdCleared" enum="Boolean" expires_after="2024-03-10">
   <owner>pdyson@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -266,7 +266,7 @@
 </histogram>
 
 <histogram name="UMA.EntropySourceType" enum="UmaEntropySourceType"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -276,7 +276,7 @@
 </histogram>
 
 <histogram name="UMA.ExternalExperiment.GroupCount" units="groups"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -288,7 +288,7 @@
 </histogram>
 
 <histogram name="UMA.FileMetricsProvider.AccessResult"
-    enum="FileMetricsProviderAccessResult" expires_after="2023-12-31">
+    enum="FileMetricsProviderAccessResult" expires_after="2024-03-03">
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -331,7 +331,6 @@
     are successfully closed.
   </summary>
   <token key="Provider">
-    <variant name="AwBackgroundTracingMetricsProvider"/>
     <variant name="BackgroundTracingMetricsProvider"/>
     <variant name="FileMetricsProvider"/>
     <variant name="StructuredMetricsProvider"/>
@@ -743,7 +742,7 @@
 </histogram>
 
 <histogram name="UMA.ProtoCompressionRatio" units="%"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>asvitkine@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -825,6 +824,17 @@
   </summary>
 </histogram>
 
+<histogram name="UMA.StatisticsRecorder.LockWaitTime" units="ms"
+    expires_after="2024-03-01">
+  <owner>asvitkine@chromium.org</owner>
+  <owner>src/base/metrics/OWNERS</owner>
+  <summary>
+    Records the sum of the accumulating wait times for acquiring the lock in
+    StatisticsRecorder. This is logged with every UMA log and reset to 0 at that
+    time.
+  </summary>
+</histogram>
+
 <histogram name="UMA.StructuredMetrics.EventFileSize" units="KB"
     expires_after="2024-02-01">
   <owner>tby@chromium.org</owner>
@@ -956,7 +966,7 @@
 </histogram>
 
 <histogram name="UMA.TruncatedEvents.UserAction" units="events"
-    expires_after="2024-02-25">
+    expires_after="2024-03-10">
   <owner>rkaplow@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/update_engine/histograms.xml b/tools/metrics/histograms/metadata/update_engine/histograms.xml
index 3dcba89a..53ebe7c 100644
--- a/tools/metrics/histograms/metadata/update_engine/histograms.xml
+++ b/tools/metrics/histograms/metadata/update_engine/histograms.xml
@@ -39,7 +39,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.Attempt.DownloadErrorCode"
-    enum="UpdateEngineDownloadErrorCode" expires_after="2024-01-01">
+    enum="UpdateEngineDownloadErrorCode" expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -96,7 +96,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.Attempt.InternalErrorCode"
-    enum="UpdateEngineErrorCode" expires_after="2024-01-01">
+    enum="UpdateEngineErrorCode" expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -110,7 +110,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.Attempt.Number" units="count"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -124,7 +124,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.Attempt.PayloadBytesDownloadedMiB" units="MiB"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -181,7 +181,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.Attempt.Result" enum="UpdateEngineAttemptResult"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -239,7 +239,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.CertificateCheck.UpdateCheck"
-    enum="UpdateEngineCertificateCheckStatus" expires_after="2024-01-01">
+    enum="UpdateEngineCertificateCheckStatus" expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -268,7 +268,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.Check.Reaction" enum="UpdateEngineCheckReaction"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -284,7 +284,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.Check.Result" enum="UpdateEngineCheckResult"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -365,7 +365,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.ConsecutiveUpdate.Count" units="updates"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -391,7 +391,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.ConsumerAutoUpdate" enum="BooleanOptedOut"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>yuanpengni@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -415,8 +415,30 @@
   </summary>
 </histogram>
 
+<histogram name="UpdateEngine.EnterpriseRollback.BlockedByFSI"
+    enum="UpdateEngineChromeOsVersionPrefix" expires_after="2026-01-01">
+  <owner>mpolzer@google.com</owner>
+  <owner>crisguerrero@chromium.org</owner>
+  <owner>chromeos-commercial-remote-management@google.com</owner>
+  <summary>
+    First section of the ChromeOS version to which an enterprise rollback
+    (rollback initiated by the admin of the device) has failed because Omaha
+    determined the device may not be able to run the rollback image based on
+    FSI.
+
+    This is a sparse histogram, since the possible valid values are stable
+    ChromeOS version prefixes (usually one per milestone).
+
+    Example value: 10323 (meaning M65 stable).
+
+    This is reported after an Omaha response with no rollback because of FSI.
+
+    This metric is specific to ChromeOS.
+  </summary>
+</histogram>
+
 <histogram name="UpdateEngine.EnterpriseRollback.Failure"
-    enum="UpdateEngineChromeOsVersionPrefix" expires_after="2023-11-30">
+    enum="UpdateEngineChromeOsVersionPrefix" expires_after="2024-03-10">
   <owner>mpolzer@google.com</owner>
   <owner>crisguerrero@chromium.org</owner>
   <owner>chromeos-commercial-remote-management@google.com</owner>
@@ -454,7 +476,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.FailedUpdateCount" units="count"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -547,7 +569,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.SuccessfulUpdate.AttemptCount" units="count"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -685,7 +707,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.SuccessfulUpdate.PayloadType"
-    enum="UpdateEnginePayloadFormat" expires_after="2024-01-01">
+    enum="UpdateEnginePayloadFormat" expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -712,7 +734,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.SuccessfulUpdate.TotalDurationMinutes"
-    units="minutes" expires_after="2024-01-01">
+    units="minutes" expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -727,7 +749,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.SuccessfulUpdate.TotalDurationUptimeMinutes"
-    units="minutes" expires_after="2024-01-01">
+    units="minutes" expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -770,7 +792,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.TimeToRebootMinutes" units="minutes"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/v8/histograms.xml b/tools/metrics/histograms/metadata/v8/histograms.xml
index 4a568e90..2268b06 100644
--- a/tools/metrics/histograms/metadata/v8/histograms.xml
+++ b/tools/metrics/histograms/metadata/v8/histograms.xml
@@ -77,11 +77,6 @@
   </summary>
 </histogram>
 
-<histogram name="V8.CodeCacheSizeRatio" units="%" expires_after="2022-05-01">
-  <owner>yangguo@chromium.org</owner>
-  <summary>Cache size to source size ratio when caching compiled code.</summary>
-</histogram>
-
 <histogram name="V8.CollectSourcePositions" units="microseconds"
     expires_after="M85">
   <owner>delphick@chromium.org</owner>
@@ -180,7 +175,7 @@
 </histogram>
 
 <histogram name="V8.CompileScriptMicroSeconds" units="microseconds"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>leszeks@chromium.org</owner>
   <owner>v8-runtime@google.com</owner>
   <summary>
@@ -1187,7 +1182,7 @@
 </histogram>
 
 <histogram name="V8.LiftoffBailoutReasons" enum="LiftoffBailoutReason"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>ecmziegler@chromium.org</owner>
   <owner>adamk@chromium.org</owner>
   <owner>clemensb@chromium.org</owner>
@@ -1529,7 +1524,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeTotalBackground" units="microseconds"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>tebbi@chromium.org</owner>
   <owner>mslekova@chromium.org</owner>
   <summary>
@@ -1541,7 +1536,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeTotalForeground" units="microseconds"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>tebbi@chromium.org</owner>
   <owner>mslekova@chromium.org</owner>
   <summary>
@@ -1553,7 +1548,7 @@
 </histogram>
 
 <histogram name="V8.TurboFanOptimizeTotalTime" units="microseconds"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>tebbi@chromium.org</owner>
   <owner>mslekova@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/variations/histograms.xml b/tools/metrics/histograms/metadata/variations/histograms.xml
index 73fc779d..bebaea01 100644
--- a/tools/metrics/histograms/metadata/variations/histograms.xml
+++ b/tools/metrics/histograms/metadata/variations/histograms.xml
@@ -47,7 +47,7 @@
 </histogram>
 
 <histogram name="Variations.AppSeedFreshness" units="minutes"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>ntfschr@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -702,7 +702,7 @@
 </histogram>
 
 <histogram name="Variations.WebViewDownloadJobInterval" units="minutes"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>ntfschr@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -713,7 +713,7 @@
 </histogram>
 
 <histogram name="Variations.WebViewDownloadJobQueueTime" units="minutes"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>ntfschr@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/web_apk/histograms.xml b/tools/metrics/histograms/metadata/web_apk/histograms.xml
index 7d8e8ec..efd2afd 100644
--- a/tools/metrics/histograms/metadata/web_apk/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_apk/histograms.xml
@@ -86,7 +86,7 @@
 </histogram>
 
 <histogram name="WebApk.Install.GooglePlayErrorCode"
-    enum="WebApkInstallGooglePlayErrorCode" expires_after="2024-01-07">
+    enum="WebApkInstallGooglePlayErrorCode" expires_after="2024-03-10">
   <owner>hartmanng@chromium.org</owner>
   <owner>src/chrome/android/webapk/OWNERS</owner>
   <summary>
@@ -164,7 +164,7 @@
 </histogram>
 
 <histogram name="WebApk.Install.RequestTokenDurationV2" units="ms"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>hartmanng@chromium.org</owner>
   <owner>rayankans@chromium.org</owner>
   <owner>src/chrome/android/webapk/OWNERS</owner>
@@ -178,7 +178,7 @@
 </histogram>
 
 <histogram name="WebApk.Install.UserTheme" enum="WebApkUserTheme"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>johnwes@google.com</owner>
   <owner>src/chrome/android/webapk/OWNERS</owner>
   <summary>
@@ -309,7 +309,7 @@
 </histogram>
 
 <histogram name="WebApk.Update.DidGetInstallableData"
-    enum="WebApkUpdateManifestResult" expires_after="2024-01-07">
+    enum="WebApkUpdateManifestResult" expires_after="2024-03-10">
   <owner>eirage@chromium.org</owner>
   <owner>hartmanng@chromium.org</owner>
   <owner>src/chrome/android/webapk/OWNERS</owner>
diff --git a/tools/metrics/histograms/metadata/web_core/histograms.xml b/tools/metrics/histograms/metadata/web_core/histograms.xml
index b6b97a4..2416d16 100644
--- a/tools/metrics/histograms/metadata/web_core/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_core/histograms.xml
@@ -255,7 +255,7 @@
 </histogram>
 
 <histogram name="WebCore.IndexedDB.ErrorDuringForceCloseAborts"
-    enum="LevelDBStatus" expires_after="2024-05-24">
+    enum="LevelDBStatus" expires_after="2023-09-07">
   <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -768,6 +768,16 @@
   <summary>Whether a parsing blocking script was streamed or not.</summary>
 </histogram>
 
+<histogram name="WebCore.Scripts.V8CrowdsourcedCompileHints.ModelQuality"
+    enum="V8CompileHintsModelQuality" expires_after="2024-09-11">
+  <owner>marja@chromium.org</owner>
+  <owner>v8-loading@google.com</owner>
+  <owner>chrome-intelligence-core@google.com</owner>
+  <summary>
+    Whether we got a V8CompileHints model and whether it was good quality.
+  </summary>
+</histogram>
+
 <histogram name="WebCore.WebSocket.SendType" enum="WebSocketSendType"
     expires_after="2021-10-17">
   <owner>yhirano@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/web_rtc/histograms.xml b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
index c7d059b..79dca2f 100644
--- a/tools/metrics/histograms/metadata/web_rtc/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
@@ -104,7 +104,7 @@
 </variants>
 
 <histogram name="WebRTC.Audio.Agc.InputClippingRate" units="%"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>silen@chromium.org</owner>
   <owner>alessiob@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -115,7 +115,7 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.Agc2.DigitalGainApplied" units="dB"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>alessiob@chromium.org</owner>
   <owner>silen@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -141,7 +141,7 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.Agc2.FixedDigitalGainCurveRegion.{Region}"
-    units="seconds" expires_after="2023-12-31">
+    units="seconds" expires_after="2024-03-03">
   <owner>alessiob@chromium.org</owner>
   <owner>silen@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -173,7 +173,7 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.Apm.RecommendedInputVolume.OnChangeToMatchTarget"
-    units="volume" expires_after="2023-12-31">
+    units="volume" expires_after="2024-03-03">
   <owner>silen@chromium.org</owner>
   <owner>alessiob@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -185,7 +185,7 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.Apm.{InputVolumeType}.OnChange" units="volume"
-    expires_after="2023-12-31">
+    expires_after="2024-03-03">
   <owner>silen@chromium.org</owner>
   <owner>alessiob@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -200,7 +200,7 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.Apm.{InputVolumeType}.{Metric}Average"
-    units="volume" expires_after="2023-12-31">
+    units="volume" expires_after="2024-03-03">
   <owner>silen@chromium.org</owner>
   <owner>alessiob@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -221,7 +221,7 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.Apm.{InputVolumeType}.{Metric}Rate"
-    units="changes/minute" expires_after="2023-12-31">
+    units="changes/minute" expires_after="2024-03-03">
   <owner>silen@chromium.org</owner>
   <owner>alessiob@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -849,7 +849,7 @@
 </histogram>
 
 <histogram name="WebRTC.Call.EstimatedSendBitrateInKbps" units="kbps"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>holmer@chromium.org</owner>
   <summary>
     Average estimated send bitrate during a call, counted from first packet sent
@@ -1100,7 +1100,7 @@
 </histogram>
 
 <histogram name="WebRTC.DesktopCapture.Win.{Capturer}CapturerFrameTime"
-    units="ms" expires_after="2024-01-10">
+    units="ms" expires_after="2024-03-10">
   <owner>alcooper@chromium.org</owner>
   <owner>henrika@chromium.org</owner>
   <owner>edgecapabilitiesdev@microsoft.com</owner>
@@ -1168,7 +1168,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.AddIceCandidate"
-    enum="AddIceCandidateResult" expires_after="2023-12-31">
+    enum="AddIceCandidateResult" expires_after="2024-03-03">
   <owner>hta@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
@@ -1244,7 +1244,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.ConnectionState"
-    enum="IceConnectionStates" expires_after="2023-12-31">
+    enum="IceConnectionStates" expires_after="2024-03-03">
   <owner>hta@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
@@ -1267,7 +1267,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.Duration.Network" units="microseconds"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>handellm@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
@@ -1299,7 +1299,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.Duration.Worker" units="microseconds"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>handellm@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
@@ -1397,7 +1397,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.Latency.Network" units="microseconds"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>handellm@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
@@ -1413,7 +1413,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.Latency.Signaling" units="microseconds"
-    expires_after="2024-01-07">
+    expires_after="2024-03-10">
   <owner>handellm@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
@@ -1975,7 +1975,7 @@
 </histogram>
 
 <histogram name="WebRTC.UserMediaRequest.Result2"
-    enum="MediaStreamRequestResult2" expires_after="2023-12-31">
+    enum="MediaStreamRequestResult2" expires_after="2024-03-03">
   <owner>toprice@chromium.org</owner>
   <owner>agpalak@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/webapps/histograms.xml b/tools/metrics/histograms/metadata/webapps/histograms.xml
index 255524c3..101dc898 100644
--- a/tools/metrics/histograms/metadata/webapps/histograms.xml
+++ b/tools/metrics/histograms/metadata/webapps/histograms.xml
@@ -701,7 +701,7 @@
 </histogram>
 
 <histogram name="Webapp.Install.DisplayMode2" enum="WebAppDisplayMode"
-    expires_after="2024-01-01">
+    expires_after="2024-03-03">
   <owner>peter@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -711,6 +711,16 @@
   </summary>
 </histogram>
 
+<histogram name="WebApp.Install.FaviconSize" units="pixels"
+    expires_after="2024-06-01">
+  <owner>eirage@chromium.org</owner>
+  <owner>src/chrome/android/webapk/OWNERS</owner>
+  <summary>
+    When PWA installable check is trying to download the favicon, records the
+    selected favicon size (concretely the width) in pixel.
+  </summary>
+</histogram>
+
 <histogram name="Webapp.Install.InstallBounce" enum="WebappInstallSource"
     expires_after="2024-02-25">
   <owner>alancutter@chromium.org</owner>
@@ -1268,7 +1278,7 @@
 
 <histogram
     name="WebApp.Preinstalled.WindowExperiment.{UserGroup}.{DisplayModeChange}"
-    enum="DefaultAppName" expires_after="2023-12-30">
+    enum="DefaultAppName" expires_after="2024-03-03">
   <owner>glenrob@chromium.org</owner>
   <owner>desktop-pwas-team@google.com</owner>
   <summary>
@@ -1289,7 +1299,7 @@
 
 <histogram
     name="WebApp.Preinstalled.WindowExperiment.{UserGroup}.{LinkCapturingChange}"
-    enum="DefaultAppName" expires_after="2023-12-30">
+    enum="DefaultAppName" expires_after="2024-03-03">
   <owner>glenrob@chromium.org</owner>
   <owner>desktop-pwas-team@google.com</owner>
   <summary>
@@ -1569,7 +1579,7 @@
 </histogram>
 
 <histogram name="Webapp.UninstallDialogAction"
-    enum="WebappUninstallDialogAction" expires_after="2024-01-01">
+    enum="WebappUninstallDialogAction" expires_after="2024-03-03">
   <owner>benwells@chromium.org</owner>
   <owner>dominickn@chromium.org</owner>
   <owner>desktop-pwas-team@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/webauthn/histograms.xml b/tools/metrics/histograms/metadata/webauthn/histograms.xml
index e3f74560..ad55661 100644
--- a/tools/metrics/histograms/metadata/webauthn/histograms.xml
+++ b/tools/metrics/histograms/metadata/webauthn/histograms.xml
@@ -149,7 +149,7 @@
 
 <histogram name="WebAuthentication.ChromeOS.GetAssertionStatus"
     enum="WebAuthenticationChromeOSGetAssertionResult"
-    expires_after="2024-01-04">
+    expires_after="2024-03-10">
   <owner>martinkr@google.com</owner>
   <owner>hcyang@google.com</owner>
   <owner>chrome-webauthn@google.com</owner>
@@ -166,7 +166,7 @@
 </histogram>
 
 <histogram name="WebAuthentication.ChromeOS.StartupRecordCount" units="records"
-    expires_after="2024-01-04">
+    expires_after="2024-03-10">
   <owner>martinkr@google.com</owner>
   <owner>chrome-webauthn@google.com</owner>
   <summary>
@@ -207,7 +207,7 @@
 </histogram>
 
 <histogram name="WebAuthentication.IsUVPlatformAuthenticatorAvailable2"
-    enum="Boolean" expires_after="2024-01-07">
+    enum="Boolean" expires_after="2024-03-10">
   <owner>kenrb@chromium.org</owner>
   <owner>martinkr@google.com</owner>
   <summary>
@@ -217,7 +217,7 @@
   </summary>
 </histogram>
 
-<histogram name="WebAuthentication.MacOS.PasskeysPermission"
+<histogram name="WebAuthentication.MacOS.PasskeyPermission"
     enum="WebAuthenticationMacOSPasskeysPermission" expires_after="2024-06-14">
   <owner>agl@chromium.org</owner>
   <owner>martinkr@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/windows/histograms.xml b/tools/metrics/histograms/metadata/windows/histograms.xml
index aee2749..dbaa338 100644
--- a/tools/metrics/histograms/metadata/windows/histograms.xml
+++ b/tools/metrics/histograms/metadata/windows/histograms.xml
@@ -77,7 +77,7 @@
 </histogram>
 
 <histogram name="Windows.Enclave.{Type}.Available" enum="BooleanAvailable"
-    expires_after="2023-12-01">
+    expires_after="2024-03-10">
   <owner>ajgo@chromium.org</owner>
   <owner>wfh@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/print_histogram_names.py b/tools/metrics/histograms/print_histogram_names.py
index ee6d143..d9ca171e 100755
--- a/tools/metrics/histograms/print_histogram_names.py
+++ b/tools/metrics/histograms/print_histogram_names.py
@@ -41,7 +41,7 @@
 
 
 def histogram_xml_files():
-  return [open(f) for f in histogram_paths.ALL_XMLS]
+  return [open(f, encoding="utf-8") for f in histogram_paths.ALL_XMLS]
 
 
 def get_diff(revision):
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index 8c414cb..5368432 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -267,6 +267,13 @@
     <summary>
       Total number of selections made.
     </summary>
+    <aggregation>
+      <history>
+        <statistics>
+          <quantiles type="std-percentiles"/>
+        </statistics>
+      </history>
+    </aggregation>
   </metric>
 </event>
 
@@ -3689,6 +3696,71 @@
   </metric>
 </event>
 
+<event name="Autofill2.FieldInfoAfterSubmission">
+  <owner>battre@chromium.org</owner>
+  <owner>chrome-autofill-team@google.com</owner>
+  <summary>
+    Information about a specific field, recorded after form submission.
+  </summary>
+  <metric name="FieldSessionIdentifier">
+    <summary>
+      A random variable assigned to a specific instance of a form control (e.g.
+      a HTML input element). This should be globally unique and suitable for
+      distinguishing fields. Two different users would have different values.
+      For the same user, the same field in the same form in two different tabs
+      would have two different values. FormSessionIdentifier and
+      FieldSessionIdentifier together are used to link to the field in
+      Autofill2.FieldInfo.
+    </summary>
+  </metric>
+  <metric name="FormSessionIdentifier">
+    <summary>
+      A random variable assigned to a specific instance of a HTML form in a
+      specific renderer. This should be globally unique and suitable for
+      counting distinct forms. Two different users would have different values.
+      A single user loading the same form in two different tabs would have two
+      different values. FormSessionIdentifier and FieldSessionIdentifier
+      together are used to link to the field in Autofill2.FieldInfo.
+    </summary>
+  </metric>
+  <metric name="MillisecondsFromFormParsedUntilSubmission">
+    <summary>
+      The time interval from form parse to form submission in ms in exponential
+      buckets from |GetSemanticBucketMinForDurationTiming()|.
+    </summary>
+  </metric>
+  <metric name="SubmissionSource" enum="AutofillSubmissionSource">
+    <summary>
+      The source of form submission. The source is from
+      autofill::mojom::SubmissionSource.
+    </summary>
+  </metric>
+  <metric name="SubmittedType1" enum="AutofillServerFieldType">
+    <summary>
+      The first possible field submitted type is determined by comparing the
+      submitted value in the field with the stored user profiles. We will have
+      at most three possible field submitted types. The types are from
+      |autofill::ServerFieldType|.
+    </summary>
+  </metric>
+  <metric name="SubmittedType2" enum="AutofillServerFieldType">
+    <summary>
+      The second possible field submitted type is determined by comparing the
+      submitted value in the field with the stored user profiles. We will have
+      at most three possible field submitted types. The types are from
+      |autofill::ServerFieldType|.
+    </summary>
+  </metric>
+  <metric name="SubmittedType3" enum="AutofillServerFieldType">
+    <summary>
+      The third possible field submitted type is determined by comparing the
+      submitted value in the field with the stored user profiles. We will have
+      at most three possible field submitted types. The types are from
+      |autofill::ServerFieldType|.
+    </summary>
+  </metric>
+</event>
+
 <event name="Autofill2.FormSummary">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-team@google.com</owner>
@@ -8245,7 +8317,8 @@
 </event>
 
 <event name="DocumentCreated">
-  <owner>beccahughes@chromium.org</owner>
+  <owner>rakina@chromium.org</owner>
+  <owner>navigation-dev@chromium.org</owner>
   <summary>
     Recorded when a Document object is created and records the source ID of the
     navigation and whether the document was in the main frame. This can be used
@@ -8566,6 +8639,19 @@
   </metric>
 </event>
 
+<event name="Extensions.BackgroundContentsCreated">
+  <owner>erikchen@chromium.org</owner>
+  <summary>
+    Recorded each time a background contents creates its first renderer by
+    navigating its initial WebContents.
+  </summary>
+  <metric name="Seen" enum="Boolean">
+    <summary>
+      Dummy Boolean as UKM does not support events with no metrics.
+    </summary>
+  </metric>
+</event>
+
 <event name="Extensions.CrossOriginFetchFromContentScript3">
   <obsolete>
     Deprecated in Chrome 87 / September 2020 - it was not needed anymore since
@@ -16001,7 +16087,7 @@
   <metric name="HoursSincePopupOpened" enum="PopupProvider">
     <summary>
       The number of hours before the cookie access that the initial
-      OpenerHeuristic.TopLevel event was recorded. Bucketized evenly with 120
+      OpenerHeuristic.TopLevel event was recorded. Bucketized evenly with 50
       buckets up to 60 days.
     </summary>
   </metric>
@@ -21557,19 +21643,26 @@
       with a RedirectHeuristic.CookieAccessThirdParty event.
     </summary>
   </metric>
+  <metric name="DoesFirstPartyPrecedeThirdParty" enum="Boolean">
+    <summary>
+      Whether this top-level site appeared in the tab history (or current
+      navigation) directly before the third party. Used to check for an A-B-A
+      site flow that may narrow the heuristic.
+    </summary>
+  </metric>
   <metric name="HoursSinceLastInteraction">
     <summary>
       The number of hours before the cookie access that the user last interacted
-      with the tracking site. Bucketized evenly with 120 buckets up to 60 days.
-      Set to -1 if there has never been a user interaction from the tracking
-      site.
+      with the tracking site. Clamped to 60 days at most, and rounded down to
+      the nearest exponential bucket (out of 50 buckets). Set to -1 if there has
+      never been a user interaction from the tracking site.
     </summary>
   </metric>
   <metric name="MillisecondsSinceRedirect">
     <summary>
       The number of milliseconds between the redirect to the cookie access.
-      Clamped to three minutes at most, and rounded down to the nearest
-      exponential bucket (out of 50 buckets).
+      Clamped to 15 minutes at most, and rounded down to the nearest exponential
+      bucket (out of 50 buckets).
     </summary>
   </metric>
   <metric name="OpenerHasSameSiteIframe" enum="HasSameSiteIframe">
diff --git a/tools/nocompile/driver.py b/tools/nocompile/driver.py
index 7404390..a44d9fa 100755
--- a/tools/nocompile/driver.py
+++ b/tools/nocompile/driver.py
@@ -12,6 +12,7 @@
   http://dev.chromium.org/developers/testing/no-compile-tests
 """
 
+import argparse
 import ast
 import concurrent.futures
 import functools
@@ -23,6 +24,18 @@
 import tempfile
 import time
 
+from typing import Any
+from typing import IO
+from typing import Optional
+from typing import Sequence
+from typing import Set
+from typing import Tuple
+from typing import TypedDict
+
+sys.path.append(
+    os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, 'build'))
+import action_helpers
+
 # Matches lines that start with #if and have the substring TEST in the
 # conditional. Also extracts the comment.  This allows us to search for
 # lines like the following:
@@ -74,6 +87,36 @@
 NCTEST_TERMINATE_TIMEOUT_SEC = 120
 
 
+class TestResult(TypedDict):
+  """Represents the result of one nocompile test.
+
+  Attributes:
+    cmdline: The executed command line.
+    stdout: A temporary file object containing stdout.
+    name: The name of the test.
+    suite_name: The suite name to use when generating the gunit test result.
+    started_at: A timestamp in seconds since the epoch for when this test was
+      started.
+    aborted_at: A timestamp in seconds since the epoch for when this test was
+      aborted. If the test completed successfully, this value is 0.
+    finished_at: A timestamp in seconds since the epoch for when this test was
+      successfully complete.  If the test is aborted, this value is 0.
+    expectations: A dictionary with the test expectations. See
+      ParseExpectation() for the structure.
+    return_code: The return code of the test process, if not aborted.
+  """
+  cmdline: str
+  stdout: IO[str]
+  stderr: IO[str]
+  name: str
+  suite_name: str
+  started_at: float
+  aborted_at: float
+  finished_at: float
+  expectations: Sequence[re.Pattern]
+  returncode: int
+
+
 def ValidateInput(compiler, parallelism, sourcefile_path, cflags,
                   resultfile_path):
   """Make sure the arguments being passed in are sane."""
@@ -86,7 +129,7 @@
   assert type(resultfile_path) is str
 
 
-def ParseExpectation(expectation_string):
+def ParseExpectation(expectation_string) -> Sequence[re.Pattern]:
   """Extracts expectation definition from the trailing comment on the ifdef.
 
   See the comment on NCTEST_CONFIG_RE for examples of the format we are parsing.
@@ -184,7 +227,7 @@
   return test_configs
 
 
-def RunTest(compiler, tempfile_dir, cflags, config):
+def RunTest(compiler, tempfile_dir, cflags, config) -> TestResult:
   """Runs one negative compile test.
 
   Args:
@@ -195,25 +238,7 @@
       for a description of the config format.
 
   Returns:
-    A dictionary containing all the information about the started test. The
-    fields in the dictionary are as follows:
-      {
-        'cmdline': The executed command line.
-        'name': The name of the test.
-        'suite_name': The suite name to use when generating the gunit test
-                      result.
-        'started_at': A timestamp in seconds since the epoch for when this test
-                      was started.
-        'aborted_at': A timestamp in seconds since the epoch for when this test
-                      was aborted.  If the test completed successfully,
-                      this value is 0.
-        'finished_at': A timestamp in seconds since the epoch for when this
-                       test was successfully complete.  If the test is aborted,
-                       this value is 0.
-        'expectations': A dictionary with the test expectations. See
-                        ParseExpectation() for the structure.
-        'return_code': The return code of the test process, if not aborted.
-      }
+    A TestResult containing all the information about the started test.
   """
   cmdline = [compiler]
   cmdline.extend(cflags)
@@ -242,18 +267,16 @@
     returncode = -1
     aborted_at = time.time()
     finished_at = 0
-  return {
-      'cmdline': ' '.join(cmdline),
-      'stdout': test_stdout,
-      'stderr': test_stderr,
-      'name': name,
-      'suite_name': config['suite_name'],
-      'started_at': started_at,
-      'aborted_at': aborted_at,
-      'finished_at': finished_at,
-      'expectations': expectations,
-      'returncode': returncode,
-  }
+  return TestResult(cmdline=' '.join(cmdline),
+                    stdout=test_stdout,
+                    stderr=test_stderr,
+                    name=name,
+                    suite_name=config['suite_name'],
+                    started_at=started_at,
+                    aborted_at=aborted_at,
+                    finished_at=finished_at,
+                    expectations=expectations,
+                    returncode=returncode)
 
 
 def PassTest(resultfile, resultlog, test):
@@ -320,30 +343,53 @@
                    total_secs, extract_secs, compile_secs, process_secs))
 
 
-def ExtractTestOutputAndCleanup(test):
+def ExtractTestOutputAndCleanup(test: TestResult) -> Tuple[str, str]:
   """Test output is in temp files. Read those and delete them.
   Returns: A tuple (stderr, stdout).
   """
-  outputs = [None, None]
-  for i, stream_name in ((0, "stdout"), (1, "stderr")):
-    stream = test[stream_name]
-    stream.seek(0)
-    outputs[i] = stream.read()
-    stream.close()
+  def ReadStreamAndClose(stream: IO[str]) -> str:
+    with stream:
+      stream.seek(0)
+      return stream.read()
 
-  return outputs
+  return (ReadStreamAndClose(test['stdout']),
+          ReadStreamAndClose(test['stderr']))
 
 
-def ProcessTestResult(resultfile, resultlog, test):
+def ProcessTestResult(sourcefile_path: str,
+                      resultfile: IO[str],
+                      resultlog: IO[str],
+                      test: TestResult,
+                      includes: Optional[Set[str]] = None) -> None:
   """Interprets and logs the result of a test run by RunTest()
 
   Args:
+    sourcefile_path: Path to the source .cc file derived from the .nc file.
     resultfile: File object for .cc file that results are written to.
     resultlog: File object for the log file.
     test: The dictionary from RunTest() to process.
+    includes: Must either be a set or None. If a set, the driver will scrape
+              stdout for the /showIncludes format and insert any headers found
+              into `includes`.
   """
   (stdout, stderr) = ExtractTestOutputAndCleanup(test)
 
+  if includes is not None:
+    # /showIncludes format:
+    # Note: including file: third_party/libc++/src/include/stdio.h
+    # Note: including file:  third_party/libc++/src/include/__config
+    # Note: including file:   buildtools/third_party/libc++/__config_site
+    # Note: including file: third_party/libc++/src/include/stdint.h
+    INCLUDE_PREFIX = 'Note: including file: '
+    includes.update(
+        map(
+            lambda x: os.path.relpath(x[len(INCLUDE_PREFIX):].strip()),
+            filter(
+                lambda x: x.startswith(INCLUDE_PREFIX),
+                stdout.splitlines(),
+            ),
+        ))
+
   if test['aborted_at'] != 0:
     FailTest(
         resultfile, test, "Compile timed out. Started %f ended %f." %
@@ -377,21 +423,25 @@
 
 
 def main():
-  if len(sys.argv) < 6 or sys.argv[5] != '--':
-    print('Usage: %s <compiler> <parallelism> <sourcefile> <resultfile> '
-          '-- <cflags...>' % sys.argv[0])
-    sys.exit(1)
+  parser = argparse.ArgumentParser(prog=sys.argv[0])
+  parser.add_argument('compiler')
+  parser.add_argument('parallelism', type=int)
+  parser.add_argument('sourcefile')
+  parser.add_argument('resultfile')
+  parser.add_argument('--depfile', default='')
+  parser.add_argument('compiler_options', nargs=argparse.REMAINDER)
 
   # Force us into the "C" locale so the compiler doesn't localize its output.
   # In particular, this stops gcc from using smart quotes when in english UTF-8
   # locales.  This makes the expectation writing much easier.
   os.environ['LC_ALL'] = 'C'
 
-  compiler = sys.argv[1]
-  parallelism = int(sys.argv[2])
-  sourcefile_path = sys.argv[3]
-  resultfile_path = sys.argv[4]
-  cflags = sys.argv[6:]
+  args = parser.parse_args()
+  compiler = args.compiler
+  parallelism = args.parallelism
+  sourcefile_path = args.sourcefile
+  resultfile_path = args.resultfile
+  cflags = args.compiler_options
 
   timings = {'started': time.time()}
 
@@ -414,6 +464,8 @@
     timings['header_written'] = time.time()
     finished_tests = []
 
+    includes = set() if args.depfile else None
+
     with concurrent.futures.ThreadPoolExecutor(
         max_workers=parallelism) as executor:
       finished_tests = executor.map(
@@ -431,7 +483,8 @@
             sys.stdout.write(stdout)
             sys.stderr.write(stderr)
           continue
-        ProcessTestResult(resultfile, resultlog, test)
+        ProcessTestResult(sourcefile_path, resultfile, resultlog, test,
+                          includes)
       timings['results_processed'] = time.time()
 
     WriteStats(resultlog, suite_name, timings)
@@ -442,10 +495,15 @@
       with open(resultfile_path, 'w') as fd:
         fd.write(resultfile.getvalue())
 
+      # Even if includes is empty, write a depfile if it was requested.
+      if args.depfile:
+        action_helpers.write_depfile(args.depfile, resultfile_path, includes)
+
     if return_code != 0:
       print("No-compile driver failure with return_code %d. Result log:" %
             return_code)
       print(resultlog.getvalue())
+
     sys.exit(return_code)
 
 
diff --git a/tools/nocompile/wrapper.py b/tools/nocompile/wrapper.py
new file mode 100755
index 0000000..6b53502
--- /dev/null
+++ b/tools/nocompile/wrapper.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+# Copyright 2023 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Wrapper around clang for nocompile tests.
+
+The actual test functionality is largely implemented by clang itself. The
+wrapper script exists for two purposes:
+- generating an empty object file, so that nocompile GN targets can masquerade
+  as source sets.
+- generating a depfile on Windows. Normally, ninja parses /showIncludes output;
+  unfortunately, this only works for compiler tools, not customm GN actions.
+"""
+
+import argparse
+import pathlib
+import os
+import subprocess
+import sys
+
+sys.path.append(
+    os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, 'build'))
+import action_helpers
+
+
+def main():
+  parser = argparse.ArgumentParser(prog=sys.argv[0])
+  parser.add_argument('--generate-depfile', action='store_true')
+  parser.add_argument('compiler')
+  parser.add_argument('source_path')
+  parser.add_argument('obj_path')
+  parser.add_argument('depfile_path')
+  parser.add_argument('compiler_options', nargs=argparse.REMAINDER)
+
+  args = parser.parse_args()
+
+  compiler_args = [
+      args.compiler,
+  ]
+  compiler_args += args.compiler_options
+  compiler_args += [
+      '-c',
+      args.source_path,
+  ]
+
+  result = subprocess.run(compiler_args, stdout=subprocess.PIPE)
+
+  if result.returncode == 0:
+    pathlib.Path(args.obj_path).touch()
+    if args.generate_depfile:
+      # /showIncludes format:
+      # Note: including file: third_party/libc++/src/include/stdio.h
+      # Note: including file:  third_party/libc++/src/include/__config
+      # Note: including file:   buildtools/third_party/libc++/__config_site
+      # Note: including file: third_party/libc++/src/include/stdint.h
+
+      # The prefix is locale-sensitive, but in practice, everything in the
+      # Chrome build assumes the prefix is fixed.
+      INCLUDE_PREFIX = 'Note: including file: '
+      includes = map(
+          lambda x: os.path.relpath(x[len(INCLUDE_PREFIX):].strip()),
+          filter(
+              lambda x: x.startswith(INCLUDE_PREFIX),
+              result.stdout.decode('utf-8').splitlines(),
+          ),
+      )
+
+      action_helpers.write_depfile(args.depfile_path, args.obj_path, includes)
+  sys.exit(result.returncode)
+
+
+if __name__ == '__main__':
+  main()
diff --git a/tools/perf/benchmarks/speedometer3.py b/tools/perf/benchmarks/speedometer3.py
index 9fa1a75..5484de9 100644
--- a/tools/perf/benchmarks/speedometer3.py
+++ b/tools/perf/benchmarks/speedometer3.py
@@ -184,4 +184,4 @@
     return 'speedometer3-minormc'
 
   def SetExtraBrowserOptions(self, options):
-    options.AppendExtraBrowserArgs('--js-flags=--minor-mc')
+    options.AppendExtraBrowserArgs('--js-flags=--minor-ms')
diff --git a/tools/perf/cli_tools/soundwave/__init__.py b/tools/perf/cli_tools/soundwave/__init__.py
deleted file mode 100644
index 1f66767..0000000
--- a/tools/perf/cli_tools/soundwave/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
diff --git a/tools/perf/cli_tools/soundwave/commands.py b/tools/perf/cli_tools/soundwave/commands.py
deleted file mode 100644
index 4e505a8..0000000
--- a/tools/perf/cli_tools/soundwave/commands.py
+++ /dev/null
@@ -1,162 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import print_function
-
-import json
-import logging
-try:
-  import sqlite3
-except ImportError:
-  pass
-
-from core import cli_utils
-from core.external_modules import pandas
-from core.services import dashboard_service
-from cli_tools.soundwave import pandas_sqlite
-from cli_tools.soundwave import studies
-from cli_tools.soundwave import tables
-from cli_tools.soundwave import worker_pool
-
-
-def _FetchBugsWorker(args):
-  con = sqlite3.connect(args.database_file, timeout=10)
-
-  def Process(bug_id):
-    bugs = tables.bugs.DataFrameFromJson([dashboard_service.Bugs(bug_id)])
-    pandas_sqlite.InsertOrReplaceRecords(con, 'bugs', bugs)
-
-  worker_pool.Process = Process
-
-
-def FetchAlertsData(args):
-  params = {
-      'test_suite': args.benchmark,
-      'min_timestamp': cli_utils.DaysAgoToTimestamp(args.days)
-  }
-  if args.sheriff != 'all':
-    params['sheriff'] = args.sheriff
-
-  with tables.DbSession(args.database_file) as con:
-    # Get alerts.
-    num_alerts = 0
-    bug_ids = set()
-    # TODO: This loop may be slow when fetching thousands of alerts, needs a
-    # better progress indicator.
-    for data in dashboard_service.IterAlerts(**params):
-      alerts = tables.alerts.DataFrameFromJson(data)
-      pandas_sqlite.InsertOrReplaceRecords(con, 'alerts', alerts)
-      num_alerts += len(alerts)
-      bug_ids.update(alerts['bug_id'].unique())
-    print('%d alerts found!' % num_alerts)
-
-    # Get set of bugs associated with those alerts.
-    bug_ids.discard(0)  # A bug_id of 0 means untriaged.
-    print('%d bugs found!' % len(bug_ids))
-
-    # Filter out bugs already in cache.
-    if args.use_cache:
-      known_bugs = set(
-          b for b in bug_ids if tables.bugs.Get(con, b) is not None)
-      if known_bugs:
-        print('(skipping %d bugs already in the database)' % len(known_bugs))
-        bug_ids.difference_update(known_bugs)
-
-  # Use worker pool to fetch bug data.
-  total_seconds = worker_pool.Run(
-      'Fetching data of %d bugs: ' % len(bug_ids),
-      _FetchBugsWorker, args, bug_ids)
-  print('[%.1f bugs per second]' % (len(bug_ids) / total_seconds))
-
-
-def _IterStaleTestPaths(con, test_paths):
-  """Iterate over test_paths yielding only those with stale or absent data.
-
-  A test_path is considered to be stale if the most recent data point we have
-  for it in the db is more than a day older.
-  """
-  a_day_ago = pandas.Timestamp.utcnow() - pandas.Timedelta(days=1)
-  a_day_ago = a_day_ago.tz_convert(tz=None)
-
-  for test_path in test_paths:
-    latest = tables.timeseries.GetMostRecentPoint(con, test_path)
-    if latest is None or latest['timestamp'] < a_day_ago:
-      yield test_path
-
-
-def _FetchTimeseriesWorker(args):
-  con = sqlite3.connect(args.database_file, timeout=10)
-  min_timestamp = cli_utils.DaysAgoToTimestamp(args.days)
-
-  def Process(test_path):
-    try:
-      if isinstance(test_path, tables.timeseries.Key):
-        params = test_path.AsApiParams()
-        params['min_timestamp'] = min_timestamp
-        data = dashboard_service.Timeseries2(**params)
-      else:
-        data = dashboard_service.Timeseries(test_path, days=args.days)
-    except KeyError:
-      logging.info('Timeseries not found: %s', test_path)
-      return
-
-    timeseries = tables.timeseries.DataFrameFromJson(test_path, data)
-    pandas_sqlite.InsertOrReplaceRecords(con, 'timeseries', timeseries)
-
-  worker_pool.Process = Process
-
-
-def _ReadTimeseriesFromFile(filename):
-  with open(filename, 'r') as f:
-    data = json.load(f)
-  return [tables.timeseries.Key.FromDict(ts) for ts in data]
-
-
-def FetchTimeseriesData(args):
-  def _MatchesAllFilters(test_path):
-    return all(f in test_path for f in args.filters)
-
-  with tables.DbSession(args.database_file) as con:
-    # Get test_paths.
-    if args.benchmark is not None:
-      test_paths = dashboard_service.ListTestPaths(
-          args.benchmark, sheriff=args.sheriff)
-    elif args.input_file is not None:
-      test_paths = _ReadTimeseriesFromFile(args.input_file)
-    elif args.study is not None:
-      test_paths = list(args.study.IterTestPaths())
-    else:
-      raise ValueError('No source for test paths specified')
-
-    # Apply --filter's to test_paths.
-    if args.filters:
-      test_paths = filter(_MatchesAllFilters, test_paths)
-    num_found = len(test_paths)
-    print('%d test paths found!' % num_found)
-
-    # Filter out test_paths already in cache.
-    if args.use_cache:
-      test_paths = list(_IterStaleTestPaths(con, test_paths))
-      num_skipped = num_found - len(test_paths)
-      if num_skipped:
-        print('(skipping %d test paths already in the database)' % num_skipped)
-
-  # Use worker pool to fetch test path data.
-  total_seconds = worker_pool.Run(
-      'Fetching data of %d timeseries: ' % len(test_paths),
-      _FetchTimeseriesWorker, args, test_paths)
-  print('[%.1f test paths per second]' % (len(test_paths) / total_seconds))
-
-  if args.output_csv is not None:
-    print()
-    print('Post-processing data for study ...')
-    dfs = []
-    with tables.DbSession(args.database_file) as con:
-      for test_path in test_paths:
-        df = tables.timeseries.GetTimeSeries(con, test_path)
-        dfs.append(df)
-    df = studies.PostProcess(pandas.concat(dfs, ignore_index=True))
-    with cli_utils.OpenWrite(args.output_csv) as f:
-      df.to_csv(f, index=False)
-    print('Wrote timeseries data to:', args.output_csv)
diff --git a/tools/perf/cli_tools/soundwave/pandas_sqlite.py b/tools/perf/cli_tools/soundwave/pandas_sqlite.py
deleted file mode 100644
index b7b10aa..0000000
--- a/tools/perf/cli_tools/soundwave/pandas_sqlite.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-Helper methods for dealing with a SQLite database with pandas.
-"""
-
-import six
-
-from core.external_modules import pandas
-
-
-def DataFrame(column_types, index=None, rows=None):
-  """Create a DataFrame with given column types as index.
-
-  Unlike usual pandas DataFrame constructors, this allows to have explicitly
-  typed column values, even when no rows of data are provided. And, when such
-  data is available, values are explicitly casted, instead of letting pandas
-  guess a type.
-
-  Args:
-    column_types: A sequence of (name, dtype) pairs to define the columns.
-    index: An optional column name or sequence of column names to use as index
-      of the frame.
-    rows: An optional sequence of rows of data.
-  """
-  if rows:
-    cols = list(zip(*rows))
-    assert len(cols) == len(column_types)
-    cols = (list(vs) for vs in cols)
-  else:
-    cols = (None for _ in column_types)
-  df = pandas.DataFrame()
-  for (column, dtype), values in zip(column_types, cols):
-    df[column] = pandas.Series(values, dtype=dtype)
-  if index is not None:
-    index = [index] if isinstance(index, six.string_types) else list(index)
-    df.set_index(index, inplace=True)
-  return df
-
-
-def CreateTableIfNotExists(con, name, frame):
-  """Create a new empty table, if it doesn't already exist.
-
-  Args:
-    con: A sqlite connection object.
-    name: Name of SQL table to create.
-    frame: A DataFrame used to infer the schema of the table; the index of the
-      DataFrame is set as PRIMARY KEY of the table.
-  """
-  keys = [k for k in frame.index.names if k is not None]
-  if not keys:
-    keys = None
-  db = pandas.io.sql.SQLiteDatabase(con)
-  table = pandas.io.sql.SQLiteTable(
-      name, db, frame=frame, index=keys is not None, keys=keys,
-      if_exists='append')
-  table.create()
-
-
-def _InsertOrReplaceStatement(name, keys):
-  columns = ','.join(keys)
-  values = ','.join('?' for _ in keys)
-  return 'INSERT OR REPLACE INTO %s(%s) VALUES (%s)' % (name, columns, values)
-
-
-def InsertOrReplaceRecords(con, name, frame):
-  """Insert or replace records from a DataFrame into a SQLite database.
-
-  Assumes that the table already exists. Any new records with a matching
-  PRIMARY KEY, usually the frame.index, will replace existing records.
-
-  Args:
-    con: A sqlite connection object.
-    name: Name of SQL table.
-    frame: DataFrame with records to write.
-  """
-  db = pandas.io.sql.SQLiteDatabase(con)
-  table = pandas.io.sql.SQLiteTable(
-      name, db, frame=frame, index=True, if_exists='append')
-  assert table.exists()
-  keys, data = table.insert_data()
-  insert_statement = _InsertOrReplaceStatement(name, keys)
-  with db.run_transaction() as c:
-    c.executemany(insert_statement, zip(*data))
diff --git a/tools/perf/cli_tools/soundwave/pandas_sqlite_test.py b/tools/perf/cli_tools/soundwave/pandas_sqlite_test.py
deleted file mode 100644
index 0dccf9d..0000000
--- a/tools/perf/cli_tools/soundwave/pandas_sqlite_test.py
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-try:
-  import sqlite3
-except ImportError:
-  pass
-import unittest
-
-import six
-
-from cli_tools.soundwave import pandas_sqlite
-from core.external_modules import pandas
-
-
-@unittest.skipIf(pandas is None, 'pandas not available')
-class TestPandasSQLite(unittest.TestCase):
-  def testCreateTableIfNotExists_newTable(self):
-    df = pandas_sqlite.DataFrame(
-        [('bug_id', int), ('summary', str), ('status', str)], index='bug_id')
-    con = sqlite3.connect(':memory:')
-    try:
-      self.assertFalse(pandas.io.sql.has_table('bugs', con))
-      pandas_sqlite.CreateTableIfNotExists(con, 'bugs', df)
-      self.assertTrue(pandas.io.sql.has_table('bugs', con))
-    finally:
-      con.close()
-
-  def testCreateTableIfNotExists_alreadyExists(self):
-    df = pandas_sqlite.DataFrame(
-        [('bug_id', int), ('summary', str), ('status', str)], index='bug_id')
-    con = sqlite3.connect(':memory:')
-    try:
-      self.assertFalse(pandas.io.sql.has_table('bugs', con))
-      pandas_sqlite.CreateTableIfNotExists(con, 'bugs', df)
-      self.assertTrue(pandas.io.sql.has_table('bugs', con))
-      # It's fine to call a second time.
-      pandas_sqlite.CreateTableIfNotExists(con, 'bugs', df)
-      self.assertTrue(pandas.io.sql.has_table('bugs', con))
-    finally:
-      con.close()
-
-  def testInsertOrReplaceRecords_tableNotExistsRaises(self):
-    column_types = (('bug_id', int), ('summary', str), ('status', str))
-    rows = [(123, 'Some bug', 'Started'), (456, 'Another bug', 'Assigned')]
-    df = pandas_sqlite.DataFrame(column_types, index='bug_id', rows=rows)
-    con = sqlite3.connect(':memory:')
-    try:
-      with self.assertRaises(AssertionError):
-        pandas_sqlite.InsertOrReplaceRecords(con, 'bugs', df)
-    finally:
-      con.close()
-
-  def testInsertOrReplaceRecords_existingRecords(self):
-    column_types = (('bug_id', int), ('summary', str), ('status', str))
-    rows1 = [(123, 'Some bug', 'Started'), (456, 'Another bug', 'Assigned')]
-    df1 = pandas_sqlite.DataFrame(column_types, index='bug_id', rows=rows1)
-    rows2 = [(123, 'Some bug', 'Fixed'), (789, 'A new bug', 'Untriaged')]
-    df2 = pandas_sqlite.DataFrame(column_types, index='bug_id', rows=rows2)
-    con = sqlite3.connect(':memory:')
-    try:
-      pandas_sqlite.CreateTableIfNotExists(con, 'bugs', df1)
-
-      # Write first data frame to database.
-      pandas_sqlite.InsertOrReplaceRecords(con, 'bugs', df1)
-      df = pandas.read_sql('SELECT * FROM bugs', con, index_col='bug_id')
-      self.assertEqual(len(df), 2)
-      self.assertEqual(df.loc[123]['status'], 'Started')
-
-      # Write second data frame to database.
-      pandas_sqlite.InsertOrReplaceRecords(con, 'bugs', df2)
-      df = pandas.read_sql('SELECT * FROM bugs', con, index_col='bug_id')
-      self.assertEqual(len(df), 3)  # Only one extra record added.
-      self.assertEqual(df.loc[123]['status'], 'Fixed')  # Bug is now fixed.
-      six.assertCountEqual(self, df.index, (123, 456, 789))
-    finally:
-      con.close()
diff --git a/tools/perf/cli_tools/soundwave/studies/__init__.py b/tools/perf/cli_tools/soundwave/studies/__init__.py
deleted file mode 100644
index 39b93e4..0000000
--- a/tools/perf/cli_tools/soundwave/studies/__init__.py
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from cli_tools.soundwave.studies import health_study
-from cli_tools.soundwave.studies import v8_study
-from core.external_modules import pandas
-
-
-_STUDIES = {'health': health_study, 'v8': v8_study}
-
-NAMES = sorted(_STUDIES)
-
-
-def GetStudy(study):
-  return _STUDIES[study]
-
-
-def PostProcess(df):
-  # Snap stories on the same test run to the same timestamp.
-  df['timestamp'] = df.groupby(
-      ['test_suite', 'bot', 'point_id'])['timestamp'].transform('min')
-
-  # Prevent the size of the output from growing without bounts. Limit for
-  # DataStudio input appears to be around 100MiB.
-  four_months_ago = pandas.Timestamp.utcnow() - pandas.DateOffset(months=4)
-  df = df[df['timestamp'] > four_months_ago.tz_convert(None)].copy()
-
-  # We use all runs on the latest day for each quarter as reference.
-  df['quarter'] = df['timestamp'].dt.to_period('Q')
-  df['reference'] = df['timestamp'].dt.date == df.groupby(
-      ['quarter', 'test_suite', 'bot'])['timestamp'].transform('max').dt.date
-
-  # Change units for values in ms to seconds, and percent values.
-  df['units'] = df['units'].fillna('')
-  is_ms_unit = df['units'].str.startswith('ms_')
-  df.loc[is_ms_unit, 'value'] = df['value'] / 1000
-
-  is_percentage = df['units'].str.startswith('n%_')
-  df.loc[is_percentage, 'value'] = df['value'] * 100
-
-  # Remove unused columns to save space in the output csv.
-  for col in ('point_id', 'chromium_rev', 'clank_rev', 'trace_url'):
-    del df[col]
-
-  return df
diff --git a/tools/perf/cli_tools/soundwave/studies/health_study.py b/tools/perf/cli_tools/soundwave/studies/health_study.py
deleted file mode 100644
index 97a6b97..0000000
--- a/tools/perf/cli_tools/soundwave/studies/health_study.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from core.services import dashboard_service
-from cli_tools.soundwave.tables import timeseries
-
-
-CLOUD_PATH = 'gs://chrome-health-tvdata/datasets/health_study.csv'
-
-SYSTEM_HEALTH = [
-    {
-        'test_suite': 'system_health.memory_mobile',
-        'measurement': ('memory:{browser}:all_processes:reported_by_os:'
-                        'private_footprint_size'),
-    },
-    {
-        'test_suite': 'system_health.common_mobile',
-        'measurement': 'cpu_time_percentage'
-    }
-]
-
-STARTUP_BY_BROWSER = {
-    'chrome': {
-        'test_suite': 'startup.mobile',
-        'measurement': 'first_contentful_paint_time',
-        'test_case': 'intent_coldish_bbc'
-    },
-    'webview': {
-        'test_suite': 'system_health.webview_startup',
-        'measurement': 'webview_startup_wall_time_avg',
-        'test_case': 'load:chrome:blank'
-    }
-}
-
-APK_SIZE = {
-    'test_suite': 'resource_sizes:Monochrome.minimal.apks',
-    'measurement': 'Specifics:normalized apk size',
-    'bot': 'ChromiumPerf:android-builder-perf',
-}
-
-
-def IterSystemHealthBots():
-  yield 'ChromiumPerf:android-go-perf'
-  yield 'ChromiumPerf:android-go_webview-perf'
-  yield 'ChromiumPerf:android-pixel2-perf'
-  yield 'ChromiumPerf:android-pixel2_webview-perf'
-
-
-def GetBrowserFromBot(bot):
-  return 'webview' if 'webview' in bot else 'chrome'
-
-
-def GetHealthCheckStories():
-  description = dashboard_service.Describe('system_health.common_mobile')
-  return description['caseTags']['health_check']
-
-
-def IterTestPaths():
-  test_cases = GetHealthCheckStories()
-  for bot in IterSystemHealthBots():
-    browser = GetBrowserFromBot(bot)
-
-    # Startup.
-    yield timeseries.Key.FromDict(STARTUP_BY_BROWSER[browser], bot=bot)
-
-    # Memory.
-    if bot == 'ChromiumPerf:android-pixel2_webview-perf':
-      # The pixel2 webview bot incorrectly reports memory as if coming from
-      # chrome. TODO(crbug.com/972620): Remove this when bug is fixed.
-      browser = 'chrome'
-
-    for series in SYSTEM_HEALTH:
-      measurement = series['measurement'].format(browser=browser)
-      for test_case in test_cases:
-        yield timeseries.Key.FromDict(
-            series, bot=bot, measurement=measurement, test_case=test_case)
-
-  # APK size.
-  yield timeseries.Key.FromDict(APK_SIZE)
diff --git a/tools/perf/cli_tools/soundwave/studies/v8_study.py b/tools/perf/cli_tools/soundwave/studies/v8_study.py
deleted file mode 100644
index 4ec824e..0000000
--- a/tools/perf/cli_tools/soundwave/studies/v8_study.py
+++ /dev/null
@@ -1,74 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from core.services import dashboard_service
-from cli_tools.soundwave.tables import timeseries
-
-
-CLOUD_PATH = 'gs://chrome-health-tvdata/datasets/v8_report.csv'
-
-PIXEL_32_BITS = 'ChromiumPerf:android-pixel2-perf'
-PIXEL_64_BITS = 'ChromiumPerfFyi:android-pixel2-perf-fyi'
-
-BROWSING_TEST_SUITES = {
-    'v8.browsing_mobile': ['Total:duration', 'V8-Only:duration']
-}
-
-PRESS_BENCHMARKS = [
-    {
-        'test_suite': 'speedometer2',
-        'measurement': 'RunsPerMinute',
-        'test_case': 'Speedometer2'
-    },
-    {
-        'test_suite': 'octane',
-        'measurement': 'Total.Score',
-    },
-    {
-        'test_suite': 'jetstream',
-        'measurement': 'Score',
-    }
-]
-
-
-def GetV8BrowsingMobile():
-  # The describe API doesn't currently work with v8.browsing_mobile, so use
-  # system_health.memory_mobile instead since it has the same test cases.
-  description = dashboard_service.Describe('system_health.memory_mobile')
-  return description['cases']
-
-
-def IterTestPaths():
-  v8_browsing_test_cases = GetV8BrowsingMobile()
-
-  for bot in [PIXEL_32_BITS, PIXEL_64_BITS]:
-    bot_path = bot.replace(':', "/")
-    for test_suite, measurements in BROWSING_TEST_SUITES.items():
-      # v8.browsing_mobile only runs 'browse:*' stories, while other benchmarks
-      # run all of them.
-      browse_only = 'browsing' in test_suite
-      for test_case in v8_browsing_test_cases:
-        if browse_only and not test_case.startswith('browse:'):
-          continue
-
-        # Don't yield the page category entries.
-        test_case_parts = test_case.split(':')
-        if len(test_case_parts) <= 2:
-          continue
-
-        # Remove disabled tests from the list of those to be collected.
-        if test_case_parts[2] in ['toi', 'globo', 'flipkart', 'avito']:
-          continue
-
-        page = '_'.join(test_case_parts)
-        page_category = '_'.join(test_case_parts[0:2])
-
-        for measurement in measurements:
-          # The v2 API doesn't support v8.browsing_mobile, so fall back on the
-          # v1 API for now.
-          yield '/'.join(
-              [bot_path, test_suite, measurement, page_category, page])
-
-    for series in PRESS_BENCHMARKS:
-      yield timeseries.Key.FromDict(series, bot=bot)
diff --git a/tools/perf/cli_tools/soundwave/tables/__init__.py b/tools/perf/cli_tools/soundwave/tables/__init__.py
deleted file mode 100644
index 4d35dfe..0000000
--- a/tools/perf/cli_tools/soundwave/tables/__init__.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import os
-
-try:
-  import sqlite3
-except ImportError:
-  pass
-
-from cli_tools.soundwave import pandas_sqlite
-from cli_tools.soundwave.tables import alerts
-from cli_tools.soundwave.tables import bugs
-from cli_tools.soundwave.tables import timeseries
-
-
-@contextlib.contextmanager
-def DbSession(filename):
-  """Context manage a session with a database connection.
-
-  Ensures that tables have been initialized.
-  """
-  if filename != ':memory:':
-    parent_dir = os.path.dirname(filename)
-    if not os.path.exists(parent_dir):
-      os.makedirs(parent_dir)
-  con = sqlite3.connect(filename)
-  try:
-    # Tell sqlite to use a write-ahead log, which drastically increases its
-    # concurrency capabilities. This helps prevent 'database is locked'
-    # exceptions when we have many workers writing to a single database. This
-    # mode is sticky, so we only need to set it once and future connections
-    # will automatically use the log. More details are available at
-    # https://www.sqlite.org/wal.html.
-    con.execute('PRAGMA journal_mode=WAL')
-    _CreateTablesIfNeeded(con)
-    yield con
-  finally:
-    con.close()
-
-
-def _CreateTablesIfNeeded(con):
-  """Creates soundwave tables in the database, if they don't already exist."""
-  for m in (alerts, bugs, timeseries):
-    pandas_sqlite.CreateTableIfNotExists(con, m.TABLE_NAME, m.DataFrame())
diff --git a/tools/perf/cli_tools/soundwave/tables/alerts.py b/tools/perf/cli_tools/soundwave/tables/alerts.py
deleted file mode 100644
index 24de2c8..0000000
--- a/tools/perf/cli_tools/soundwave/tables/alerts.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from cli_tools.soundwave import pandas_sqlite
-
-
-TABLE_NAME = 'alerts'
-COLUMN_TYPES = (
-    ('key', str),  # unique datastore key ('agxzfmNocm9tZXBlcmZyFAsS')
-    ('timestamp', 'datetime64[ns]'),  # when the alert was created
-    ('test_suite', str),  # benchmark name ('loading.mobile')
-    ('measurement', str),  # metric name ('timeToFirstContentfulPaint')
-    ('bot', str),  # master/builder name ('ChromiumPerf.android-nexus5')
-    ('test_case', str),  # story name ('Wikipedia')
-    ('start_revision', str),  # git hash or commit position before anomaly
-    ('end_revision', str),  # git hash or commit position after anomaly
-    ('median_before_anomaly', 'float64'),  # median of values before anomaly
-    ('median_after_anomaly', 'float64'),  # median of values after anomaly
-    ('units', str),  # unit in which values are masured ('ms')
-    ('improvement', bool),  # whether anomaly is an improvement or regression
-    ('bug_id', 'int64'),  # crbug id associated with this alert, 0 if missing
-    ('status', str),  # one of 'ignored', 'invalid', 'triaged', 'untriaged'
-    ('bisect_status', str),  # one of 'started', 'falied', 'completed'
-)
-COLUMNS = tuple(c for c, _ in COLUMN_TYPES)
-INDEX = COLUMNS[0]
-
-
-_CODE_TO_STATUS = {
-    -2: 'ignored',
-    -1: 'invalid',
-    None: 'untriaged',
-    # Any positive integer represents a bug_id and maps to a 'triaged' status.
-}
-
-
-def DataFrame(rows=None):
-  return pandas_sqlite.DataFrame(COLUMN_TYPES, index=INDEX, rows=rows)
-
-
-def _RowFromJson(data):
-  """Turn json data from an alert into a tuple with values for that record."""
-  data = data.copy()  # Do not modify the original dict.
-
-  # Name fields using newer dashboard nomenclature.
-  data['test_suite'] = data.pop('testsuite')
-  raw_test = data.pop('test')
-  if '/' in raw_test:
-    data['measurement'], data['test_case'] = raw_test.split('/', 1)
-  else:
-    # Alert was on a summary metric, i.e. a summary of the measurement across
-    # multiple test cases. Therefore, no test_case is associated with it.
-    data['measurement'], data['test_case'] = raw_test, None
-  data['bot'] = '/'.join([data.pop('master'), data.pop('bot')])
-
-  # Separate bug_id from alert status.
-  data['status'] = _CODE_TO_STATUS.get(data['bug_id'], 'triaged')
-  if data['status'] == 'triaged':
-    assert data['bug_id'] > 0
-  else:
-    # pandas cannot hold both int and None values in the same series, if so the
-    # type is coerced into float; to prevent this we use 0 to denote untriaged
-    # alerts with no bug_id assigned.
-    data['bug_id'] = 0
-
-  return tuple(data[k] for k in COLUMNS)
-
-
-def DataFrameFromJson(data):
-  return DataFrame([_RowFromJson(d) for d in data['anomalies']])
diff --git a/tools/perf/cli_tools/soundwave/tables/alerts_test.py b/tools/perf/cli_tools/soundwave/tables/alerts_test.py
deleted file mode 100644
index ad10607..0000000
--- a/tools/perf/cli_tools/soundwave/tables/alerts_test.py
+++ /dev/null
@@ -1,101 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import datetime
-import unittest
-
-from cli_tools.soundwave import tables
-from core.external_modules import pandas
-
-
-@unittest.skipIf(pandas is None, 'pandas not available')
-class TestAlerts(unittest.TestCase):
-  def testDataFrameFromJson(self):
-    data = {
-        'anomalies': [
-            {
-                'key': 'abc123',
-                'timestamp': '2009-02-13T23:31:30.000',
-                'testsuite': 'loading.mobile',
-                'test': 'timeToFirstInteractive/Google',
-                'master': 'ChromiumPerf',
-                'bot': 'android-nexus5',
-                'start_revision': 12345,
-                'end_revision': 12543,
-                'median_before_anomaly': 2037.18,
-                'median_after_anomaly': 2135.540,
-                'units': 'ms',
-                'improvement': False,
-                'bug_id': 55555,
-                'bisect_status': 'started',
-            },
-            {
-                'key': 'xyz567',
-                'timestamp': '2009-02-13T23:31:30.000',
-                'testsuite': 'loading.mobile',
-                'test': 'timeToFirstInteractive/Wikipedia',
-                'master': 'ChromiumPerf',
-                'bot': 'android-nexus5',
-                'start_revision': 12345,
-                'end_revision': 12543,
-                'median_before_anomaly': 2037.18,
-                'median_after_anomaly': 2135.540,
-                'units': 'ms',
-                'improvement': False,
-                'bug_id': None,
-                'bisect_status': 'started',
-            }
-        ]
-    }
-    alerts = tables.alerts.DataFrameFromJson(data)
-    self.assertEqual(len(alerts), 2)
-
-    alert = alerts.loc['abc123']
-    self.assertEqual(alert['timestamp'], datetime.datetime(
-        year=2009, month=2, day=13, hour=23, minute=31, second=30))
-    self.assertEqual(alert['bot'], 'ChromiumPerf/android-nexus5')
-    self.assertEqual(alert['test_suite'], 'loading.mobile')
-    self.assertEqual(alert['test_case'], 'Google')
-    self.assertEqual(alert['measurement'], 'timeToFirstInteractive')
-    self.assertEqual(alert['bug_id'], 55555)
-    self.assertEqual(alert['status'], 'triaged')
-
-    # We expect bug_id's to be integers.
-    self.assertTrue(pandas.api.types.is_integer_dtype(alerts['bug_id'].dtype))
-
-    # Missing bug_id's become 0.
-    self.assertEqual(alerts.loc['xyz567']['bug_id'], 0)
-
-  def testDataFrameFromJson_withSummaryMetric(self):
-    data = {
-        'anomalies': [
-            {
-                'key': 'abc123',
-                'timestamp': '2009-02-13T23:31:30.000',
-                'testsuite': 'loading.mobile',
-                'test': 'timeToFirstInteractive',
-                'master': 'ChromiumPerf',
-                'bot': 'android-nexus5',
-                'start_revision': 12345,
-                'end_revision': 12543,
-                'median_before_anomaly': 2037.18,
-                'median_after_anomaly': 2135.540,
-                'units': 'ms',
-                'improvement': False,
-                'bug_id': 55555,
-                'bisect_status': 'started',
-            }
-        ]
-    }
-    alerts = tables.alerts.DataFrameFromJson(data)
-    self.assertEqual(len(alerts), 1)
-
-    alert = alerts.loc['abc123']
-    self.assertEqual(alert['measurement'], 'timeToFirstInteractive')
-    self.assertIsNone(alert['test_case'])
-
-  def testDataFrameFromJson_noAlerts(self):
-    data = {'anomalies': []}
-    alerts = tables.alerts.DataFrameFromJson(data)
-    self.assertEqual(len(alerts), 0)
diff --git a/tools/perf/cli_tools/soundwave/tables/bugs.py b/tools/perf/cli_tools/soundwave/tables/bugs.py
deleted file mode 100644
index 111cc7b6..0000000
--- a/tools/perf/cli_tools/soundwave/tables/bugs.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import six
-
-from cli_tools.soundwave import pandas_sqlite
-from core.external_modules import pandas
-
-TABLE_NAME = 'bugs'
-COLUMN_TYPES = (
-    ('id', 'int64'),  # crbug number identifying this issue
-    ('summary',
-     six.text_type),  # issue title ('1%-5% regression in loading ...')
-    ('published', 'datetime64[ns]'),  # when the issue got created
-    ('updated', 'datetime64[ns]'),  # when the issue got last updated
-    ('state', str),  # usually either 'open' or 'closed'
-    ('status', str),  # current state of the bug ('Assigned', 'Fixed', etc.)
-    ('author', str),  # email of user who created the issue
-    ('owner', str),  # email of user who currently owns the issue
-    ('cc', str),  # comma-separated list of users cc'ed into the issue
-    ('components', str),  # comma-separated list of components ('Blink>Loader')
-    ('labels', str),  # comma-separated list of labels ('Type-Bug-Regression')
-)
-COLUMNS = tuple(c for c, _ in COLUMN_TYPES)
-DATE_COLUMNS = tuple(c for c, t in COLUMN_TYPES if t == 'datetime64[ns]')
-INDEX = COLUMNS[0]
-
-
-def DataFrame(rows=None):
-  return pandas_sqlite.DataFrame(COLUMN_TYPES, index=INDEX, rows=rows)
-
-
-def _CommaSeparate(values):
-  assert isinstance(values, list)
-  if values:
-    return ','.join(values)
-  return None
-
-
-def DataFrameFromJson(data):
-  rows = []
-  for row in data:
-    row = row['bug'].copy()
-    for key in ('cc', 'components', 'labels'):
-      row[key] = _CommaSeparate(row[key])
-    rows.append(tuple(row[k] for k in COLUMNS))
-
-  return DataFrame(rows)
-
-
-def Get(con, bug_id):
-  """Find the record for a bug_id in the given database connection.
-
-  Returns:
-    A pandas.Series with the record if found, or None otherwise.
-  """
-  df = pandas.read_sql(
-      'SELECT * FROM %s WHERE id=?' % TABLE_NAME, con, params=(bug_id,),
-      index_col=INDEX, parse_dates=DATE_COLUMNS)
-  return df.loc[bug_id] if len(df) else None
diff --git a/tools/perf/cli_tools/soundwave/tables/bugs_test.py b/tools/perf/cli_tools/soundwave/tables/bugs_test.py
deleted file mode 100644
index 14697ea..0000000
--- a/tools/perf/cli_tools/soundwave/tables/bugs_test.py
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import datetime
-import unittest
-
-from cli_tools.soundwave import tables
-from core.external_modules import pandas
-
-
-@unittest.skipIf(pandas is None, 'pandas not available')
-class TestBugs(unittest.TestCase):
-  def testDataFrameFromJson(self):
-    data = [
-        {
-            'bug': {
-                'id': 12345,
-                'summary': u'1%-\u221e% regression in loading at 123:125',
-                'published': '2018-04-09T17:01:09',
-                'updated': '2018-04-12T06:38:34',
-                'state': 'closed',
-                'status': 'Fixed',
-                'author': 'foo@chromium.org',
-                'owner': 'bar@chromium.org',
-                'cc': ['baz@chromium.org', 'foo@chromium.org'],
-                'components': [],
-                'labels': ['Perf-Regression', 'Foo>Label'],
-            }
-        }
-    ]
-
-    bugs = tables.bugs.DataFrameFromJson(data)
-    self.assertEqual(len(bugs), 1)
-
-    bug = bugs.loc[12345]  # Get bug by id.
-    self.assertEqual(bug['published'], datetime.datetime(
-        year=2018, month=4, day=9, hour=17, minute=1, second=9))
-    self.assertEqual(bug['status'], 'Fixed')
-    self.assertEqual(bug['cc'], 'baz@chromium.org,foo@chromium.org')
-    self.assertEqual(bug['components'], None)
-
-  def testDataFrameFromJson_noBugs(self):
-    data = []
-    bugs = tables.bugs.DataFrameFromJson(data)
-    self.assertEqual(len(bugs), 0)
diff --git a/tools/perf/cli_tools/soundwave/tables/timeseries.py b/tools/perf/cli_tools/soundwave/tables/timeseries.py
deleted file mode 100644
index 2dca786..0000000
--- a/tools/perf/cli_tools/soundwave/tables/timeseries.py
+++ /dev/null
@@ -1,178 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import collections
-
-from cli_tools.soundwave import pandas_sqlite
-from core.external_modules import pandas
-
-
-TABLE_NAME = 'timeseries'
-COLUMN_TYPES = (
-    # Index columns.
-    ('test_suite', str),  # benchmark name ('loading.mobile')
-    ('measurement', str),  # metric name ('timeToFirstContentfulPaint')
-    ('bot', str),  # master/builder name ('ChromiumPerf.android-nexus5')
-    ('test_case', str),  # story name ('Wikipedia')
-    ('point_id', 'int64'),  # monotonically increasing id for time series axis
-    # Other columns.
-    ('value', 'float64'),  # value recorded for test_path at given point_id
-    ('timestamp', 'datetime64[ns]'),  # when the value got stored on dashboard
-    ('commit_pos', 'int64'),  # chromium commit position
-    ('chromium_rev', str),  # git hash of chromium revision
-    ('clank_rev', str),  # git hash of clank revision
-    ('trace_url', str),  # URL to a sample trace.
-    ('units', str),  # unit of measurement (e.g. 'ms', 'bytes')
-    ('improvement_direction', str),  # good direction ('up', 'down', 'unknown')
-)
-COLUMNS = tuple(c for c, _ in COLUMN_TYPES)
-INDEX = COLUMNS[:5]
-
-# Copied from https://goo.gl/DzGYpW.
-_CODE_TO_IMPROVEMENT_DIRECTION = {
-    0: 'up',
-    1: 'down',
-}
-
-
-TEST_PATH_PARTS = (
-    'master', 'builder', 'test_suite', 'measurement', 'test_case')
-
-# Query template to find all data points of a given test_path (i.e. fixed
-# test_suite, measurement, bot, and test_case values).
-_QUERY_TIME_SERIES = (
-    'SELECT * FROM %s WHERE %s'
-    % (TABLE_NAME, ' AND '.join('%s=?' % c for c in INDEX[:-1])))
-
-
-# Required columns to request from /timeseries2 API.
-_TIMESERIES2_COLS = [
-    'revision',
-    'revisions',
-    'avg',
-    'timestamp',
-    'annotations']
-
-
-class Key(collections.namedtuple('Key', INDEX[:-1])):
-  """Uniquely identifies a single timeseries."""
-
-  @classmethod
-  def FromDict(cls, *args, **kwargs):
-    kwargs = dict(*args, **kwargs)
-    kwargs.setdefault('test_case', '')  # test_case is optional.
-    return cls(**kwargs)
-
-  def AsDict(self):
-    return dict(zip(self._fields, self))
-
-  def AsApiParams(self):
-    """Return a dict with params for a /timeseries2 API request."""
-    params = self.AsDict()
-    if not params['test_case']:
-      del params['test_case']  # test_case is optional.
-    params['columns'] = ','.join(_TIMESERIES2_COLS)
-    return params
-
-
-def DataFrame(rows=None):
-  return pandas_sqlite.DataFrame(COLUMN_TYPES, index=INDEX, rows=rows)
-
-
-def _ParseIntValue(value, on_error=-1):
-  # Try to parse as int and, in case of error, return a pre-defined value.
-  try:
-    return int(value)
-  except Exception:
-    return on_error
-
-
-def _ParseConfigFromTestPath(test_path):
-  if isinstance(test_path, Key):
-    return test_path.AsDict()
-
-  values = test_path.split('/', len(TEST_PATH_PARTS) - 1)
-  if len(values) < len(TEST_PATH_PARTS):
-    values.append('')  # Possibly missing test_case.
-  if len(values) != len(TEST_PATH_PARTS):
-    raise ValueError(test_path)
-  config = dict(zip(TEST_PATH_PARTS, values))
-  config['bot'] = '%s/%s' % (config.pop('master'), config.pop('builder'))
-  return config
-
-
-def DataFrameFromJson(test_path, data):
-  if isinstance(test_path, Key):
-    return _DataFrameFromJsonV2(test_path, data)
-  # TODO(crbug.com/907121): Remove when we can switch entirely to v2.
-  return _DataFrameFromJsonV1(test_path, data)
-
-
-def _DataFrameFromJsonV2(ts_key, data):
-  rows = []
-  for point in data['data']:
-    point = dict(zip(_TIMESERIES2_COLS, point))
-    rows.append(ts_key + (
-        point['revision'],  # point_id
-        point['avg'],  # value
-        point['timestamp'],  # timestamp
-        _ParseIntValue(point['revisions']['r_commit_pos']),  # commit_pos
-        point['revisions'].get('r_chromium'),  # chromium_rev
-        point['revisions'].get('r_clank'),  # clank_rev
-        point['annotations'].get('a_tracing_uri'),  # trace_url
-        data['units'],  # units
-        data['improvement_direction'],  # improvement_direction
-    ))
-  return DataFrame(rows)
-
-
-def _DataFrameFromJsonV1(test_path, data):
-  # The dashboard API returns an empty list if there is no recent data for the
-  # timeseries.
-  if not data:
-    return DataFrame()
-  assert test_path == data['test_path']
-  config = _ParseConfigFromTestPath(data['test_path'])
-  config['improvement_direction'] = _CODE_TO_IMPROVEMENT_DIRECTION.get(
-      data['improvement_direction'], 'unknown')
-  timeseries = data['timeseries']
-  # The first element in timeseries list contains header with column names.
-  header = timeseries[0]
-  rows = []
-
-  # Remaining elements contain the values for each row.
-  for values in timeseries[1:]:
-    row = config.copy()
-    row.update(zip(header, values))
-    row['point_id'] = row['revision']
-    row['commit_pos'] = _ParseIntValue(row['r_commit_pos'])
-    row['chromium_rev'] = row.get('r_chromium')
-    row['clank_rev'] = row.get('r_clank', None)
-    rows.append(tuple(row.get(k) for k in COLUMNS))
-
-  return DataFrame(rows)
-
-
-def GetTimeSeries(con, test_path, extra_cond=None):
-  """Get the records for all data points on the given test_path.
-
-  Returns:
-    A pandas.DataFrame with all records found.
-  """
-  config = _ParseConfigFromTestPath(test_path)
-  params = tuple(config[c] for c in INDEX[:-1])
-  query = _QUERY_TIME_SERIES
-  if extra_cond is not None:
-    query = ' '.join([query, extra_cond])
-  return pandas.read_sql(query, con, params=params, parse_dates=['timestamp'])
-
-
-def GetMostRecentPoint(con, test_path):
-  """Find the record for the most recent data point on the given test_path.
-
-  Returns:
-    A pandas.Series with the record if found, or None otherwise.
-  """
-  df = GetTimeSeries(con, test_path, 'ORDER BY timestamp DESC LIMIT 1')
-  return df.iloc[0] if not df.empty else None
diff --git a/tools/perf/cli_tools/soundwave/tables/timeseries_test.py b/tools/perf/cli_tools/soundwave/tables/timeseries_test.py
deleted file mode 100644
index 9e58c17..0000000
--- a/tools/perf/cli_tools/soundwave/tables/timeseries_test.py
+++ /dev/null
@@ -1,247 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import datetime
-import unittest
-
-from cli_tools.soundwave import pandas_sqlite
-from cli_tools.soundwave import tables
-from core.external_modules import pandas
-
-
-def SamplePoint(point_id, value, timestamp=None, missing_commit_pos=False):
-  """Build a sample point as returned by timeseries2 API."""
-  revisions = {
-      'r_commit_pos': str(point_id),
-      'r_chromium': 'chromium@%d' % point_id,
-  }
-  annotations = {
-      'a_tracing_uri': 'http://example.com/trace/%d' % point_id
-  }
-
-  if timestamp is None:
-    timestamp = datetime.datetime.utcfromtimestamp(
-        1234567890 + 60 * point_id).isoformat()
-  if missing_commit_pos:
-    # Some data points have a missing commit position.
-    revisions['r_commit_pos'] = None
-  return [
-      point_id,
-      revisions,
-      value,
-      timestamp,
-      annotations,
-  ]
-
-
-class TestKey(unittest.TestCase):
-  def testKeyFromDict_typical(self):
-    key1 = tables.timeseries.Key.FromDict({
-        'test_suite': 'loading.mobile',
-        'bot': 'ChromiumPerf:android-nexus5',
-        'measurement': 'timeToFirstInteractive',
-        'test_case': 'Wikipedia'})
-    key2 = tables.timeseries.Key(
-        test_suite='loading.mobile',
-        measurement='timeToFirstInteractive',
-        bot='ChromiumPerf:android-nexus5',
-        test_case='Wikipedia')
-    self.assertEqual(key1, key2)
-
-  def testKeyFromDict_defaultTestCase(self):
-    key1 = tables.timeseries.Key.FromDict({
-        'test_suite': 'loading.mobile',
-        'bot': 'ChromiumPerf:android-nexus5',
-        'measurement': 'timeToFirstInteractive'})
-    key2 = tables.timeseries.Key(
-        test_suite='loading.mobile',
-        measurement='timeToFirstInteractive',
-        bot='ChromiumPerf:android-nexus5',
-        test_case='')
-    self.assertEqual(key1, key2)
-
-  def testKeyFromDict_invalidArgsRaises(self):
-    with self.assertRaises(TypeError):
-      tables.timeseries.Key.FromDict({
-          'test_suite': 'loading.mobile',
-          'bot': 'ChromiumPerf:android-nexus5'})
-
-
-@unittest.skipIf(pandas is None, 'pandas not available')
-class TestTimeSeries(unittest.TestCase):
-  def testDataFrameFromJsonV1(self):
-    test_path = ('ChromiumPerf/android-nexus5/loading.mobile'
-                 '/timeToFirstInteractive/PageSet/Google')
-    data = {
-        'test_path': test_path,
-        'improvement_direction': 1,
-        'timeseries': [
-            ['revision', 'value', 'timestamp', 'r_commit_pos', 'r_chromium'],
-            [547397, 2300.3, '2018-04-01T14:16:32.000', '547397', 'adb123'],
-            [547398, 2750.9, '2018-04-01T18:24:04.000', '547398', 'cde456'],
-            [547423, 2342.2, '2018-04-02T02:19:00.000', '547423', 'fab789'],
-            # Some timeseries have a missing commit position.
-            [547836, 2402.5, '2018-04-02T02:20:00.000', None, 'acf147'],
-        ]
-    }
-
-    timeseries = tables.timeseries.DataFrameFromJson(test_path, data)
-    # Check the integrity of the index: there should be no duplicates.
-    self.assertFalse(timeseries.index.duplicated().any())
-    self.assertEqual(len(timeseries), 4)
-
-    # Check values on the first point of the series.
-    point = timeseries.reset_index().iloc[0]
-    self.assertEqual(point['test_suite'], 'loading.mobile')
-    self.assertEqual(point['measurement'], 'timeToFirstInteractive')
-    self.assertEqual(point['bot'], 'ChromiumPerf/android-nexus5')
-    self.assertEqual(point['test_case'], 'PageSet/Google')
-    self.assertEqual(point['improvement_direction'], 'down')
-    self.assertEqual(point['point_id'], 547397)
-    self.assertEqual(point['value'], 2300.3)
-    self.assertEqual(point['timestamp'], datetime.datetime(
-        year=2018, month=4, day=1, hour=14, minute=16, second=32))
-    self.assertEqual(point['commit_pos'], 547397)
-    self.assertEqual(point['chromium_rev'], 'adb123')
-    self.assertEqual(point['clank_rev'], None)
-
-  def testDataFrameFromJsonV2(self):
-    test_path = tables.timeseries.Key(
-        test_suite='loading.mobile',
-        measurement='timeToFirstInteractive',
-        bot='ChromiumPerf:android-nexus5',
-        test_case='Wikipedia')
-    data = {
-        'improvement_direction': 'down',
-        'units': 'ms',
-        'data': [
-            SamplePoint(547397, 2300.3, timestamp='2018-04-01T14:16:32.000'),
-            SamplePoint(547398, 2750.9),
-            SamplePoint(547423, 2342.2),
-            SamplePoint(547836, 2402.5, missing_commit_pos=True),
-        ]
-    }
-
-    timeseries = tables.timeseries.DataFrameFromJson(test_path, data)
-    # Check the integrity of the index: there should be no duplicates.
-    self.assertFalse(timeseries.index.duplicated().any())
-    self.assertEqual(len(timeseries), 4)
-
-    # Check values on the first point of the series.
-    point = timeseries.reset_index().iloc[0]
-    self.assertEqual(point['test_suite'], 'loading.mobile')
-    self.assertEqual(point['measurement'], 'timeToFirstInteractive')
-    self.assertEqual(point['bot'], 'ChromiumPerf:android-nexus5')
-    self.assertEqual(point['test_case'], 'Wikipedia')
-    self.assertEqual(point['improvement_direction'], 'down')
-    self.assertEqual(point['units'], 'ms')
-    self.assertEqual(point['point_id'], 547397)
-    self.assertEqual(point['value'], 2300.3)
-    self.assertEqual(point['timestamp'], datetime.datetime(
-        year=2018, month=4, day=1, hour=14, minute=16, second=32))
-    self.assertEqual(point['commit_pos'], 547397)
-    self.assertEqual(point['chromium_rev'], 'chromium@547397')
-    self.assertEqual(point['clank_rev'], None)
-
-  def testDataFrameFromJson_withSummaryMetric(self):
-    test_path = tables.timeseries.Key(
-        test_suite='loading.mobile',
-        measurement='timeToFirstInteractive',
-        bot='ChromiumPerf:android-nexus5',
-        test_case='')
-    data = {
-        'improvement_direction': 'down',
-        'units': 'ms',
-        'data': [
-            SamplePoint(547397, 2300.3),
-            SamplePoint(547398, 2750.9),
-        ],
-    }
-
-    timeseries = tables.timeseries.DataFrameFromJson(
-        test_path, data).reset_index()
-    self.assertTrue((timeseries['test_case'] == '').all())
-
-  def testGetTimeSeries(self):
-    test_path = tables.timeseries.Key(
-        test_suite='loading.mobile',
-        measurement='timeToFirstInteractive',
-        bot='ChromiumPerf:android-nexus5',
-        test_case='Wikipedia')
-    data = {
-        'improvement_direction': 'down',
-        'units': 'ms',
-        'data': [
-            SamplePoint(547397, 2300.3),
-            SamplePoint(547398, 2750.9),
-            SamplePoint(547423, 2342.2),
-        ]
-    }
-
-    timeseries_in = tables.timeseries.DataFrameFromJson(test_path, data)
-    with tables.DbSession(':memory:') as con:
-      pandas_sqlite.InsertOrReplaceRecords(con, 'timeseries', timeseries_in)
-      timeseries_out = tables.timeseries.GetTimeSeries(con, test_path)
-      # Both DataFrame's should be equal, except the one we get out of the db
-      # does not have an index defined.
-      timeseries_in = timeseries_in.reset_index()
-      self.assertTrue(timeseries_in.equals(timeseries_out))
-
-  def testGetTimeSeries_withSummaryMetric(self):
-    test_path = tables.timeseries.Key(
-        test_suite='loading.mobile',
-        measurement='timeToFirstInteractive',
-        bot='ChromiumPerf:android-nexus5',
-        test_case='')
-    data = {
-        'improvement_direction': 'down',
-        'units': 'ms',
-        'data': [
-            SamplePoint(547397, 2300.3),
-            SamplePoint(547398, 2750.9),
-            SamplePoint(547423, 2342.2),
-        ]
-    }
-
-    timeseries_in = tables.timeseries.DataFrameFromJson(test_path, data)
-    with tables.DbSession(':memory:') as con:
-      pandas_sqlite.InsertOrReplaceRecords(con, 'timeseries', timeseries_in)
-      timeseries_out = tables.timeseries.GetTimeSeries(con, test_path)
-      # Both DataFrame's should be equal, except the one we get out of the db
-      # does not have an index defined.
-      timeseries_in = timeseries_in.reset_index()
-      self.assertTrue(timeseries_in.equals(timeseries_out))
-
-  def testGetMostRecentPoint_success(self):
-    test_path = tables.timeseries.Key(
-        test_suite='loading.mobile',
-        measurement='timeToFirstInteractive',
-        bot='ChromiumPerf:android-nexus5',
-        test_case='Wikipedia')
-    data = {
-        'improvement_direction': 'down',
-        'units': 'ms',
-        'data': [
-            SamplePoint(547397, 2300.3),
-            SamplePoint(547398, 2750.9),
-            SamplePoint(547423, 2342.2),
-        ]
-    }
-
-    timeseries = tables.timeseries.DataFrameFromJson(test_path, data)
-    with tables.DbSession(':memory:') as con:
-      pandas_sqlite.InsertOrReplaceRecords(con, 'timeseries', timeseries)
-      point = tables.timeseries.GetMostRecentPoint(con, test_path)
-      self.assertEqual(point['point_id'], 547423)
-
-  def testGetMostRecentPoint_empty(self):
-    test_path = tables.timeseries.Key(
-        test_suite='loading.mobile',
-        measurement='timeToFirstInteractive',
-        bot='ChromiumPerf:android-nexus5',
-        test_case='Wikipedia')
-
-    with tables.DbSession(':memory:') as con:
-      point = tables.timeseries.GetMostRecentPoint(con, test_path)
-      self.assertIsNone(point)
diff --git a/tools/perf/cli_tools/soundwave/worker_pool.py b/tools/perf/cli_tools/soundwave/worker_pool.py
deleted file mode 100644
index b8faca0..0000000
--- a/tools/perf/cli_tools/soundwave/worker_pool.py
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-Use a pool of workers to concurrently process a sequence of items.
-
-Example usage:
-
-    from soundwave import worker_pool
-
-    def MyWorker(args):
-      # This is called once for each worker to initialize it.
-
-      def Process(item):
-        # This will be called once for each item processed by this worker.
-
-      # Hook up the Process function so the worker_pool module can find it.
-      worker_pool.Process = Process
-
-    args.processes = 10  # Set number of processes to be used by the pool.
-    worker_pool.Run('This might take a while: ', MyWorker, args, items)
-"""
-import logging
-import multiprocessing
-import sys
-
-from core.external_modules import pandas
-
-
-# Worker implementations override this value
-Process = NotImplemented  # pylint: disable=invalid-name
-
-
-def ProgressIndicator(label, iterable, stream=None):
-  if stream is None:
-    stream = sys.stdout
-  stream.write(label)
-  stream.flush()
-  for _ in iterable:
-    stream.write('.')
-    stream.flush()
-  stream.write('\n')
-  stream.flush()
-
-
-def Run(label, worker, args, items, stream=None):
-  """Use a pool of workers to concurrently process a sequence of items.
-
-  Args:
-    label: A string displayed by the progress indicator when the job starts.
-    worker: A function with the worker implementation. See example above.
-    args: An argparse.Namespace() object used to initialize the workers. The
-        value of args.processes is the number of processes used by the pool.
-    items: An iterable with items to process by the pool of workers.
-    stream: A file-like object for the progress indicator output, defaults to
-        sys.stdout.
-
-  Returns:
-    Total time in seconds spent by the pool to process all items.
-  """
-  pool = multiprocessing.Pool(
-      processes=args.processes, initializer=worker, initargs=(args,))
-  time_started = pandas.Timestamp.utcnow()
-  try:
-    ProgressIndicator(label, pool.imap_unordered(_Worker, items), stream=stream)
-    time_finished = pandas.Timestamp.utcnow()
-  finally:
-    # Ensure resources (e.g. db connections from workers) are freed up.
-    pool.terminate()
-    pool.join()
-  return (time_finished - time_started).total_seconds()
-
-
-def _Worker(item):
-  try:
-    Process(item)  # pylint: disable=not-callable
-  except KeyboardInterrupt:
-    pass
-  except:
-    logging.exception('Worker failed with exception')
-    raise
diff --git a/tools/perf/cli_tools/soundwave/worker_pool_test.py b/tools/perf/cli_tools/soundwave/worker_pool_test.py
deleted file mode 100644
index 092780d..0000000
--- a/tools/perf/cli_tools/soundwave/worker_pool_test.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2018 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 shutil
-try:
-  import sqlite3
-except ImportError:
-  pass
-import tempfile
-import unittest
-
-from cli_tools.soundwave import pandas_sqlite
-from cli_tools.soundwave import worker_pool
-from core.external_modules import pandas
-from telemetry import decorators
-
-
-def TestWorker(args):
-  con = sqlite3.connect(args.database_file)
-
-  def Process(item):
-    # Add item to the database.
-    df = pandas.DataFrame({'item': [item]})
-    df.to_sql('items', con, index=False, if_exists='append')
-
-  worker_pool.Process = Process
-
-
-@unittest.skipIf(pandas is None, 'pandas not available')
-class TestWorkerPool(unittest.TestCase):
-
-  @decorators.Disabled('all')  # crbug.com/939777
-  def testWorkerPoolRun(self):
-    tempdir = tempfile.mkdtemp()
-    try:
-      args = argparse.Namespace()
-      args.database_file = os.path.join(tempdir, 'test.db')
-      args.processes = 3
-      schema = pandas_sqlite.DataFrame([('item', int)])
-      items = range(20)  # We'll write these in the database.
-      con = sqlite3.connect(args.database_file)
-      try:
-        pandas_sqlite.CreateTableIfNotExists(con, 'items', schema)
-        with open(os.devnull, 'w') as devnull:
-          worker_pool.Run(
-              'Processing:', TestWorker, args, items, stream=devnull)
-        df = pandas.read_sql('SELECT * FROM items', con)
-        # Check all of our items were written.
-        self.assertItemsEqual(df['item'], items)
-      finally:
-        con.close()
-    finally:
-      shutil.rmtree(tempdir)
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py
index 7b5bb217..a6522b21 100644
--- a/tools/perf/core/bot_platforms.py
+++ b/tools/perf/core/bot_platforms.py
@@ -511,9 +511,6 @@
 _ANDROID_PIXEL6_PRO_EXECUTABLE_CONFIGS = frozenset([
     _components_perftests(60),
 ])
-_ANDROID_GO_WEMBLEY_BENCHMARK_CONFIGS = PerfSuite(
-    [_GetBenchmarkConfig('startup.mobile'),
-     _GetBenchmarkConfig('speedometer2')])
 _ANDROID_PIXEL2_AAB_FYI_BENCHMARK_CONFIGS = PerfSuite(
     [_GetBenchmarkConfig('startup.mobile')])
 _ANDROID_PIXEL2_FYI_BENCHMARK_CONFIGS = PerfSuite([
@@ -762,10 +759,11 @@
     'android',
     executables=_ANDROID_PIXEL6_PRO_EXECUTABLE_CONFIGS,
     pinpoint_only=True)
-ANDROID_GO_WEMBLEY = PerfPlatform('android-go-wembley-perf',
-                                  'Android U',
-                                  _ANDROID_GO_WEMBLEY_BENCHMARK_CONFIGS, 2,
-                                  'android')
+ANDROID_GO_WEMBLEY = PerfPlatform('android-go-wembley-perf', 'Android U',
+                                  _ANDROID_GO_BENCHMARK_CONFIGS, 20, 'android')
+ANDROID_GO_WEMBLEY_WEBVIEW = PerfPlatform(
+    'android-go-wembley_webview-perf', 'Android U',
+    _ANDROID_GO_WEBVIEW_BENCHMARK_CONFIGS, 20, 'android')
 ANDROID_NEW_PIXEL = PerfPlatform('android-new-pixel-perf',
                                  'Android T',
                                  PerfSuite([]),
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py
index a66fff3..403e1db 100755
--- a/tools/perf/core/perf_data_generator.py
+++ b/tools/perf/core/perf_data_generator.py
@@ -761,6 +761,18 @@
             'device_os_flavor': 'google',
         },
     },
+    'android-go-wembley_webview-perf': {
+        'tests': [{
+            'isolate': 'performance_webview_test_suite',
+        }],
+        'platform': 'android-webview-google',
+        'dimension': {
+            'pool': 'chrome.tests.perf-webview',
+            'os': 'Android',
+            'device_type': 'wembley_2GB',
+            'device_os_flavor': 'google',
+        },
+    },
     'android-new-pixel-perf': {
         'tests': [{
             'isolate':
@@ -1861,7 +1873,7 @@
 
   result = {
       'args': test_args,
-      'isolate_name': isolate_name,
+      'test': isolate_name,
       'name': test_name,
       'override_compile_targets': [isolate_name]
   }
diff --git a/tools/perf/core/perf_json_config_validator.py b/tools/perf/core/perf_json_config_validator.py
index 6a2f814..e0f6c0a 100644
--- a/tools/perf/core/perf_json_config_validator.py
+++ b/tools/perf/core/perf_json_config_validator.py
@@ -159,7 +159,7 @@
     _ValidateSwarmingDimension(
         builder_name,
         swarming_dimensions=test_config['swarming'].get('dimension_sets', {}))
-    if test_config['isolate_name'] in _PERFORMANCE_TEST_SUITES:
+    if test_config['test'] in _PERFORMANCE_TEST_SUITES:
       _ValidateShardingData(builder_name, test_config)
       _ValidateBrowserType(builder_name, test_config)
 
diff --git a/tools/perf/core/shard_maps/android-go-wembley-perf_map.json b/tools/perf/core/shard_maps/android-go-wembley-perf_map.json
index fc976a9..cbabc237 100644
--- a/tools/perf/core/shard_maps/android-go-wembley-perf_map.json
+++ b/tools/perf/core/shard_maps/android-go-wembley-perf_map.json
@@ -1,30 +1,360 @@
 {
     "0": {
         "benchmarks": {
-            "speedometer2": {
+            "speedometer": {
                 "abridged": false
             },
-            "startup.mobile": {
-                "end": 1,
+            "system_health.common_mobile": {
+                "sections": [
+                    {
+                        "begin": 0,
+                        "end": 1
+                    },
+                    {
+                        "begin": 42,
+                        "end": 43
+                    }
+                ],
+                "abridged": false
+            },
+            "speedometer2": {
                 "abridged": false
             }
         }
     },
     "1": {
         "benchmarks": {
+            "speedometer2": {
+                "abridged": false
+            },
+            "system_health.common_mobile": {
+                "sections": [
+                    {
+                        "begin": 0,
+                        "end": 1
+                    },
+                    {
+                        "begin": 42,
+                        "end": 43
+                    }
+                ],
+                "abridged": false
+            }
+        }
+    },
+    "2": {
+        "benchmarks": {
+            "startup.mobile": {
+                "end": 1,
+                "abridged": false
+            },
+            "system_health.common_mobile": {
+                "sections": [
+                    {
+                        "begin": 0,
+                        "end": 1
+                    },
+                    {
+                        "begin": 42,
+                        "end": 43
+                    }
+                ],
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            }
+        }
+    },
+    "3": {
+        "benchmarks": {
             "startup.mobile": {
                 "begin": 1,
+                "end": 2,
+                "abridged": false
+            },
+            "system_health.common_mobile": {
+                "sections": [
+                    {
+                        "begin": 0,
+                        "end": 1
+                    },
+                    {
+                        "begin": 42,
+                        "end": 43
+                    }
+                ],
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            }
+        }
+    },
+    "4": {
+        "benchmarks": {
+            "startup.mobile": {
+                "begin": 2,
+                "end": 3,
+                "abridged": false
+            },
+            "system_health.common_mobile": {
+                "sections": [
+                    {
+                        "begin": 0,
+                        "end": 1
+                    },
+                    {
+                        "begin": 42,
+                        "end": 43
+                    }
+                ],
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            }
+        }
+    },
+    "5": {
+        "benchmarks": {
+            "startup.mobile": {
+                "begin": 3,
+                "abridged": false
+            },
+            "system_health.common_mobile": {
+                "sections": [
+                    {
+                        "begin": 0,
+                        "end": 1
+                    },
+                    {
+                        "begin": 42,
+                        "end": 43
+                    }
+                ],
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            }
+        }
+    },
+    "6": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "sections": [
+                    {
+                        "begin": 0,
+                        "end": 5
+                    },
+                    {
+                        "begin": 42,
+                        "end": 43
+                    }
+                ],
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            }
+        }
+    },
+    "7": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "sections": [
+                    {
+                        "begin": 0,
+                        "end": 1
+                    },
+                    {
+                        "begin": 5,
+                        "end": 9
+                    },
+                    {
+                        "begin": 42,
+                        "end": 43
+                    }
+                ],
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            }
+        }
+    },
+    "8": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "sections": [
+                    {
+                        "begin": 0,
+                        "end": 1
+                    },
+                    {
+                        "begin": 9,
+                        "end": 13
+                    },
+                    {
+                        "begin": 42,
+                        "end": 43
+                    }
+                ],
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            }
+        }
+    },
+    "9": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "sections": [
+                    {
+                        "begin": 0,
+                        "end": 1
+                    },
+                    {
+                        "begin": 13,
+                        "end": 17
+                    },
+                    {
+                        "begin": 42,
+                        "end": 43
+                    }
+                ],
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            }
+        }
+    },
+    "10": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 17,
+                "end": 34,
+                "abridged": false
+            }
+        }
+    },
+    "11": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 34,
+                "end": 51,
+                "abridged": false
+            }
+        }
+    },
+    "12": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 51,
+                "end": 68,
+                "abridged": false
+            }
+        }
+    },
+    "13": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 68,
+                "abridged": false
+            },
+            "system_health.memory_mobile": {
+                "end": 8,
+                "abridged": false
+            }
+        }
+    },
+    "14": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 8,
+                "end": 25,
+                "abridged": false
+            }
+        }
+    },
+    "15": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 25,
+                "end": 41,
+                "abridged": false
+            }
+        }
+    },
+    "16": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 41,
+                "end": 58,
+                "abridged": false
+            }
+        }
+    },
+    "17": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 58,
+                "end": 74,
+                "abridged": false
+            }
+        }
+    },
+    "18": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 74,
+                "abridged": false
+            },
+            "system_health.webview_startup": {
+                "abridged": false
+            },
+            "v8.browsing_mobile": {
+                "end": 14,
+                "abridged": false
+            }
+        }
+    },
+    "19": {
+        "benchmarks": {
+            "v8.browsing_mobile": {
+                "begin": 14,
                 "abridged": false
             }
         }
     },
     "extra_infos": {
-        "num_stories": 5,
-        "predicted_min_shard_time": 221.0,
-        "predicted_min_shard_index": 0,
-        "predicted_max_shard_time": 277.0,
-        "predicted_max_shard_index": 1,
-        "shard #0": 221.0,
-        "shard #1": 277.0
+        "num_stories": 217,
+        "predicted_min_shard_time": 125.0,
+        "predicted_min_shard_index": 1,
+        "predicted_max_shard_time": 289.0,
+        "predicted_max_shard_index": 2,
+        "shard #0": 135.0,
+        "shard #1": 125.0,
+        "shard #2": 289.0,
+        "shard #3": 212.0,
+        "shard #4": 239.0,
+        "shard #5": 237.0,
+        "shard #6": 165.0,
+        "shard #7": 165.0,
+        "shard #8": 165.0,
+        "shard #9": 165.0,
+        "shard #10": 170,
+        "shard #11": 170,
+        "shard #12": 170,
+        "shard #13": 160,
+        "shard #14": 170,
+        "shard #15": 160,
+        "shard #16": 170,
+        "shard #17": 160,
+        "shard #18": 170,
+        "shard #19": 170
     }
 }
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/android-go-wembley_webview-perf_map.json b/tools/perf/core/shard_maps/android-go-wembley_webview-perf_map.json
new file mode 100644
index 0000000..34b2a72e
--- /dev/null
+++ b/tools/perf/core/shard_maps/android-go-wembley_webview-perf_map.json
@@ -0,0 +1,225 @@
+{
+    "0": {
+        "benchmarks": {
+            "speedometer": {
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            },
+            "startup.mobile": {
+                "abridged": false
+            },
+            "system_health.common_mobile": {
+                "end": 4,
+                "abridged": false
+            }
+        }
+    },
+    "1": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 4,
+                "end": 13,
+                "abridged": false
+            }
+        }
+    },
+    "2": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 13,
+                "end": 23,
+                "abridged": false
+            }
+        }
+    },
+    "3": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 23,
+                "end": 32,
+                "abridged": false
+            }
+        }
+    },
+    "4": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 32,
+                "end": 42,
+                "abridged": false
+            }
+        }
+    },
+    "5": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 42,
+                "end": 51,
+                "abridged": false
+            }
+        }
+    },
+    "6": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 51,
+                "end": 61,
+                "abridged": false
+            }
+        }
+    },
+    "7": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 61,
+                "end": 70,
+                "abridged": false
+            }
+        }
+    },
+    "8": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 70,
+                "abridged": false
+            },
+            "system_health.memory_mobile": {
+                "end": 4,
+                "abridged": false
+            }
+        }
+    },
+    "9": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 4,
+                "end": 13,
+                "abridged": false
+            }
+        }
+    },
+    "10": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 13,
+                "end": 23,
+                "abridged": false
+            }
+        }
+    },
+    "11": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 23,
+                "end": 32,
+                "abridged": false
+            }
+        }
+    },
+    "12": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 32,
+                "end": 42,
+                "abridged": false
+            }
+        }
+    },
+    "13": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 42,
+                "end": 51,
+                "abridged": false
+            }
+        }
+    },
+    "14": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 51,
+                "end": 61,
+                "abridged": false
+            }
+        }
+    },
+    "15": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 61,
+                "end": 70,
+                "abridged": false
+            }
+        }
+    },
+    "16": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 70,
+                "abridged": false
+            },
+            "system_health.webview_startup": {
+                "abridged": false
+            },
+            "v8.browsing_mobile": {
+                "end": 3,
+                "abridged": false
+            }
+        }
+    },
+    "17": {
+        "benchmarks": {
+            "v8.browsing_mobile": {
+                "begin": 3,
+                "end": 12,
+                "abridged": false
+            }
+        }
+    },
+    "18": {
+        "benchmarks": {
+            "v8.browsing_mobile": {
+                "begin": 12,
+                "end": 22,
+                "abridged": false
+            }
+        }
+    },
+    "19": {
+        "benchmarks": {
+            "v8.browsing_mobile": {
+                "begin": 22,
+                "abridged": false
+            }
+        }
+    },
+    "extra_infos": {
+        "num_stories": 190,
+        "predicted_min_shard_time": 90,
+        "predicted_min_shard_index": 1,
+        "predicted_max_shard_time": 100,
+        "predicted_max_shard_index": 0,
+        "shard #0": 100,
+        "shard #1": 90,
+        "shard #2": 100,
+        "shard #3": 90,
+        "shard #4": 100,
+        "shard #5": 90,
+        "shard #6": 100,
+        "shard #7": 90,
+        "shard #8": 100,
+        "shard #9": 90,
+        "shard #10": 100,
+        "shard #11": 90,
+        "shard #12": 100,
+        "shard #13": 90,
+        "shard #14": 100,
+        "shard #15": 90,
+        "shard #16": 100,
+        "shard #17": 90,
+        "shard #18": 100,
+        "shard #19": 90
+    }
+}
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/android-go-wembley-perf_timing.json b/tools/perf/core/shard_maps/timing_data/android-go-wembley-perf_timing.json
index 5f1fa64..8ecaa765 100644
--- a/tools/perf/core/shard_maps/timing_data/android-go-wembley-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/android-go-wembley-perf_timing.json
@@ -1,22 +1,22 @@
 [
     {
-        "duration": "123.0",
+        "duration": "105.0",
         "name": "speedometer2/Speedometer2"
     },
     {
-        "duration": "104.0",
+        "duration": "114.0",
         "name": "startup.mobile/cct:coldish:bbc"
     },
     {
-        "duration": "98.0",
+        "duration": "164.0",
         "name": "startup.mobile/intent:coldish:bbc"
     },
     {
-        "duration": "69.0",
+        "duration": "87.0",
         "name": "startup.mobile/intent:warm:bbc"
     },
     {
-        "duration": "104.0",
+        "duration": "112.0",
         "name": "startup.mobile/maps_pwa:with_http_cache"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/android-go-wembley_webview-perf_timing.json b/tools/perf/core/shard_maps/timing_data/android-go-wembley_webview-perf_timing.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/tools/perf/core/shard_maps/timing_data/android-go-wembley_webview-perf_timing.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/tools/perf/cross_device_test_config.py b/tools/perf/cross_device_test_config.py
index 88da783..260159e 100644
--- a/tools/perf/cross_device_test_config.py
+++ b/tools/perf/cross_device_test_config.py
@@ -57,6 +57,20 @@
             'Speedometer2': 10,
         },
     },
+    'android-go-wembley-perf': {
+        'jetstream2': {
+            'JetStream2': 5,
+        },
+        'system_health.common_mobile': {
+            # timeToFirstContentfulPaint
+            'background:social:facebook:2019': 10,
+            # cputimeToFirstContentfulPaint
+            'load:search:google:2018': 10
+        },
+        'speedometer2': {
+            'Speedometer2': 10,
+        },
+    },
     'android-pixel4-perf': {
         'jetstream2': {
             'JetStream2': 5,
diff --git a/tools/perf/examples/soundwave/startup_timeseries.json b/tools/perf/examples/soundwave/startup_timeseries.json
deleted file mode 100644
index ea99b39..0000000
--- a/tools/perf/examples/soundwave/startup_timeseries.json
+++ /dev/null
@@ -1,8 +0,0 @@
-[
-  {
-    "test_suite": "startup.mobile",
-    "measurement": "first_contentful_paint_time",
-    "bot": "ChromiumPerf:android-go-perf",
-    "test_case": "intent_coldish_bbc"
-  }
-]
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 4b8d728..fd47c26 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -51,6 +51,12 @@
 crbug.com/966613 [ android-pixel-2 ] blink_perf.parser/query-selector-all-class-deep.html [ Skip ]
 crbug.com/966613 [ android-pixel-2 ] blink_perf.parser/query-selector-all-deep.html [ Skip ]
 crbug.com/966613 [ android-pixel-2 ] blink_perf.parser/query-selector-all-id-deep.html [ Skip ]
+crbug.com/1477958 blink_perf.parser/declarative-shadow-dom.html [ Skip ]
+
+# Benchmark: blink_perf.shadow_dom
+crbug.com/1477958 blink_perf.shadow_dom/imperative-shadow-dom-overhead.html [ Skip ]
+crbug.com/1477958 blink_perf.shadow_dom/shadow-dom-overhead-iframe.html [ Skip ]
+crbug.com/1477958 blink_perf.shadow_dom/shadow-dom-overhead.html [ Skip ]
 
 # Benchmark: blink_perf.svg
 crbug.com/846061 [ win ] blink_perf.svg/SierpinskiCarpet.html [ Skip ]
diff --git a/tools/perf/soundwave b/tools/perf/soundwave
deleted file mode 100755
index 3d763f7a..0000000
--- a/tools/perf/soundwave
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env vpython3
-# Copyright 2018 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 sys
-
-from core import path_util
-path_util.AddPyUtilsToPath()
-
-from core import cli_utils
-from core import external_modules
-from core.services import luci_auth
-from cli_tools.soundwave import commands
-from cli_tools.soundwave import studies
-
-
-DEFAULT_DATABASE_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '_cached_data', 'soundwave', 'soundwave.db'))
-
-
-def main():
-  print('*** WARNING: soundwave is deprecated and will be removed soon.\n' +
-        '*** Please see go/chromeperf-bigquery for a replacement.\n')
-
-  parser = argparse.ArgumentParser()
-  # Default args for all actions.
-  parser.add_argument(
-      '-s', '--sheriff', default='Chromium Perf Sheriff',
-      help='Only get data for this sheriff rotation, default: "%(default)s". '
-           'You can use the special value "all" to disable filtering by '
-           'sheriff rotation.')
-  parser.add_argument(
-      '-d', '--days', default=30, type=int,
-      help='Number of days to collect data for (default: %(default)s)')
-  parser.add_argument(
-      '--continue', action='store_true', dest='use_cache',
-      help='Skip refreshing some data for elements already in local db.')
-  parser.add_argument(
-      '--processes', type=int, default=40,
-      help='Number of concurrent processes to use for fetching data.')
-  parser.add_argument(
-      '--database-file', default=DEFAULT_DATABASE_PATH,
-      help='File path for database where to store data.')
-  parser.add_argument(
-      '-v', '--verbose', action='count', default=0,
-      help='Increase verbosity level')
-  subparsers = parser.add_subparsers(dest='action')
-  subparsers.required = True
-  # Subparser args for fetching alerts data.
-  subparser = subparsers.add_parser('alerts')
-  subparser.add_argument(
-      '-b', '--benchmark', required=True,
-      help='Fetch alerts for this benchmark.')
-  # Subparser args for fetching timeseries data.
-  subparser = subparsers.add_parser('timeseries')
-  group = subparser.add_mutually_exclusive_group(required=True)
-  group.add_argument(
-      '-b', '--benchmark', help='Fetch timeseries for this benchmark.')
-  group.add_argument(
-      '--study', choices=studies.NAMES,
-      help='Fetch timeseries needed for a specific study.')
-  group.add_argument(
-      '-i', '--input-file',
-      help='Fetch timeseries listed in this json file (see e.g.'
-           ' examples/soundwave directory).')
-  subparser.add_argument(
-      '-f', '--filters', action='append',
-      help='Only get data for timeseries whose path contains all the given '
-           'substrings.')
-  group = subparser.add_mutually_exclusive_group()
-  group.add_argument(
-      '--output-csv', metavar='PATH',
-      help='Export the timeseries data to a csv file, the PATH given may be '
-           'either a local or a cloud storage (i.e. gs://...) path.')
-  group.add_argument(
-      '--upload-csv', action='store_true',
-      help='Export the timeseries data to the default cloud storage path for '
-           'a given --study.')
-
-  args = parser.parse_args()
-
-  cli_utils.ConfigureLogging(args.verbose)
-  luci_auth.CheckLoggedIn()
-  if args.action == 'alerts':
-    commands.FetchAlertsData(args)
-  elif args.action == 'timeseries':
-    if args.study is not None:
-      args.study = studies.GetStudy(args.study)
-      if args.upload_csv:
-        args.output_csv = args.study.CLOUD_PATH
-    elif args.upload_csv:
-      return 'ERROR: --upload-csv also requires a --study to be specified'
-    commands.FetchTimeseriesData(args)
-  else:
-    raise NotImplementedError(args.action)
-
-
-if __name__ == '__main__':
-  external_modules.RequireModules()
-  sys.exit(main())
diff --git a/tools/protoc_wrapper/protoc_wrapper.py b/tools/protoc_wrapper/protoc_wrapper.py
index d53fd5e..ebeb5a9 100755
--- a/tools/protoc_wrapper/protoc_wrapper.py
+++ b/tools/protoc_wrapper/protoc_wrapper.py
@@ -166,7 +166,11 @@
 
   protoc_cmd += ["--proto_path", proto_dir]
   for path in options.import_dir:
-    protoc_cmd += ["--proto_path", path]
+    # TODO: crbug.com/1477926 - Do not specify unused `--import-dir`s.
+    # On a remote worker, it shows `warning: directory does not exist` when
+    # there are no dependencies under the directory.
+    if os.path.exists(path):
+      protoc_cmd += ["--proto_path", path]
 
   protoc_cmd += [os.path.join(proto_dir, name) for name in protos]
 
diff --git a/tools/rust/build_rust.py b/tools/rust/build_rust.py
index bfbc05b..6965fb29 100755
--- a/tools/rust/build_rust.py
+++ b/tools/rust/build_rust.py
@@ -84,6 +84,11 @@
     # https://github.com/rust-lang/rust/issues/96464
     os.path.join('tests', 'codegen', 'vec-shrink-panik.rs'),
 ]
+EXCLUDED_TESTS_MAC = [
+    # https://crbug.com/1479875 This fails on Mac. It relates to the large code
+    # model which we don't use, so suppress it for now.
+    os.path.join('tests', 'ui', 'thread-local', 'thread-local-issue-37508.rs'),
+]
 
 CLANG_SCRIPTS_DIR = os.path.join(CHROMIUM_DIR, 'tools', 'clang', 'scripts')
 
@@ -477,6 +482,10 @@
         for excluded in EXCLUDED_TESTS_WINDOWS:
             args.append('--exclude')
             args.append(excluded)
+    if sys.platform == 'darwin':
+        for excluded in EXCLUDED_TESTS_MAC:
+            args.append('--exclude')
+            args.append(excluded)
     return args
 
 
@@ -593,6 +602,18 @@
     return (x86_64_llvm_config, aarch64_llvm_config, target_llvm_install_dir)
 
 
+def GitCherryPick(git_repository, commit):
+    print(f'Cherry-picking {commit} in {git_repository}')
+    if RunCommand([
+            'git', '-C', git_repository, 'merge-base', '--is-ancestor', commit,
+            'HEAD'
+    ],
+                  fail_hard=False):
+        print('Commit already an ancestor; skipping.')
+        return
+    RunCommand(['git', '-C', git_repository, 'cherry-pick', commit])
+
+
 def main():
     parser = argparse.ArgumentParser(
         description='Build and package Rust toolchain')
diff --git a/tools/rust/update_rust.py b/tools/rust/update_rust.py
index 7b7044e..0e81553 100755
--- a/tools/rust/update_rust.py
+++ b/tools/rust/update_rust.py
@@ -36,8 +36,8 @@
 # In the case that a Rust roll fails and you want to roll Clang alone, reset
 # this back to its previous value _AND_ set `OVERRIDE_CLANG_REVISION` below
 # to the `CLANG_REVISION` that was in place before the roll.
-RUST_REVISION = '006a26c0b546abc0fbef59a773639582b641e500'
-RUST_SUB_REVISION = 11
+RUST_REVISION = 'c0583a0221c28f01a7bdbc01464baf22f7c6d4a8'
+RUST_SUB_REVISION = 1
 
 # If not None, this overrides the `CLANG_REVISION` in
 # //tools/clang/scripts/update.py in order to download a Rust toolchain that
@@ -58,7 +58,7 @@
 # Hash of src/stage0.json, which itself contains the stage0 toolchain hashes.
 # We trust the Rust build system checks, but to ensure it is not tampered with
 # itself check the hash.
-STAGE0_JSON_SHA256 = 'f7ff08ff3c1e51189e26a578e31dc06574ab75b855ebef5c5ec184cfc7ae4b46'
+STAGE0_JSON_SHA256 = 'b73b52f5101b92743987d8ddf1c736610310a0a3dce913b6dea4d898e28fd32c'
 
 THIS_DIR = os.path.abspath(os.path.dirname(__file__))
 CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..'))
diff --git a/tools/style_variable_generator/templates/ts_generator.tmpl b/tools/style_variable_generator/templates/ts_generator.tmpl
index f7ead84..cb4ed6f 100644
--- a/tools/style_variable_generator/templates/ts_generator.tmpl
+++ b/tools/style_variable_generator/templates/ts_generator.tmpl
@@ -162,7 +162,7 @@
 export const {{name | to_ts_var_name}} = css`var({{name | to_css_var_name}})`;
 {%-     endfor %}
 {%-   for name, typeface in typefaces.items() %}
-export const {{name | to_ts_var_name}}_FONT = css`var({{name | to_css_var_name}})`;
+export const {{name | to_ts_var_name}}_FONT = css`var({{name | to_css_var_name}}-font)`;
 export const {{name | to_ts_var_name}}_FONT_FAMILY = css`var({{name | to_css_var_name}}-font-family)`;
 export const {{name | to_ts_var_name}}_FONT_SIZE = css`var({{name | to_css_var_name}}-font-size)`;
 export const {{name | to_ts_var_name}}_FONT_WEIGHT = css`var({{name | to_css_var_name}}-font-weight)`;
diff --git a/tools/style_variable_generator/tests/goldens/colors_test_typography_and_untyped_css_expected.ts b/tools/style_variable_generator/tests/goldens/colors_test_typography_and_untyped_css_expected.ts
index 0d68fa54..f069718 100644
--- a/tools/style_variable_generator/tests/goldens/colors_test_typography_and_untyped_css_expected.ts
+++ b/tools/style_variable_generator/tests/goldens/colors_test_typography_and_untyped_css_expected.ts
@@ -220,7 +220,7 @@
 
 export const FONT_FAMILY_TEST = css`var(--cros-font-family-test)`;
 export const FONT_FAMILY_OTHER = css`var(--cros-font-family-other)`;
-export const HEADLINE_1_FONT = css`var(--cros-headline-1)`;
+export const HEADLINE_1_FONT = css`var(--cros-headline-1-font)`;
 export const HEADLINE_1_FONT_FAMILY = css`var(--cros-headline-1-font-family)`;
 export const HEADLINE_1_FONT_SIZE = css`var(--cros-headline-1-font-size)`;
 export const HEADLINE_1_FONT_WEIGHT = css`var(--cros-headline-1-font-weight)`;
diff --git a/tools/style_variable_generator/tests/goldens/colors_test_typography_expected.ts b/tools/style_variable_generator/tests/goldens/colors_test_typography_expected.ts
index 0b04539..14624a06 100644
--- a/tools/style_variable_generator/tests/goldens/colors_test_typography_expected.ts
+++ b/tools/style_variable_generator/tests/goldens/colors_test_typography_expected.ts
@@ -211,7 +211,7 @@
 
 export const FONT_FAMILY_TEST = css`var(--cros-font-family-test)`;
 export const FONT_FAMILY_OTHER = css`var(--cros-font-family-other)`;
-export const HEADLINE_1_FONT = css`var(--cros-headline-1)`;
+export const HEADLINE_1_FONT = css`var(--cros-headline-1-font)`;
 export const HEADLINE_1_FONT_FAMILY = css`var(--cros-headline-1-font-family)`;
 export const HEADLINE_1_FONT_SIZE = css`var(--cros-headline-1-font-size)`;
 export const HEADLINE_1_FONT_WEIGHT = css`var(--cros-headline-1-font-weight)`;
diff --git a/tools/traffic_annotation/safe_list.txt b/tools/traffic_annotation/safe_list.txt
index 2b4bb77..1570db3 100644
--- a/tools/traffic_annotation/safe_list.txt
+++ b/tools/traffic_annotation/safe_list.txt
@@ -24,6 +24,7 @@
 all,chrome/browser/ash/app_list/search/arc/recommend_apps_fetcher_impl.cc
 all,chrome/browser/ui/ash/projector/screencast_manager.cc
 all,chrome/services/cups_proxy/socket_manager.cc
+missing,chrome/browser/manta/orca_provider.cc
 missing,chrome/browser/manta/snapper_provider.cc
 
 # Android-specific annotations.
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index 898427e..75db1ff 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -17,7 +17,7 @@
  <item id="android_web_socket" added_in_milestone="65" content_hash_code="00bbd661" os_list="linux,windows,chromeos" file_path="chrome/browser/devtools/device/android_web_socket.cc" />
  <item id="auction_downloader" added_in_milestone="92" content_hash_code="01f53427" os_list="linux,windows,chromeos,android" file_path="content/services/auction_worklet/public/cpp/auction_downloader.cc" />
  <item id="auction_report_sender" added_in_milestone="92" content_hash_code="029b766e" os_list="linux,windows,chromeos,android" file_path="content/browser/interest_group/interest_group_manager_impl.cc" />
- <item id="autofill_image_fetcher_card_art_image" added_in_milestone="93" content_hash_code="038b8696" os_list="linux,windows,chromeos,android" file_path="components/autofill/core/browser/ui/autofill_image_fetcher.cc" />
+ <item id="autofill_image_fetcher_card_art_image" added_in_milestone="93" content_hash_code="038b8696" os_list="linux,windows,chromeos" file_path="components/autofill/core/browser/ui/autofill_image_fetcher.cc" />
  <item id="autofill_query" added_in_milestone="62" content_hash_code="006ccff5" os_list="linux,windows,chromeos,android" file_path="components/autofill/core/browser/autofill_download_manager.cc" />
  <item id="autofill_upload" added_in_milestone="62" content_hash_code="04a7eb65" os_list="linux,windows,chromeos,android" file_path="components/autofill/core/browser/autofill_download_manager.cc" />
  <item id="backdrop_collection_images_download" added_in_milestone="68" content_hash_code="009770fb" os_list="linux,windows,chromeos" file_path="chrome/browser/search/background/ntp_background_service.cc" />
@@ -41,7 +41,6 @@
  <item id="chrome_apps_socket_api" added_in_milestone="65" content_hash_code="07ca7795" os_list="linux,windows,chromeos" file_path="extensions/browser/api/socket/socket.cc" />
  <item id="chrome_cart_discounts_lookup" added_in_milestone="92" content_hash_code="05b3e421" os_list="linux,windows,chromeos" file_path="chrome/browser/cart/cart_discount_fetcher.cc" />
  <item id="chrome_cart_get_discounted_link" added_in_milestone="92" content_hash_code="052260e0" os_list="linux,windows,chromeos" file_path="chrome/browser/cart/cart_discount_link_fetcher.cc" />
- <item id="chrome_cleaner" added_in_milestone="63" content_hash_code="06a16464" os_list="windows" file_path="chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_fetcher_win.cc" />
  <item id="chrome_feedback_report_app" added_in_milestone="62" content_hash_code="050db812" os_list="linux,windows,chromeos,android" file_path="components/feedback/feedback_uploader.cc" />
  <item id="chrome_variations_service" added_in_milestone="62" content_hash_code="00f59481" os_list="linux,windows,chromeos,android" file_path="components/variations/service/variations_service.cc" />
  <item id="client_download_request" added_in_milestone="62" content_hash_code="01da15dc" os_list="linux,windows,chromeos" file_path="chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc" />
@@ -87,10 +86,8 @@
  <item id="ftl_registration_manager" added_in_milestone="86" content_hash_code="00bff9a1" os_list="linux,windows,chromeos,android" file_path="remoting/signaling/ftl_registration_manager.cc" />
  <item id="gaia_auth_check_connection_info" added_in_milestone="62" content_hash_code="036b0bb8" os_list="linux,windows,chromeos,android" file_path="google_apis/gaia/gaia_auth_fetcher.cc" />
  <item id="gaia_auth_exchange_device_id" added_in_milestone="62" content_hash_code="02eb801a" os_list="linux,windows,chromeos,android" file_path="google_apis/gaia/gaia_auth_fetcher.cc" />
- <item id="gaia_auth_fetch_for_uber" added_in_milestone="62" content_hash_code="01ab5779" os_list="linux,windows,chromeos,android" file_path="google_apis/gaia/gaia_auth_fetcher.cc" />
  <item id="gaia_auth_list_accounts" added_in_milestone="62" content_hash_code="0595471e" os_list="linux,windows,chromeos,android" file_path="google_apis/gaia/gaia_auth_fetcher.cc" />
  <item id="gaia_auth_log_out" added_in_milestone="62" content_hash_code="056ee739" os_list="linux,windows,chromeos,android" file_path="google_apis/gaia/gaia_auth_fetcher.cc" />
- <item id="gaia_auth_merge_sessions" added_in_milestone="62" content_hash_code="01d03b23" os_list="linux,windows,chromeos,android" file_path="google_apis/gaia/gaia_auth_fetcher.cc" />
  <item id="gaia_auth_multilogin" added_in_milestone="70" content_hash_code="04a2142a" os_list="linux,windows,chromeos,android" file_path="google_apis/gaia/gaia_auth_fetcher.cc" />
  <item id="gaia_auth_revoke_token" added_in_milestone="62" content_hash_code="05c2fef2" os_list="linux,windows,chromeos,android" file_path="google_apis/gaia/gaia_auth_fetcher.cc" />
  <item id="gaia_cookie_manager_external_cc_result" added_in_milestone="62" content_hash_code="01dbe597" os_list="linux,windows,chromeos,android" file_path="components/signin/internal/identity_manager/gaia_cookie_manager_service.cc" />
@@ -119,7 +116,7 @@
  <item id="interest_feedv2_send" added_in_milestone="83" content_hash_code="02f676af" os_list="linux,windows,chromeos,android" file_path="components/feed/core/v2/feed_network_impl.cc" />
  <item id="interest_group_update_fetcher" added_in_milestone="94" content_hash_code="06322759" os_list="linux,windows,android,chromeos" file_path="content/browser/interest_group/interest_group_update_manager.cc" />
  <item id="intranet_redirect_detector" added_in_milestone="62" content_hash_code="03b26f7b" os_list="linux,windows,chromeos" file_path="chrome/browser/intranet_redirect_detector.cc" />
- <item id="javascript_report_error" added_in_milestone="87" content_hash_code="006e4e54" os_list="linux" file_path="chrome/browser/error_reporting/chrome_js_error_report_processor_nonchromeos.cc" />
+ <item id="javascript_report_error" added_in_milestone="87" content_hash_code="03abb4b9" os_list="linux" file_path="chrome/browser/error_reporting/chrome_js_error_report_processor_nonchromeos.cc" />
  <item id="lib_address_input" added_in_milestone="62" content_hash_code="0374aae8" os_list="linux,windows,chromeos,android" file_path="third_party/libaddressinput/chromium/chrome_metadata_source.cc" />
  <item id="load_autofill_gstatic_data" added_in_milestone="78" content_hash_code="07a1e952" os_list="linux,windows,chromeos,android" file_path="chrome/browser/autofill/autofill_gstatic_reader.cc" />
  <item id="logo_service" added_in_milestone="73" content_hash_code="013550c3" os_list="linux,windows,chromeos,android" file_path="components/search_provider_logos/logo_service_impl.cc" />
@@ -194,7 +191,7 @@
  <item id="renderer_initiated_download" added_in_milestone="62" content_hash_code="02417da4" os_list="linux,windows,chromeos,android" file_path="content/browser/renderer_host/render_frame_host_impl.cc" />
  <item id="reporting" added_in_milestone="62" content_hash_code="077eedd0" os_list="linux,windows,chromeos,android" file_path="net/reporting/reporting_uploader.cc" />
  <item id="rlz_ping" added_in_milestone="63" content_hash_code="06160e82" os_list="windows,chromeos" file_path="rlz/lib/financial_ping.cc" />
- <item id="safe_browsing_binary_upload_app" added_in_milestone="87" content_hash_code="025c4969" os_list="linux,windows,chromeos" file_path="chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc" />
+ <item id="safe_browsing_binary_upload_app" added_in_milestone="87" content_hash_code="04d2c017" os_list="linux,windows,chromeos" file_path="chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc" />
  <item id="safe_browsing_binary_upload_connector" added_in_milestone="87" content_hash_code="025fdb96" os_list="linux,windows,chromeos" file_path="chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc" />
  <item id="safe_browsing_cache_collector" added_in_milestone="62" content_hash_code="02320d08" os_list="linux,windows,chromeos,android" file_path="components/safe_browsing/content/browser/threat_details_cache.cc" />
  <item id="safe_browsing_certificate_error_reporting" added_in_milestone="62" content_hash_code="018e6226" os_list="linux,windows,chromeos,android" file_path="chrome/browser/ssl/certificate_error_reporter.cc" />
@@ -354,8 +351,8 @@
  <item id="k_anonymity_service_get_token" added_in_milestone="106" content_hash_code="02bc56b0" os_list="linux,windows,android,chromeos" file_path="chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc" />
  <item id="enhanced_network_tts" added_in_milestone="103" content_hash_code="03c12345" os_list="chromeos" file_path="chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_impl.cc" />
  <item id="shopping_list_ui_image_fetcher" added_in_milestone="107" content_hash_code="0680ae03" os_list="windows,chromeos,linux" file_path="chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc" />
- <item id="chrome_commerce_price_email_pref_fetcher" added_in_milestone="107" content_hash_code="00b3dc73" os_list="linux,windows,android,chromeos" file_path="components/commerce/core/account_checker.cc" />
- <item id="chrome_commerce_price_email_pref_sender" added_in_milestone="107" content_hash_code="03f51c85" os_list="linux,windows,android,chromeos" file_path="components/commerce/core/account_checker.cc" />
+ <item id="chrome_commerce_price_email_pref_fetcher" added_in_milestone="107" content_hash_code="03bbefb2" os_list="linux,windows,android,chromeos" file_path="components/commerce/core/account_checker.cc" />
+ <item id="chrome_commerce_price_email_pref_sender" added_in_milestone="107" content_hash_code="02ff3431" os_list="linux,windows,android,chromeos" file_path="components/commerce/core/account_checker.cc" />
  <item id="receive_messages_express" added_in_milestone="108" content_hash_code="032122e0" os_list="chromeos" file_path="chrome/browser/nearby_sharing/instantmessaging/receive_messages_express.cc" />
  <item id="send_message_express" added_in_milestone="108" content_hash_code="01b40a32" os_list="chromeos" file_path="chrome/browser/nearby_sharing/instantmessaging/send_message_express.cc" />
  <item id="cryptohome_recovery_fetch_epoch" added_in_milestone="108" content_hash_code="06e195ad" os_list="chromeos" file_path="chromeos/ash/components/login/auth/recovery/cryptohome_recovery_service_client.cc" />
@@ -414,7 +411,7 @@
  <item id="promise_app_service" added_in_milestone="114" content_hash_code="07856112" os_list="chromeos" file_path="chrome/browser/apps/app_service/promise_apps/promise_app_almanac_connector.cc" />
  <item id="safe_browsing_hashprefix_realtime_lookup_direct" added_in_milestone="114" content_hash_code="0764e462" os_list="linux,windows,chromeos,android" file_path="components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service.cc" />
  <item id="safe_browsing_hashprefix_realtime_lookup_ohttp" added_in_milestone="114" content_hash_code="0817ae7d" os_list="linux,windows,chromeos,android" file_path="components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service.cc" />
- <item id="gaia_auth_rotate_bound_cookies" added_in_milestone="115" content_hash_code="064e7f51" os_list="linux" file_path="chrome/browser/signin/bound_session_credentials/bound_session_refresh_cookie_fetcher_impl.cc" />
+ <item id="gaia_auth_rotate_bound_cookies" added_in_milestone="115" content_hash_code="064e7f51" os_list="linux,windows" file_path="chrome/browser/signin/bound_session_credentials/bound_session_refresh_cookie_fetcher_impl.cc" />
  <item id="unified_state_determination_kill_switch" added_in_milestone="115" content_hash_code="01f51d8e" os_list="chromeos" file_path="chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker.cc" />
  <item id="crash_file_uploader" added_in_milestone="115" content_hash_code="05f6902f" os_list="linux" file_path="remoting/host/crash/crash_file_uploader.cc" />
  <item id="glanceables_classroom_integration" added_in_milestone="115" content_hash_code="04025a83" os_list="chromeos" file_path="chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.cc" />
@@ -422,15 +419,22 @@
  <item id="iwa_update_manifest_fetcher" added_in_milestone="116" type="completing" content_hash_code="06867096" os_list="chromeos" semantics_fields="4,5,7,8,9" policy_fields="-1" file_path="chrome/browser/web_applications/isolated_web_apps/update_manifest/update_manifest_fetcher.cc" />
  <item id="iwa_bundle_downloader" added_in_milestone="116" type="completing" content_hash_code="04d2beae" os_list="chromeos" semantics_fields="4,5,7,8,9" policy_fields="-1" file_path="chrome/browser/web_applications/isolated_web_apps/isolated_web_app_downloader.cc" />
  <item id="bidding_and_auction_server_key_fetch" added_in_milestone="116" content_hash_code="07667a22" os_list="linux,windows,android,chromeos" file_path="content/browser/interest_group/bidding_and_auction_server_key_fetcher.cc" />
- <item id="ip_protection_service_get_token" added_in_milestone="116" content_hash_code="03968a1c" os_list="linux,windows,android,chromeos" file_path="chrome/browser/ip_protection/blind_sign_http_impl.cc" />
+ <item id="ip_protection_service_get_token" added_in_milestone="116" content_hash_code="03744fd1" os_list="windows,android,chromeos,linux" file_path="chrome/browser/ip_protection/ip_protection_config_http.cc" />
  <item id="supervised_user_request_blocked_site_permission" added_in_milestone="116" content_hash_code="04f49427" os_list="linux,windows,android,chromeos" file_path="components/supervised_user/core/browser/fetcher_config.cc" />
  <item id="password_sharing_recipients" added_in_milestone="116" content_hash_code="00de3c6a" os_list="linux,windows,android,chromeos" file_path="components/password_manager/core/browser/sharing/password_sharing_recipients_downloader.cc" />
  <item id="page_insights" added_in_milestone="116" type="partial" second_id="web_history_service" content_hash_code="05f02912" os_list="android" semantics_fields="1,2,3,4,5,7,8,9" policy_fields="-1,3,4" file_path="chrome/browser/ui/android/page_insights/page_insights_swaa_checker.cc" />
  <item id="ntp_image_url_verification" added_in_milestone="116" content_hash_code="00ed230b" os_list="linux,windows,chromeos" file_path="chrome/browser/search/background/ntp_background_service.cc" />
- <item id="device_bound_session_register" added_in_milestone="116" content_hash_code="0682bd33" os_list="linux" file_path="chrome/browser/signin/bound_session_credentials/bound_session_registration_fetcher_impl.cc" />
+ <item id="device_bound_session_register" added_in_milestone="116" content_hash_code="0682bd33" os_list="linux,windows" file_path="chrome/browser/signin/bound_session_credentials/bound_session_registration_fetcher_impl.cc" />
  <item id="passkey_enclave_client" added_in_milestone="117" content_hash_code="06c3fa70" os_list="linux,windows" file_path="device/fido/enclave/enclave_http_client.cc" />
  <item id="iwa_update_discovery_update_manifest" added_in_milestone="117" type="partial" second_id="iwa_update_manifest_fetcher" content_hash_code="021e8cdf" os_list="chromeos" semantics_fields="1,2,3,7,8,9" policy_fields="3,4" file_path="chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_discovery_task.cc" />
  <item id="iwa_update_discovery_web_bundle" added_in_milestone="117" type="partial" second_id="iwa_bundle_downloader" content_hash_code="044a85c3" os_list="chromeos" semantics_fields="1,2,3,7,8,9" policy_fields="3,4" file_path="chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_discovery_task.cc" />
  <item id="interest_feedv2_resource_send" added_in_milestone="118" content_hash_code="04189a4f" os_list="linux,windows,android,chromeos" file_path="components/feed/core/v2/resource_fetcher.cc" />
  <item id="almanac_launcher_app" added_in_milestone="118" content_hash_code="0556e032" os_list="chromeos" file_path="chrome/browser/apps/app_discovery_service/launcher_app_almanac_connector.cc" />
+ <item id="ip_protection_service_get_proxy_config" added_in_milestone="118" content_hash_code="025110db" os_list="windows,android,linux,chromeos" file_path="chrome/browser/ip_protection/ip_protection_config_http.cc" />
+ <item id="chrome_commerce_parcels_status" added_in_milestone="119" content_hash_code="0740f7f7" os_list="linux,windows,android,chromeos" file_path="components/commerce/core/parcel/parcels_server_proxy.cc" />
+ <item id="plus_address_creation" added_in_milestone="119" content_hash_code="05266362" os_list="linux,windows,android,chromeos" file_path="components/plus_addresses/plus_address_client.cc" />
+ <item id="chrome_commerce_start_tracking_parcel" added_in_milestone="119" content_hash_code="023a4c27" os_list="linux,windows,android,chromeos" file_path="components/commerce/core/parcel/parcels_server_proxy.cc" />
+ <item id="chrome_commerce_stop_tracking_parcel" added_in_milestone="119" content_hash_code="0510af3a" os_list="linux,windows,android,chromeos" file_path="components/commerce/core/parcel/parcels_server_proxy.cc" />
+ <item id="chrome_commerce_stop_tracking_all_parcel" added_in_milestone="119" content_hash_code="0714c6f8" os_list="linux,windows,android,chromeos" file_path="components/commerce/core/parcel/parcels_server_proxy.cc" />
+ <item id="get_all_plus_addresses" added_in_milestone="119" content_hash_code="057af967" os_list="linux,windows,android,chromeos" file_path="components/plus_addresses/plus_address_client.cc" />
 </annotations>
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml
index e3ca874..392fe8d7 100644
--- a/tools/traffic_annotation/summary/grouping.xml
+++ b/tools/traffic_annotation/summary/grouping.xml
@@ -225,9 +225,6 @@
       <annotation id="download_bubble_retry_download"/>
       <annotation id="quick_answers_loader"/>
       <annotation id="chrome_search_suggest_service"/>
-      <annotation id="chrome_commerce_subscriptions_create"/>
-      <annotation id="chrome_commerce_subscriptions_delete"/>
-      <annotation id="chrome_commerce_subscriptions_get"/>
       <annotation id="cryptauth_get_my_devices"/>
       <annotation id="chrome_commerce_waa_fetcher"/>
       <annotation id="shopping_list_ui_image_fetcher"/>
@@ -295,6 +292,9 @@
       <annotation id="iwa_update_discovery_update_manifest"/>
       <annotation id="iwa_update_discovery_web_bundle"/>
       <annotation id="almanac_launcher_app"/>
+      <annotation id="ip_protection_service_get_proxy_config"/>
+      <annotation id="plus_address_creation"/>
+      <annotation id="get_all_plus_addresses"/>
     </sender>
   </group>
   <group name="Admin Features" hidden="true">
@@ -311,9 +311,7 @@
     </sender>
   </group>
   <group name="Apps and Content" hidden="true">
-    <sender name="Chrome Cleanup">
-      <annotation id="chrome_cleaner"/>
-    </sender>
+    <sender name="Chrome Cleanup"/>
     <sender name="Extension and App Management">
       <annotation id="chrome_apps_socket_api"/>
       <annotation id="extension_blacklist"/>
@@ -363,6 +361,19 @@
       <annotation id="tailored_security_service"/>
     </sender>
   </group>
+  <group name="Chrome Commerce" hidden="true">
+    <sender name="Parcel Tracking">
+      <annotation id="chrome_commerce_parcels_status"/>
+      <annotation id="chrome_commerce_start_tracking_parcel"/>
+      <annotation id="chrome_commerce_stop_tracking_parcel"/>
+      <annotation id="chrome_commerce_stop_tracking_all_parcel"/>
+    </sender>
+    <sender name="Subscription">
+      <annotation id="chrome_commerce_subscriptions_create"/>
+      <annotation id="chrome_commerce_subscriptions_delete"/>
+      <annotation id="chrome_commerce_subscriptions_get"/>
+    </sender>
+  </group>
   <group name="Cookieless Ads" hidden="true">
     <sender name="Conversion Measurements">
       <annotation id="conversion_measurement_report"/>
@@ -392,10 +403,8 @@
       <annotation id="fedcm_account_profile_image_fetcher"/>
       <annotation id="gaia_auth_check_connection_info"/>
       <annotation id="gaia_auth_exchange_device_id"/>
-      <annotation id="gaia_auth_fetch_for_uber"/>
       <annotation id="gaia_auth_list_accounts"/>
       <annotation id="gaia_auth_log_out"/>
-      <annotation id="gaia_auth_merge_sessions"/>
       <annotation id="gaia_auth_revoke_token"/>
       <annotation id="gaia_auth_rotate_bound_cookies"/>
       <annotation id="gaia_auth_multilogin"/>
diff --git a/tools/typescript/definitions/autofill_private.d.ts b/tools/typescript/definitions/autofill_private.d.ts
index 3eb0cc410..9138a042 100644
--- a/tools/typescript/definitions/autofill_private.d.ts
+++ b/tools/typescript/definitions/autofill_private.d.ts
@@ -88,9 +88,6 @@
         NAME_LAST_CONJUNCTION,
         NAME_LAST_SECOND,
         NAME_HONORIFIC_PREFIX,
-        ADDRESS_HOME_PREMISE_NAME,
-        ADDRESS_HOME_DEPENDENT_STREET_NAME,
-        ADDRESS_HOME_STREET_AND_DEPENDENT_STREET_NAME,
         ADDRESS_HOME_ADDRESS,
         ADDRESS_HOME_ADDRESS_WITH_NAME,
         ADDRESS_HOME_FLOOR,
diff --git a/tools/typescript/definitions/developer_private.d.ts b/tools/typescript/definitions/developer_private.d.ts
index 5e67292..863b1ea 100644
--- a/tools/typescript/definitions/developer_private.d.ts
+++ b/tools/typescript/definitions/developer_private.d.ts
@@ -254,6 +254,7 @@
         showSafeBrowsingAllowlistWarning: boolean;
         showAccessRequestsInToolbar: boolean;
         acknowledgeSafetyCheckWarning: boolean;
+        pinnedToToolbar?: boolean;
       }
 
       export interface ProfileInfo {
@@ -272,6 +273,7 @@
         hostAccess?: HostAccess;
         showAccessRequestsInToolbar?: boolean;
         acknowledgeSafetyCheckWarning?: boolean;
+        pinnedToToolbar?: boolean;
       }
 
       export interface ProfileConfigurationUpdate {
@@ -330,6 +332,7 @@
         SERVICE_WORKER_STARTED = 'SERVICE_WORKER_STARTED',
         SERVICE_WORKER_STOPPED = 'SERVICE_WORKER_STOPPED',
         CONFIGURATION_CHANGED = 'CONFIGURATION_CHANGED',
+        PINNED_ACTIONS_CHANGED = 'PINNED_ACTIONS_CHANGED',
       }
 
       export enum SiteSet {
diff --git a/tools/typescript/validate_tsconfig.py b/tools/typescript/validate_tsconfig.py
index ac04871..85e0e5a8 100644
--- a/tools/typescript/validate_tsconfig.py
+++ b/tools/typescript/validate_tsconfig.py
@@ -111,6 +111,8 @@
       'ash/webui/diagnostics_ui/',
       'ash/webui/face_ml_app_ui/',
       'ash/webui/file_manager/resources/labs/',
+      # TODO(b/299520240): Migrate scanning to TypeScript and remove exception.
+      'ash/webui/scanning/',
       'ash/webui/shortcut_customization_ui/',
       'ash/webui/sample_system_web_app_ui/',
       'ui/file_manager/',
@@ -125,10 +127,10 @@
       # remove exception.
       'chrome/browser/resources/bluetooth_internals',
       'chrome/browser/resources/chromeos/accessibility',
-      'chrome/browser/resources/ntp4',
       'chrome/test/data/webui',
       'chrome/test/data/webui/chromeos',
       'chrome/test/data/webui/cr_components/chromeos',
+      'chrome/test/data/webui/nearby_share',
       'chrome/test/data/webui/settings/chromeos',
       # TODO(https://crbug.com/1002798): Migrate Mojo bindings to TypeScript and
       # remove exception.
@@ -136,6 +138,10 @@
       'components/policy/resources/webui',
       'ui/webui/resources/js',
       'ui/webui/resources/mojo',
+
+      # TODO(crbug.com/1478961) : Migrate to TypeScript.
+      'chrome/test/data/webui/media_internals',
+      'content/browser/resources/media',
   ]
   for directory in migrating_directories:
     if (source_dir.endswith(directory)