diff --git a/DEPS b/DEPS
index 2217879..6c944fd 100644
--- a/DEPS
+++ b/DEPS
@@ -245,15 +245,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '98d664096d4035fc8936788b100167de68cab8fd',
+  'skia_revision': '35e34d8db246398830566d83ea4140efec214dac',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '2d9015d3fccc08c1cd448d21ebbcef10bd91f239',
+  'v8_revision': '4c66f05b3ee29bdc65cbd3e4e60209af8b1d0fbc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '693b48a077b8158375e16dd0dc5a194ddf7bb7d1',
+  'angle_revision': 'd6fb76a68b6e1e90fc9f87c69997f8abb32e72fa',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -360,7 +360,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '0cb5c0edeb808525487e4dbba6003e110171dd29',
+  'dawn_revision': '7d37677a031adb4578b5df1d1cc7eefda6140647',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -768,7 +768,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'Vdvls5CUFjFJJ9RIhmiEPyCCGllMIFjKSd_Dq-iPIF8C',
+          'version': 'e7DhxyFjXyNAU9I9YpHHj8rvAIPPoKQX4OPLna6aepEC',
         },
       ],
       'dep_type': 'cipd',
@@ -779,7 +779,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'H7G30oLdFUX179nmm_MjwG3MsJbqjXSTgAcFmY1hDHEC',
+          'version': 'dXXn-xiY_r8w06KhMCRC-G6jEXqoXCOoQTVekmpvktcC',
         },
       ],
       'dep_type': 'cipd',
@@ -790,7 +790,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'UAtJcGvAQlwiebAuubcSLXxgKNxba-wv0e3s18hcPkYC',
+          'version': '-G2ZT1ZDQNgr6v9Pa8l1aitRv0pF7UyF9f9ebCgM74sC',
         },
       ],
       'dep_type': 'cipd',
@@ -1070,7 +1070,7 @@
   # Tools used when building Chrome for Chrome OS. This affects both the Simple
   # Chrome workflow, as well as the chromeos-chrome ebuild.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'f0d96456666b72c49a4827a5315ffdc21d96d90c',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '4feb237ba806ed22f4ef5005f6239e9cda81af91',
       'condition': 'checkout_chromeos',
   },
 
@@ -1473,7 +1473,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '00b152a26effb7ba2ec1f2d1fdace9116ea470e4',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '9839aeef62f039aa5f9a1c310b6f6000405a75e7',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1551,7 +1551,7 @@
       'packages': [
           {
               'package': 'fuchsia/third_party/android/aemu/release/linux-amd64',
-              'version': 'yIMUaCNVYPAFt-BZcSfLNL1mge8HK-ZfTF2vI73JNhUC'
+              'version': 'HiJFcVfsBoDHop93JYsTF-6MLX5YMqQgll1W2d4X1qAC'
           },
       ],
       'condition': 'host_os == "linux" and checkout_fuchsia',
@@ -1694,7 +1694,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '89f20c5e69574ffbede2d89e18b4dba71bf9c1f2',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'fe968dff86b2f2f976719f6cda76d99eb6b20cc0',
+    Var('webrtc_git') + '/src.git' + '@' + 'e39a16fa7c54ad7a4b57e061bdcdf971d95beeed',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1764,7 +1764,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@af3972fda9af5d5c0d90ad2eeec681fb96d94949',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@a35039134b0af54e43a4ecb5309823754cd5d744',
     'condition': 'checkout_src_internal',
   },
 
@@ -1794,7 +1794,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'g7q_uwTN8BqJVJvD6qEdTnK61QGpAYsB5oWQTQlqrXgC',
+        'version': 'gJW6tIL9SW_1-nn_sr42UO3pIMD6OnMu5IENV6awhBAC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1805,7 +1805,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': '8quErftXrS2mkjFDsOspAn06yTIupAAMuiIGkpR4SEAC',
+        'version': 'PnyQe46huXU2OEzmVFbJrgcEf1GeKdPAZhhcyDBQ3_AC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/tools/system_webview_shell/layout_tests/src/org/chromium/webview_shell/test/WebViewLayoutTest.java b/android_webview/tools/system_webview_shell/layout_tests/src/org/chromium/webview_shell/test/WebViewLayoutTest.java
index 5673fc2..d99a123 100644
--- a/android_webview/tools/system_webview_shell/layout_tests/src/org/chromium/webview_shell/test/WebViewLayoutTest.java
+++ b/android_webview/tools/system_webview_shell/layout_tests/src/org/chromium/webview_shell/test/WebViewLayoutTest.java
@@ -146,6 +146,7 @@
         }
     }
 
+    @DisabledTest(message = "https://crbug.com/1293089")
     @Test
     @MediumTest
     public void testWebViewExcludedInterfaces() throws Exception {
diff --git a/ash/app_list/views/app_list_view_unittest.cc b/ash/app_list/views/app_list_view_unittest.cc
index d6d6e802..8308b09 100644
--- a/ash/app_list/views/app_list_view_unittest.cc
+++ b/ash/app_list/views/app_list_view_unittest.cc
@@ -108,10 +108,39 @@
 // The maximum allowed margin between items in apps item grid.
 constexpr int kMaxItemMargin = 96;
 
+// The min margins for contents within the fullscreen productivity launcher.
+constexpr int kMinProductivityLauncherMargin = 24;
+
+// The min horizontal margin for apps grid in fullscreen productivity launcher.
+// In addition to min productivity launcher margin, reserves 32 dip for page
+// switcher UI.
+constexpr int kMinProductivityLauncherGridHorizontalMargin =
+    kMinProductivityLauncherMargin + 32;
+
+int GetExpectedProductivityLauncherAppsContainerHeight(int row_count,
+                                                       int tile_height,
+                                                       int tile_margins) {
+  return row_count * tile_height + (row_count - 1) * tile_margins +
+         2 * kMinProductivityLauncherMargin + kGridVerticalMargin +
+         kGridVerticalInset + 48 /*search box height*/ + 56 /*shelf size*/;
+}
+
 SearchModel* GetSearchModel() {
   return AppListModelProvider::Get()->search_model();
 }
 
+void AddRecentApps(int num_apps) {
+  for (int i = 0; i < num_apps; i++) {
+    auto result = std::make_unique<TestSearchResult>();
+    // Use the same "Item #" convention as AppListTestModel uses. The search
+    // result IDs must match app item IDs in the app list data model.
+    result->set_result_id(test::AppListTestModel::GetItemName(i));
+    result->set_result_type(AppListSearchResultType::kInstalledApp);
+    result->set_display_type(SearchResultDisplayType::kRecentApps);
+    GetSearchModel()->results()->Add(std::move(result));
+  }
+}
+
 int GridItemSizeWithMargins(int grid_size, int item_size, int item_count) {
   int margin = (grid_size - item_size * item_count) / (2 * (item_count - 1));
   return item_size + 2 * margin;
@@ -312,6 +341,10 @@
     return contents_view()->apps_container_view()->page_switcher();
   }
 
+  RecentAppsView* recent_apps() {
+    return contents_view()->apps_container_view()->GetRecentApps();
+  }
+
   views::View* assistant_page_view() {
     const int assistant_page_index = contents_view()->GetPageIndexForState(
         ash::AppListState::kStateEmbeddedAssistant);
@@ -332,6 +365,131 @@
     return delegate_->show_wallpaper_context_menu_count();
   }
 
+  void VerifyAppsContainerLayoutForProductivityLauncher(
+      const gfx::Size& container_size,
+      int row_count,
+      int expected_horizontal_margin,
+      const gfx::Size& expected_item_size,
+      bool has_recent_apps) {
+    const int column_count = 5;
+    ASSERT_EQ(column_count, apps_grid_view()->cols());
+    ASSERT_EQ(row_count, apps_grid_view()->GetFirstPageRowsForTesting());
+
+    const int expected_vertical_margin = kMinProductivityLauncherMargin;
+
+    const int expected_grid_width =
+        container_size.width() - 2 * expected_horizontal_margin;
+
+    // Verify scrollable container bounds.
+    const int expected_scrollable_container_top = expected_vertical_margin +
+                                                  48 /*search box height*/ +
+                                                  kGridVerticalMargin;
+    const int expected_scrollable_container_height =
+        container_size.height() - expected_scrollable_container_top -
+        expected_vertical_margin - ShelfSize();
+    EXPECT_EQ(
+        gfx::Rect(expected_horizontal_margin, expected_scrollable_container_top,
+                  expected_grid_width, expected_scrollable_container_height),
+        scrollable_container()->bounds());
+
+    // Verify apps grid bounds.
+    gfx::Point grid_origin_in_scrollable_container;
+    views::View::ConvertPointToTarget(apps_grid_view(), scrollable_container(),
+                                      &grid_origin_in_scrollable_container);
+    EXPECT_EQ(gfx::Point(0, kGridVerticalInset),
+              grid_origin_in_scrollable_container);
+
+    const int expected_grid_height =
+        expected_scrollable_container_height - kGridVerticalInset;
+    EXPECT_EQ(gfx::Size(expected_grid_width, expected_grid_height),
+              apps_grid_view()->size());
+
+    // Verify page switcher bounds.
+    EXPECT_EQ(gfx::Rect(expected_grid_width + expected_horizontal_margin +
+                            kPageSwitcherSpacing,
+                        expected_scrollable_container_top,
+                        2 * PageSwitcher::kMaxButtonRadiusForRootGrid,
+                        expected_grid_height),
+              page_switcher_view()->bounds());
+
+    // Verify recent apps view visibility and bounds (when visible).
+    EXPECT_EQ(has_recent_apps, recent_apps()->GetVisible());
+    if (has_recent_apps) {
+      gfx::Point origin_in_scrollable_container;
+      views::View::ConvertPointToTarget(recent_apps(), scrollable_container(),
+                                        &origin_in_scrollable_container);
+      EXPECT_EQ(gfx::Point(0, kGridVerticalInset),
+                origin_in_scrollable_container);
+      EXPECT_EQ(expected_grid_width, recent_apps()->width());
+      EXPECT_EQ(expected_item_size.height(), recent_apps()->height());
+    }
+
+    // Horizontal offset between app list item views, which includes tile width
+    // and horizontal margin.
+    const int horizontal_item_offset = GridItemSizeWithMargins(
+        expected_grid_width, expected_item_size.width(), column_count);
+    EXPECT_LE(horizontal_item_offset - expected_item_size.width(), 128);
+
+    // Calculate space reserved for separator, which is only shown if suggested
+    // content (e.g. recent apps) exists.
+    int separator_size = 0;
+    if (has_recent_apps) {
+      const int separator_margin = expected_item_size.height() > 88 ? 16 : 8;
+      separator_size = 2 * separator_margin + 1 /*actual separator height*/;
+    }
+
+    // Vertical offset between app list item views, which includes tile height
+    // and vertical margin.
+    const int vertical_item_offset = GridItemSizeWithMargins(
+        expected_grid_height - separator_size, expected_item_size.height(),
+        row_count + (has_recent_apps ? 1 : 0));
+    EXPECT_GE(vertical_item_offset - expected_item_size.height(), 8);
+    EXPECT_LE(vertical_item_offset - expected_item_size.height(), 96);
+
+    // If recent apps are shown, the items on the first page are offset by the
+    // recent apps container height, a separator and vertical margin between
+    // tiles.
+    const int base_vertical_offset =
+        has_recent_apps ? vertical_item_offset + separator_size : 0;
+
+    // Verify expected bounds for the first row:
+    for (int i = 0; i < column_count; ++i) {
+      EXPECT_EQ(gfx::Rect(gfx::Point(i * horizontal_item_offset,
+                                     base_vertical_offset),
+                          expected_item_size),
+                test_api_->GetItemTileRectAtVisualIndex(0, i))
+          << "Item " << i << " bounds";
+    }
+
+    // Verify expected bounds for the first column:
+    for (int j = 1; j < row_count; ++j) {
+      EXPECT_EQ(gfx::Rect(gfx::Point(0, base_vertical_offset +
+                                            j * vertical_item_offset),
+                          expected_item_size),
+                test_api_->GetItemTileRectAtVisualIndex(0, j * column_count))
+          << "Item " << j * column_count << " bounds";
+    }
+
+    // The last item in the page (bottom right):
+    EXPECT_EQ(gfx::Rect(gfx::Point((column_count - 1) * horizontal_item_offset,
+                                   base_vertical_offset +
+                                       (row_count - 1) * vertical_item_offset),
+                        expected_item_size),
+              test_api_->GetItemTileRectAtVisualIndex(
+                  0, row_count * column_count - 1));
+
+    // Verify that search box top is at the expected apps container vertical
+    // margin, both in apps, and search results state.
+    std::vector<ash::AppListState> available_app_list_states = {
+        ash::AppListState::kStateApps, ash::AppListState::kStateSearchResults};
+    for (auto app_list_state : available_app_list_states) {
+      const gfx::Rect search_box_bounds =
+          contents_view()->GetSearchBoxBounds(app_list_state);
+      EXPECT_EQ(expected_vertical_margin, search_box_bounds.y())
+          << "App list state: " << static_cast<int>(app_list_state);
+    }
+  }
+
   // Verifies fullscreen apps container bounds and layout.
   void VerifyAppsContainerLayout(const gfx::Size& container_size,
                                  int column_count,
@@ -456,9 +614,17 @@
 // Tests app list view layout for different screen sizes.
 class AppListViewScalableLayoutTest : public AppListViewTest {
  public:
-  AppListViewScalableLayoutTest() {
-    scoped_feature_list_.InitAndEnableFeature(
-        ash::features::kEnableBackgroundBlur);
+  explicit AppListViewScalableLayoutTest(bool enable_productivity_launcher) {
+    if (enable_productivity_launcher) {
+      scoped_feature_list_.InitWithFeatures(
+          {ash::features::kEnableBackgroundBlur,
+           ash::features::kProductivityLauncher},
+          {});
+    } else {
+      scoped_feature_list_.InitWithFeatures(
+          {ash::features::kEnableBackgroundBlur},
+          {ash::features::kProductivityLauncher});
+    }
   }
   ~AppListViewScalableLayoutTest() override = default;
 
@@ -473,10 +639,30 @@
     AppListConfigProvider::Get().ResetForTesting();
   }
 
- private:
+ protected:
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
+class ProductivityLauncherAppListViewLayoutTest
+    : public AppListViewScalableLayoutTest {
+ public:
+  ProductivityLauncherAppListViewLayoutTest()
+      : AppListViewScalableLayoutTest(/*enable_productivity_launcher=*/true) {}
+
+  void InitializeAppList() {
+    Initialize(true /*is_tablet_mode*/);
+    delegate_->GetTestModel()->PopulateApps(kInitialItems);
+    Show();
+  }
+};
+
+class LegacyLauncherAppListViewLayoutTest
+    : public AppListViewScalableLayoutTest {
+ public:
+  LegacyLauncherAppListViewLayoutTest()
+      : AppListViewScalableLayoutTest(/*enable_productivity_launcher=*/false) {}
+};
+
 // Tests of focus, optionally parameterized by RTL.
 class AppListViewFocusTest : public views::ViewsTestBase,
                              public testing::WithParamInterface<bool> {
@@ -2941,9 +3127,779 @@
   EXPECT_EQ(0.0f, contents_view()->expand_arrow_view()->layer()->opacity());
 }
 
+TEST_F(ProductivityLauncherAppListViewLayoutTest, RegularLandscapeScreen) {
+  const gfx::Size window_size = gfx::Size(1000, 800);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(96, 120);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/4, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 3 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       RegularLandscapeScreenAtMinPreferredVerticalMargin) {
+  const int window_height = GetExpectedProductivityLauncherAppsContainerHeight(
+      /*row_count=*/4, /*tile_size=*/120, /*tile_margin=*/8);
+  EXPECT_EQ(680, window_height);
+  const gfx::Size window_size = gfx::Size(800, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(96, 120);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/4, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 2 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       RegularLandscapeScreenWithRemovedRows) {
+  const int window_height =
+      GetExpectedProductivityLauncherAppsContainerHeight(
+          /*row_count=*/4, /*tile_size=*/120, /*tile_margin=*/8) -
+      4;
+  EXPECT_EQ(676, window_height);
+  const gfx::Size window_size = gfx::Size(800, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(96, 120);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(3, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 3 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(3, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 2 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       RegularLandscapeScreenAtMaxPreferredVerticalMargin) {
+  const int window_height = GetExpectedProductivityLauncherAppsContainerHeight(
+      /*row_count=*/4, /*tile_size=*/120, /*tile_margin=*/96);
+  EXPECT_EQ(944, window_height);
+  const gfx::Size window_size = gfx::Size(1000, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(96, 120);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/4, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 3 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       RegularLandscapeScreenWithAddedRows) {
+  const int window_height =
+      GetExpectedProductivityLauncherAppsContainerHeight(
+          /*row_count=*/4, /*tile_size=*/120, /*tile_margin=*/96) +
+      6;
+  EXPECT_EQ(950, window_height);
+  const gfx::Size window_size = gfx::Size(1000, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(96, 120);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/5, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 3 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest, RegularPortraitScreen) {
+  const gfx::Size window_size = gfx::Size(800, 1000);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(96, 120);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/5, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/4, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       RegularPortraitScreenAtMinPreferredVerticalMargin) {
+  const int window_height = GetExpectedProductivityLauncherAppsContainerHeight(
+      /*row_count=*/5, /*tile_size=*/120, /*tile_margin=*/8);
+  EXPECT_EQ(808, window_height);
+  const gfx::Size window_size = gfx::Size(700, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(96, 120);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/5, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 3 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       RegularPortraitScreenWithRemovedRows) {
+  const int window_height =
+      GetExpectedProductivityLauncherAppsContainerHeight(
+          /*row_count=*/5, /*tile_size=*/120, /*tile_margin=*/8) -
+      8;
+  EXPECT_EQ(800, window_height);
+  const gfx::Size window_size = gfx::Size(700, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(96, 120);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/4, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 3 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       RegularPortraitScreenAtMaxPreferredVerticalMargin) {
+  const int window_height = GetExpectedProductivityLauncherAppsContainerHeight(
+      /*row_count=*/5, /*tile_size=*/120, /*tile_margin=*/96);
+  EXPECT_EQ(1160, window_height);
+  const gfx::Size window_size = gfx::Size(1200, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin = 104;
+  const gfx::Size expected_item_size(96, 120);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/5, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/4, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       RegularPortraitScreenWithExtraRows) {
+  const int window_height =
+      GetExpectedProductivityLauncherAppsContainerHeight(
+          /*row_count=*/5, /*tile_size=*/120, /*tile_margin=*/96) +
+      4;
+  EXPECT_EQ(1164, window_height);
+  const gfx::Size window_size = gfx::Size(1200, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin = 104;
+  const gfx::Size expected_item_size(96, 120);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(6, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/6, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(6, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/4, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest, DenseLandscapeScreen) {
+  const gfx::Size window_size = gfx::Size(800, 600);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(72, 88);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/4, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 3 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       DenseLandscapeScreenAtMinPreferredVerticalMargin) {
+  const int window_height = GetExpectedProductivityLauncherAppsContainerHeight(
+      /*row_count=*/4, /*tile_size=*/88, /*tile_margin=*/8);
+  EXPECT_EQ(552, window_height);
+  const gfx::Size window_size = gfx::Size(800, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(72, 88);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/4, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 2 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       DenseLandscapeScreenWithRemovedRows) {
+  const int window_height =
+      GetExpectedProductivityLauncherAppsContainerHeight(
+          /*row_count=*/4, /*tile_size=*/88, /*tile_margin=*/8) -
+      4;
+  EXPECT_EQ(548, window_height);
+  const gfx::Size window_size = gfx::Size(800, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(72, 88);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(3, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 3 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(3, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 2 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest, DensePortraitScreen) {
+  const gfx::Size window_size = gfx::Size(600, 800);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(72, 88);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/5, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/4, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       DensePortraitScreenAtMinPreferredVerticalMargin) {
+  const int window_height = GetExpectedProductivityLauncherAppsContainerHeight(
+      /*row_count=*/5, /*tile_size=*/88, /*tile_margin=*/8);
+  EXPECT_EQ(648, window_height);
+  const gfx::Size window_size = gfx::Size(600, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(72, 88);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/5, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 3 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       DensePortraitScreenWithRemovedRows) {
+  const int window_height =
+      GetExpectedProductivityLauncherAppsContainerHeight(
+          /*row_count=*/5, /*tile_size=*/88, /*tile_margin=*/8) -
+      8;
+  EXPECT_EQ(640, window_height);
+  const gfx::Size window_size = gfx::Size(500, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(72, 88);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/4, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, 3 /*row_count*/, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       DensePortraitScreenAtMaxPreferredVerticalMargin) {
+  const int window_height = GetExpectedProductivityLauncherAppsContainerHeight(
+      /*row_count=*/5, /*tile_size=*/88, /*tile_margin=*/96);
+  EXPECT_EQ(1000, window_height);
+  const gfx::Size window_size = gfx::Size(600, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(72, 88);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/5, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/4, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       DensePortraitScreenWithExtraRows) {
+  const int window_height =
+      GetExpectedProductivityLauncherAppsContainerHeight(
+          /*row_count=*/5, /*tile_size=*/88, /*tile_margin=*/96) +
+      4;
+  EXPECT_EQ(1004, window_height);
+  const gfx::Size window_size = gfx::Size(600, window_height);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(72, 88);
+
+  {
+    SCOPED_TRACE("Only apps grid");
+    EXPECT_EQ(6, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/6, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/false);
+  }
+
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  {
+    SCOPED_TRACE("With recent apps");
+    EXPECT_EQ(6, apps_grid_view()->GetRowsForTesting());
+    VerifyAppsContainerLayoutForProductivityLauncher(
+        window_size, /*row_count=*/4, expected_horizontal_margin,
+        expected_item_size, /*has_recent_apps=*/true);
+  }
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       DenseAppsGridPaddingScaledDownToMakeRoomForPageSwitcher) {
+  // Select window width so using non-zero horizontal padding would result in
+  // lack of space for the page switcher.
+  const gfx::Size window_size = gfx::Size(472, 800);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(72, 88);
+  EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+  VerifyAppsContainerLayoutForProductivityLauncher(
+      window_size, /*row_count=*/5, expected_horizontal_margin,
+      expected_item_size, /*has_recent_apps=*/false);
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       DenseAppsGridScaledDownToMakeRoomForPageSwitcher) {
+  // Select window width so using default icon width would result in lack of
+  // space for the page switcher.
+  const gfx::Size window_size = gfx::Size(442, 800);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(66, 88);
+  EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+  VerifyAppsContainerLayoutForProductivityLauncher(
+      window_size, /*row_count=*/5, expected_horizontal_margin,
+      expected_item_size, /*has_recent_apps=*/false);
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       DenseAppsGridWithMaxHorizontalItemMargins) {
+  // Select window width that results in apps grid layout with max allowed
+  // horizontal margin (128): 2 * 56 (min horizontal margin) + 4 * 128 + 5 * 72
+  const gfx::Size window_size = gfx::Size(984, 600);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(72, 88);
+  EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+  VerifyAppsContainerLayoutForProductivityLauncher(
+      window_size, /*row_count=*/4, expected_horizontal_margin,
+      expected_item_size, /*has_recent_apps=*/false);
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       DenseAppsGridHorizontalItemMarginsBounded) {
+  // Select window width that results in apps grid layout with max allowed
+  // horizontal margin (128), i.e. larger than
+  // 2 * 56 (min horizontal margin) + 4 * 128 * 5 * 72
+  const gfx::Size window_size = gfx::Size(1000, 600);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin = 64;
+  const gfx::Size expected_item_size(72, 88);
+  EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+  VerifyAppsContainerLayoutForProductivityLauncher(
+      window_size, /*row_count=*/4, expected_horizontal_margin,
+      expected_item_size, /*has_recent_apps=*/false);
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       RegularAppsGridWithMaxHorizontalItemMargins) {
+  // Select window width that results in apps grid layout with max allowed
+  // horizontal margin (128):
+  // 2 * 56 (min horizontal margin) + 4 * 128 * 5 * 96
+  const gfx::Size window_size = gfx::Size(1104, 1200);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(96, 120);
+  EXPECT_EQ(6, apps_grid_view()->GetRowsForTesting());
+  VerifyAppsContainerLayoutForProductivityLauncher(
+      window_size, /*row_count=*/6, expected_horizontal_margin,
+      expected_item_size, /*has_recent_apps=*/false);
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       RegularAppsGridHorizontalItemMarginsBounded) {
+  // Select window width that results in apps grid layout with max allowed
+  // horizontal margin (128), i.e. larger than
+  // 2 * 56 (min horizontal margin) + 4 * 128 * 5 * 96
+  const gfx::Size window_size = gfx::Size(1116, 1200);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin = 62;
+  const gfx::Size expected_item_size(96, 120);
+  EXPECT_EQ(6, apps_grid_view()->GetRowsForTesting());
+  VerifyAppsContainerLayoutForProductivityLauncher(
+      window_size, /*row_count=*/6, expected_horizontal_margin,
+      expected_item_size, /*has_recent_apps=*/false);
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest, LayoutAfterConfigChange) {
+  const gfx::Size window_size = gfx::Size(600, 800);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(72, 88);
+  EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+  VerifyAppsContainerLayoutForProductivityLauncher(
+      window_size, /*row_count=*/5, expected_horizontal_margin,
+      expected_item_size, /*has_recent_apps=*/false);
+
+  const gfx::Size updated_window_size = gfx::Size(1000, 800);
+  GetContext()->SetBounds(gfx::Rect(updated_window_size));
+  view_->OnParentWindowBoundsChanged();
+
+  const gfx::Size expected_updated_item_size(96, 120);
+  EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+  VerifyAppsContainerLayoutForProductivityLauncher(
+      updated_window_size, /*row_count=*/4, expected_horizontal_margin,
+      expected_updated_item_size, /*has_recent_apps=*/false);
+}
+
+TEST_F(ProductivityLauncherAppListViewLayoutTest,
+       LayoutAfterConfigChangeWithRecentApps) {
+  const gfx::Size window_size = gfx::Size(600, 800);
+  GetContext()->SetBounds(gfx::Rect(window_size));
+
+  InitializeAppList();
+  AddRecentApps(4);
+  contents_view()->ResetForShow();
+
+  const int expected_horizontal_margin =
+      kMinProductivityLauncherGridHorizontalMargin;
+  const gfx::Size expected_item_size(72, 88);
+  EXPECT_EQ(5, apps_grid_view()->GetRowsForTesting());
+  VerifyAppsContainerLayoutForProductivityLauncher(
+      window_size, /*row_count=*/4, expected_horizontal_margin,
+      expected_item_size, /*has_recent_apps=*/true);
+
+  const gfx::Size updated_window_size = gfx::Size(1000, 800);
+  GetContext()->SetBounds(gfx::Rect(updated_window_size));
+  view_->OnParentWindowBoundsChanged();
+
+  const gfx::Size expected_updated_item_size(96, 120);
+  EXPECT_EQ(4, apps_grid_view()->GetRowsForTesting());
+  VerifyAppsContainerLayoutForProductivityLauncher(
+      updated_window_size, /*row_count=*/3, expected_horizontal_margin,
+      expected_updated_item_size, /*has_recent_apps=*/true);
+}
+
 // Tests fullscreen apps grid sizing and layout for small screens (width < 960)
 // in landscape layout.
-TEST_F(AppListViewScalableLayoutTest,
+TEST_F(LegacyLauncherAppListViewLayoutTest,
        AppListViewLayoutForSmallLandscapeScreen) {
   const gfx::Size window_size = gfx::Size(800, 600);
   gfx::NativeView parent = GetContext();
@@ -2964,7 +3920,8 @@
 
 // Tests fullscreen apps grid sizing and layout for small screens (width < 600)
 // in portrait layout.
-TEST_F(AppListViewScalableLayoutTest, AppListViewLayoutForSmallPortraitScreen) {
+TEST_F(LegacyLauncherAppListViewLayoutTest,
+       AppListViewLayoutForSmallPortraitScreen) {
   const gfx::Size window_size = gfx::Size(500, 800);
   gfx::NativeView parent = GetContext();
   parent->SetBounds(gfx::Rect(window_size));
@@ -2984,7 +3941,7 @@
 
 // Tests fullscreen apps grid sizing and layout for medium sized screens
 // (width < 1200) in lanscape layout.
-TEST_F(AppListViewScalableLayoutTest,
+TEST_F(LegacyLauncherAppListViewLayoutTest,
        AppListViewLayoutForMediumLandscapeScreen) {
   const gfx::Size window_size = gfx::Size(960, 800);
   gfx::NativeView parent = GetContext();
@@ -3008,7 +3965,7 @@
 
 // Tests fullscreen apps grid sizing and layout for medium sized screens
 // (width < 768) in portrait layout.
-TEST_F(AppListViewScalableLayoutTest,
+TEST_F(LegacyLauncherAppListViewLayoutTest,
        AppListViewLayoutForMediumPortraitScreen) {
   const gfx::Size window_size = gfx::Size(700, 800);
   gfx::NativeView parent = GetContext();
@@ -3029,7 +3986,7 @@
 
 // Tests fullscreen apps grid sizing and layout for large screens
 // (width >= 1200) in landscape layout.
-TEST_F(AppListViewScalableLayoutTest,
+TEST_F(LegacyLauncherAppListViewLayoutTest,
        AppListViewLayoutForLargeLandscapeScreen) {
   const gfx::Size window_size = gfx::Size(1200, 960);
   gfx::NativeView parent = GetContext();
@@ -3053,7 +4010,8 @@
 
 // Tests fullscreen apps grid sizing and layout for large screens (width >= 768)
 // in portrait layout.
-TEST_F(AppListViewScalableLayoutTest, AppListViewLayoutForLargePortraitScreen) {
+TEST_F(LegacyLauncherAppListViewLayoutTest,
+       AppListViewLayoutForLargePortraitScreen) {
   const gfx::Size window_size = gfx::Size(800, 1200);
   gfx::NativeView parent = GetContext();
   parent->SetBounds(gfx::Rect(window_size));
@@ -3073,7 +4031,8 @@
 
 // Tests that apps grid horizontal margin have minimum that ensures the page
 // switcher view can fit next to the apps grid.
-TEST_F(AppListViewScalableLayoutTest, EnsurePageSwitcherFitsAppsGridMargin) {
+TEST_F(LegacyLauncherAppListViewLayoutTest,
+       EnsurePageSwitcherFitsAppsGridMargin) {
   const gfx::Size window_size = gfx::Size(440, 800);
   gfx::NativeView parent = GetContext();
   parent->SetBounds(gfx::Rect(window_size));
@@ -3097,7 +4056,8 @@
 // Verifies that the vertical spacing between items in apps grid has an upper
 // limit, and that the apps grid is centered in the available space if item
 // spacing hits that limit.
-TEST_F(AppListViewScalableLayoutTest, VerticalAppsGridItemSpacingIsBounded) {
+TEST_F(LegacyLauncherAppListViewLayoutTest,
+       VerticalAppsGridItemSpacingIsBounded) {
   const gfx::Size window_size = gfx::Size(960, 1600);
   gfx::NativeView parent = GetContext();
   parent->SetBounds(gfx::Rect(window_size));
@@ -3123,7 +4083,7 @@
 
 // Verifies that the vertical apps container margin is big enough to fit the
 // apps grid fadeout area.
-TEST_F(AppListViewScalableLayoutTest,
+TEST_F(LegacyLauncherAppListViewLayoutTest,
        VerticalAppsContainerMarginFitFadeoutArea) {
   const gfx::Size window_size(650, 536);
   gfx::NativeView parent = GetContext();
@@ -3146,7 +4106,8 @@
 
 // Tests fullscreen apps grid sizing and layout gets updated to correct bounds
 // when app list config changes.
-TEST_F(AppListViewScalableLayoutTest, AppListViewLayoutAfterConfigChange) {
+TEST_F(LegacyLauncherAppListViewLayoutTest,
+       AppListViewLayoutAfterConfigChange) {
   const gfx::Size window_size = gfx::Size(500, 800);
   gfx::NativeView parent = GetContext();
   parent->SetBounds(gfx::Rect(window_size));
diff --git a/ash/app_list/views/apps_container_view.cc b/ash/app_list/views/apps_container_view.cc
index 37ee607..93ee734 100644
--- a/ash/app_list/views/apps_container_view.cc
+++ b/ash/app_list/views/apps_container_view.cc
@@ -1076,6 +1076,8 @@
 }
 
 int AppsContainerView::GetIdealHorizontalMargin() const {
+  if (features::IsProductivityLauncherEnabled())
+    return 24;
   const int available_width = GetContentsBounds().width();
   if (available_width >=
       kAppsGridMarginRatio * GetMinHorizontalMarginForAppsGrid()) {
diff --git a/ash/app_list/views/contents_view.cc b/ash/app_list/views/contents_view.cc
index 76272e8..f03bb34 100644
--- a/ash/app_list/views/contents_view.cc
+++ b/ash/app_list/views/contents_view.cc
@@ -20,6 +20,7 @@
 #include "ash/app_list/views/search_result_list_view.h"
 #include "ash/app_list/views/search_result_page_view.h"
 #include "ash/app_list/views/search_result_tile_item_list_view.h"
+#include "ash/constants/ash_features.h"
 #include "ash/keyboard/ui/keyboard_ui_controller.h"
 #include "ash/public/cpp/app_list/app_list_config.h"
 #include "ash/public/cpp/app_list/app_list_features.h"
@@ -555,7 +556,8 @@
   // Reduce the search box size in fullscreen view state when the work area
   // height is less than 600 dip - the goal is to increase the amount of space
   // available to the apps grid.
-  if (GetContentsBounds().height() < kDenseLayoutHeightThreshold) {
+  if (!features::IsProductivityLauncherEnabled() &&
+      GetContentsBounds().height() < kDenseLayoutHeightThreshold) {
     preferred_size.set_height(kSearchBoxHeightForDenseLayout);
   } else {
     preferred_size.set_height(kSearchBoxHeight);
diff --git a/ash/app_list/views/paged_apps_grid_view.cc b/ash/app_list/views/paged_apps_grid_view.cc
index f2d6478..b0ee4b8 100644
--- a/ash/app_list/views/paged_apps_grid_view.cc
+++ b/ash/app_list/views/paged_apps_grid_view.cc
@@ -1382,9 +1382,9 @@
     // I.e. min n, with padding as close to max as possible where:
     // n* tile_height + (n - 1) * padding <= available_height
     // padding <= max_padding
-    final_row_count =
-        std::ceil((available_height + kMaxVerticalPaddingBetweenTiles) /
-                  (tile_height + kMaxVerticalPaddingBetweenTiles));
+    final_row_count = std::ceil(
+        static_cast<float>(available_height + kMaxVerticalPaddingBetweenTiles) /
+        (tile_height + kMaxVerticalPaddingBetweenTiles));
   }
   // Unit tests may create artificially small screens resulting in
   // `final_row_count` of 0. Return 1 row to avoid divide-by-zero in layout.
diff --git a/ash/app_list/views/paged_apps_grid_view_unittest.cc b/ash/app_list/views/paged_apps_grid_view_unittest.cc
index a017443..f803c4a 100644
--- a/ash/app_list/views/paged_apps_grid_view_unittest.cc
+++ b/ash/app_list/views/paged_apps_grid_view_unittest.cc
@@ -167,8 +167,8 @@
   // Test with a display in landscape mode with more height. This should have
   // more rows.
   UpdateDisplay("1400x1100");
-  EXPECT_EQ(3, GetPagedAppsGridView()->GetFirstPageRowsForTesting());
-  EXPECT_EQ(4, GetPagedAppsGridView()->GetRowsForTesting());
+  EXPECT_EQ(4, GetPagedAppsGridView()->GetFirstPageRowsForTesting());
+  EXPECT_EQ(5, GetPagedAppsGridView()->GetRowsForTesting());
   EXPECT_EQ(5, GetPagedAppsGridView()->cols());
 
   // Test with a display in portrait mode.
@@ -180,8 +180,8 @@
   // Test with a display in portrait mode with more height. This should have
   // more rows.
   UpdateDisplay("700x1400");
-  EXPECT_EQ(4, GetPagedAppsGridView()->GetFirstPageRowsForTesting());
-  EXPECT_EQ(6, GetPagedAppsGridView()->GetRowsForTesting());
+  EXPECT_EQ(5, GetPagedAppsGridView()->GetFirstPageRowsForTesting());
+  EXPECT_EQ(7, GetPagedAppsGridView()->GetRowsForTesting());
   EXPECT_EQ(5, GetPagedAppsGridView()->cols());
 }
 
diff --git a/ash/components/arc/BUILD.gn b/ash/components/arc/BUILD.gn
index 9c7667d..6b22190e 100644
--- a/ash/components/arc/BUILD.gn
+++ b/ash/components/arc/BUILD.gn
@@ -145,7 +145,7 @@
     "//third_party/re2",
     "//ui/base/ime/ash",
     "//ui/chromeos/strings",
-    "//ui/chromeos/styles:cros_styles_views_generator",
+    "//ui/chromeos/styles:cros_styles_views",
     "//ui/display/manager",
     "//ui/events/ozone",
     "//ui/wm/public",
diff --git a/ash/login/ui/fingerprint_auth_factor_model.cc b/ash/login/ui/fingerprint_auth_factor_model.cc
index 4ab2080..3de3ac7 100644
--- a/ash/login/ui/fingerprint_auth_factor_model.cc
+++ b/ash/login/ui/fingerprint_auth_factor_model.cc
@@ -23,7 +23,8 @@
 
 }  // namespace
 
-FingerprintAuthFactorModel::FingerprintAuthFactorModel() = default;
+FingerprintAuthFactorModel::FingerprintAuthFactorModel(FingerprintState state)
+    : state_(state) {}
 
 FingerprintAuthFactorModel::~FingerprintAuthFactorModel() = default;
 
diff --git a/ash/login/ui/fingerprint_auth_factor_model.h b/ash/login/ui/fingerprint_auth_factor_model.h
index 7591dcb..e8e549a 100644
--- a/ash/login/ui/fingerprint_auth_factor_model.h
+++ b/ash/login/ui/fingerprint_auth_factor_model.h
@@ -16,7 +16,7 @@
 // lock screen.
 class FingerprintAuthFactorModel : public AuthFactorModel {
  public:
-  FingerprintAuthFactorModel();
+  explicit FingerprintAuthFactorModel(FingerprintState state);
   FingerprintAuthFactorModel(FingerprintAuthFactorModel&) = delete;
   FingerprintAuthFactorModel& operator=(FingerprintAuthFactorModel&) = delete;
   ~FingerprintAuthFactorModel() override;
@@ -40,9 +40,11 @@
   void DoHandleErrorTimeout() override;
   void UpdateIcon(AuthIconView* icon) override;
 
-  FingerprintState state_ = FingerprintState::AVAILABLE_DEFAULT;
+  FingerprintState state_;
   absl::optional<bool> auth_result_;
 
+  // TODO(b/216691052): Change the name of this to be more clear that this is
+  // an override on top of |state_|.
   bool available_ = true;
 };
 
diff --git a/ash/login/ui/login_auth_user_view.cc b/ash/login/ui/login_auth_user_view.cc
index 0edc25b3..a420135 100644
--- a/ash/login/ui/login_auth_user_view.cc
+++ b/ash/login/ui/login_auth_user_view.cc
@@ -1017,10 +1017,20 @@
   return view_->auth_factors_view_;
 }
 
+AuthFactorModel* LoginAuthUserView::TestApi::fingerprint_auth_factor_model()
+    const {
+  return view_->fingerprint_auth_factor_model_;
+}
+
 bool LoginAuthUserView::TestApi::HasAuthMethod(AuthMethods auth_method) const {
   return view_->HasAuthMethod(auth_method);
 }
 
+void LoginAuthUserView::TestApi::SetFingerprintState(
+    FingerprintState state) const {
+  return view_->SetFingerprintState(state);
+}
+
 const std::u16string&
 LoginAuthUserView::TestApi::GetDisabledAuthMessageContent() const {
   return LoginAuthUserView::DisabledAuthMessageView::TestApi(
@@ -1133,7 +1143,7 @@
   std::unique_ptr<LoginAuthFactorsView> auth_factors_view;
   if (smart_lock_ui_revamp_enabled_) {
     auto fingerprint_auth_factor_model =
-        std::make_unique<FingerprintAuthFactorModel>();
+        std::make_unique<FingerprintAuthFactorModel>(user.fingerprint_state);
     fingerprint_auth_factor_model_ = fingerprint_auth_factor_model.get();
     auto smart_lock_auth_factor_model =
         std::make_unique<SmartLockAuthFactorModel>(base::BindRepeating(
diff --git a/ash/login/ui/login_auth_user_view.h b/ash/login/ui/login_auth_user_view.h
index 52e428e..4b415ce 100644
--- a/ash/login/ui/login_auth_user_view.h
+++ b/ash/login/ui/login_auth_user_view.h
@@ -9,6 +9,7 @@
 #include <memory>
 
 #include "ash/ash_export.h"
+#include "ash/login/ui/auth_factor_model.h"
 #include "ash/login/ui/login_error_bubble.h"
 #include "ash/login/ui/login_password_view.h"
 #include "ash/login/ui/login_user_view.h"
@@ -103,8 +104,10 @@
     views::Button* challenge_response_button();
     views::Label* challenge_response_label();
     LoginAuthFactorsView* auth_factors_view() const;
+    AuthFactorModel* fingerprint_auth_factor_model() const;
     bool HasAuthMethod(AuthMethods auth_method) const;
     const std::u16string& GetDisabledAuthMessageContent() const;
+    void SetFingerprintState(FingerprintState state) const;
 
    private:
     LoginAuthUserView* const view_;
diff --git a/ash/login/ui/login_auth_user_view_unittest.cc b/ash/login/ui/login_auth_user_view_unittest.cc
index b7135e3..6d8aa4b 100644
--- a/ash/login/ui/login_auth_user_view_unittest.cc
+++ b/ash/login/ui/login_auth_user_view_unittest.cc
@@ -6,6 +6,8 @@
 
 #include "ash/constants/ash_features.h"
 #include "ash/login/mock_login_screen_client.h"
+#include "ash/login/ui/auth_factor_model.h"
+#include "ash/login/ui/fingerprint_auth_factor_model.h"
 #include "ash/login/ui/login_password_view.h"
 #include "ash/login/ui/login_pin_input_view.h"
 #include "ash/login/ui/login_pin_view.h"
@@ -79,24 +81,7 @@
   void SetUp() override {
     LoginTestBase::SetUp();
     SetUpFeatures();
-    user_ = CreateUser("user@domain.com");
-
-    LoginAuthUserView::Callbacks auth_callbacks;
-    auth_callbacks.on_auth = base::DoNothing();
-    auth_callbacks.on_easy_unlock_icon_hovered = base::DoNothing();
-    auth_callbacks.on_easy_unlock_icon_tapped =
-        views::Button::PressedCallback();
-    auth_callbacks.on_tap = base::DoNothing();
-    auth_callbacks.on_remove_warning_shown = base::DoNothing();
-    auth_callbacks.on_remove = base::DoNothing();
-    view_ = new LoginAuthUserView(user_, auth_callbacks);
-
-    // We proxy |view_| inside of |container_| so we can control layout.
-    container_ = new views::View();
-    container_->SetLayoutManager(std::make_unique<views::BoxLayout>(
-        views::BoxLayout::Orientation::kVertical));
-    container_->AddChildView(view_);
-    SetWidget(CreateWidgetWithContent(container_));
+    InitializeViewForUser(CreateUser("user@domain.com"));
   }
 
   void SetUpFeatures() {
@@ -142,6 +127,26 @@
     EXPECT_EQ(test.pin_password_toggle()->GetVisible(), visibility.toggle);
   }
 
+  void InitializeViewForUser(LoginUserInfo user) {
+    user_ = user;
+    LoginAuthUserView::Callbacks auth_callbacks;
+    auth_callbacks.on_auth = base::DoNothing();
+    auth_callbacks.on_easy_unlock_icon_hovered = base::DoNothing();
+    auth_callbacks.on_easy_unlock_icon_tapped =
+        views::Button::PressedCallback();
+    auth_callbacks.on_tap = base::DoNothing();
+    auth_callbacks.on_remove_warning_shown = base::DoNothing();
+    auth_callbacks.on_remove = base::DoNothing();
+    view_ = new LoginAuthUserView(user_, auth_callbacks);
+
+    // We proxy |view_| inside of |container_| so we can control layout.
+    container_ = new views::View();
+    container_->SetLayoutManager(std::make_unique<views::BoxLayout>(
+        views::BoxLayout::Orientation::kVertical));
+    container_->AddChildView(view_);
+    SetWidget(CreateWidgetWithContent(container_));
+  }
+
   // Initialized by test parameter in `SetUpFeatures`
   bool autosubmit_feature_enabled_ = false;
 
@@ -521,4 +526,51 @@
                          testing::Bool(),  // PIN autosubmit feature
                          LoginAuthUserViewUnittest::ParamInfoToString);
 
+/**
+ * This subclass is a test fixture for tests validating logic with auth factors
+ * with the kSmartLockUIRevamp feature flag enabled. The test requires passing
+ * a custom user object per test to initialize the view to test.
+ */
+class LoginAuthUserViewAuthFactorsUnittest : public LoginAuthUserViewUnittest {
+ public:
+  LoginAuthUserViewAuthFactorsUnittest(
+      const LoginAuthUserViewAuthFactorsUnittest&) = delete;
+  LoginAuthUserViewAuthFactorsUnittest& operator=(
+      const LoginAuthUserViewAuthFactorsUnittest&) = delete;
+
+ protected:
+  LoginAuthUserViewAuthFactorsUnittest() = default;
+  ~LoginAuthUserViewAuthFactorsUnittest() override = default;
+
+  void SetUp() override {
+    LoginTestBase::SetUp();
+    feature_list_.InitWithFeatures({chromeos::features::kSmartLockUIRevamp},
+                                   {});
+  }
+};
+
+TEST_F(LoginAuthUserViewAuthFactorsUnittest, ShowFingerprintIfAvailable) {
+  auto user = CreateUser("user@domain.com");
+  user.fingerprint_state = FingerprintState::AVAILABLE_DEFAULT;
+  InitializeViewForUser(user);
+  SetAuthMethods(LoginAuthUserView::AuthMethods::AUTH_FINGERPRINT);
+  LoginAuthUserView::TestApi auth_test(view_);
+  AuthFactorModel* fingerprint_auth_factor =
+      auth_test.fingerprint_auth_factor_model();
+  EXPECT_EQ(fingerprint_auth_factor->GetAuthFactorState(),
+            AuthFactorModel::AuthFactorState::kReady);
+}
+
+TEST_F(LoginAuthUserViewAuthFactorsUnittest, NotShowFingerprintIfUnavaialble) {
+  auto user = CreateUser("user@domain.com");
+  user.fingerprint_state = FingerprintState::UNAVAILABLE;
+  InitializeViewForUser(user);
+  SetAuthMethods(LoginAuthUserView::AuthMethods::AUTH_FINGERPRINT);
+  LoginAuthUserView::TestApi auth_test(view_);
+  AuthFactorModel* fingerprint_auth_factor =
+      auth_test.fingerprint_auth_factor_model();
+  EXPECT_EQ(fingerprint_auth_factor->GetAuthFactorState(),
+            AuthFactorModel::AuthFactorState::kUnavailable);
+}
+
 }  // namespace ash
diff --git a/ash/system/message_center/unified_message_list_view_unittest.cc b/ash/system/message_center/unified_message_list_view_unittest.cc
index 5052371..9e766abd 100644
--- a/ash/system/message_center/unified_message_list_view_unittest.cc
+++ b/ash/system/message_center/unified_message_list_view_unittest.cc
@@ -478,13 +478,8 @@
   EXPECT_EQ(0, message_list_view()->GetPreferredSize().height());
 }
 
-// Flaky on ASAN: https://crbug.com/1293003.
-#if defined(ADDRESS_SANITIZER)
-#define MAYBE_ResetAnimation DISABLED_ResetAnimation
-#else
-#define MAYBE_ResetAnimation ResetAnimation
-#endif
-TEST_P(ParameterizedUnifiedMessageListViewTest, MAYBE_ResetAnimation) {
+// Flaky: https://crbug.com/1292774.
+TEST_P(ParameterizedUnifiedMessageListViewTest, DISABLED_ResetAnimation) {
   auto id0 = AddNotification();
   auto id1 = AddNotification();
   CreateMessageListView();
@@ -672,14 +667,9 @@
   EXPECT_EQ(1u, message_list_view()->children().size());
 }
 
-// Flaky on ASAN: https://crbug.com/1293003.
-#if defined(ADDRESS_SANITIZER)
-#define MAYBE_UserSwipesAwayNotification DISABLED_UserSwipesAwayNotification
-#else
-#define MAYBE_UserSwipesAwayNotification UserSwipesAwayNotification
-#endif
+// Flaky: https://crbug.com/1292701.
 TEST_P(ParameterizedUnifiedMessageListViewTest,
-       MAYBE_UserSwipesAwayNotification) {
+       DISABLED_UserSwipesAwayNotification) {
   // Show message list with two notifications.
   AddNotification();
   auto id1 = AddNotification();
@@ -913,8 +903,9 @@
 
 // Tests that expanding a notification at various stages while it is being
 // closed does not result in an animation.
+// TODO(crbug.com/1292775): Test is flaky.
 TEST_F(RefreshedUnifiedMessageListView,
-       CollapseDuringCloseResultsInNoCollapseAnimation) {
+       DISABLED_CollapseDuringCloseResultsInNoCollapseAnimation) {
   auto id1 = AddNotification(/*pinned=*/false, /*expandable=*/true);
   AddNotification(/*pinned=*/false, /*expandable=*/true);
   CreateMessageListView();
diff --git a/ash/webui/firmware_update_ui/firmware_update_app_ui.cc b/ash/webui/firmware_update_ui/firmware_update_app_ui.cc
index 8788d06d..09effe2 100644
--- a/ash/webui/firmware_update_ui/firmware_update_app_ui.cc
+++ b/ash/webui/firmware_update_ui/firmware_update_app_ui.cc
@@ -46,6 +46,7 @@
       {"nextButton", IDS_FIRMWARE_NEXT_BUTTON_TEXT},
       {"cancelButton", IDS_FIRMWARE_CANCEL_BUTTON_TEXT},
       {"doneButton", IDS_FIRMWARE_DONE_BUTTON_TEXT},
+      {"okButton", IDS_FIRMWARE_OK_BUTTON_TEXT},
       {"updateButton", IDS_FIRMWARE_UPDATE_BUTTON_TEXT},
       {"updateButtonA11yLabel", IDS_FIRMWARE_UPDATE_BUTTON_A11Y_LABEL},
       {"updateFailedBodyText", IDS_FIRMWARE_UPDATE_FAILED_BODY_TEXT},
diff --git a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.html b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.html
index 9517cd5..745a55d7 100644
--- a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.html
+++ b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.html
@@ -62,7 +62,7 @@
       <cr-button class="action-button"
           on-click="closeDialog_"
           id="updateDoneButton">
-        [[i18n('doneButton')]]
+        [[computeButtonText_(installationProgress.state)]]
       </cr-button>
     </div>
   </cr-dialog>
diff --git a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js
index 7e06109..ec3a96f 100644
--- a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js
+++ b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js
@@ -311,6 +311,20 @@
 
     return false;
   }
+
+  /**
+   * @protected
+   * @return {string}
+   */
+  computeButtonText_() {
+    if (!this.isUpdateDone_()) {
+      return '';
+    }
+
+    return this.installationProgress.state === UpdateState.kSuccess ?
+        this.i18n('doneButton') :
+        this.i18n('okButton');
+  }
 }
 
 customElements.define(
diff --git a/ash/webui/personalization_app/BUILD.gn b/ash/webui/personalization_app/BUILD.gn
index 55900716..069e21f 100644
--- a/ash/webui/personalization_app/BUILD.gn
+++ b/ash/webui/personalization_app/BUILD.gn
@@ -29,7 +29,7 @@
     "//ash/webui/resources:personalization_app_resources",
     "//chromeos/strings",
     "//content/public/browser",
-    "//ui/chromeos/styles:cros_styles_views_generator",
+    "//ui/chromeos/styles:cros_styles_views",
     "//ui/resources:webui_generated_resources_grd_grit",
     "//ui/resources:webui_resources_grd_grit",
     "//ui/webui",
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc
index cc99c81..16283cd5 100644
--- a/ash/wm/overview/overview_grid.cc
+++ b/ash/wm/overview/overview_grid.cc
@@ -1033,15 +1033,17 @@
 
   UpdateCannotSnapWarningVisibility();
 
-  if (desks_templates_grid_widget_)
-    desks_templates_grid_widget_->SetBounds(GetGridEffectiveBounds());
-
   // In case of split view mode, the grid bounds and item positions will be
   // updated in |OnSplitViewDividerPositionChanged|.
   if (SplitViewController::Get(root_window_)->InSplitViewMode())
     return;
   SetBoundsAndUpdatePositions(GetGridBoundsInScreen(root_window_),
                               /*ignored_items=*/{}, /*animate=*/false);
+
+  // This needs to be done after `SetBoundsAndUpdatePositions` since it needs
+  // `bounds_` to have its new value.
+  if (desks_templates_grid_widget_)
+    desks_templates_grid_widget_->SetBounds(GetGridEffectiveBounds());
 }
 
 void OverviewGrid::OnUserWorkAreaInsetsChanged(aura::Window* root_window) {
diff --git a/base/allocator/allocator_shim.h b/base/allocator/allocator_shim.h
index 1a4146e065..26eae8c3 100644
--- a/base/allocator/allocator_shim.h
+++ b/base/allocator/allocator_shim.h
@@ -177,6 +177,8 @@
 using SplitMainPartition = base::StrongAlias<class SplitMainPartitionTag, bool>;
 using UseDedicatedAlignedPartition =
     base::StrongAlias<class UseDedicatedAlignedPartitionTag, bool>;
+using AlternateBucketDistribution =
+    base::StrongAlias<class AlternateBucketDistributionTag, bool>;
 
 // If |thread_cache_on_non_quarantinable_partition| is specified, the
 // thread-cache will be enabled on the non-quarantinable partition. The
@@ -184,7 +186,8 @@
 BASE_EXPORT void ConfigurePartitions(
     EnableBrp enable_brp,
     SplitMainPartition split_main_partition,
-    UseDedicatedAlignedPartition use_dedicated_aligned_partition);
+    UseDedicatedAlignedPartition use_dedicated_aligned_partition,
+    AlternateBucketDistribution use_alternate_bucket_distribution);
 
 #if defined(PA_ALLOW_PCSCAN)
 BASE_EXPORT void EnablePCScan(base::internal::PCScan::InitConfig);
diff --git a/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc b/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc
index 8a112af9..66977c4 100644
--- a/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc
+++ b/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc
@@ -490,7 +490,8 @@
 void ConfigurePartitions(
     EnableBrp enable_brp,
     SplitMainPartition split_main_partition,
-    UseDedicatedAlignedPartition use_dedicated_aligned_partition) {
+    UseDedicatedAlignedPartition use_dedicated_aligned_partition,
+    AlternateBucketDistribution use_alternate_bucket_distribution) {
   // BRP cannot be enabled without splitting the main partition. Furthermore, in
   // the "before allocation" mode, it can't be enabled without further splitting
   // out the aligned partition.
@@ -566,6 +567,11 @@
   // Purge memory, now that the traffic to the original partition is cut off.
   current_root->PurgeMemory(PartitionPurgeDecommitEmptySlotSpans |
                             PartitionPurgeDiscardUnusedSystemPages);
+
+  if (!use_alternate_bucket_distribution) {
+    g_root.Get()->SwitchToDenserBucketDistribution();
+    g_aligned_root.Get()->SwitchToDenserBucketDistribution();
+  }
 }
 
 #if defined(PA_ALLOW_PCSCAN)
diff --git a/base/allocator/partition_alloc_features.cc b/base/allocator/partition_alloc_features.cc
index a5afcc7..41fdab22 100644
--- a/base/allocator/partition_alloc_features.cc
+++ b/base/allocator/partition_alloc_features.cc
@@ -78,6 +78,12 @@
 
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
 
+// If enabled, switches the bucket distribution to an alternate one. The
+// alternate distribution must have buckets that are a subset of the default
+// one.
+const Feature kPartitionAllocUseAlternateDistribution{
+    "PartitionAllocUseAlternateDistribution", FEATURE_DISABLED_BY_DEFAULT};
+
 // If enabled, switches PCScan scheduling to a mutator-aware scheduler. Does not
 // affect whether PCScan is enabled itself.
 const Feature kPartitionAllocPCScanMUAwareScheduler{
diff --git a/base/allocator/partition_alloc_features.h b/base/allocator/partition_alloc_features.h
index 0e37ed3..df79f3c 100644
--- a/base/allocator/partition_alloc_features.h
+++ b/base/allocator/partition_alloc_features.h
@@ -69,6 +69,7 @@
 extern const BASE_EXPORT Feature kPartitionAllocDCScan;
 extern const BASE_EXPORT Feature kPartitionAllocPCScanImmediateFreeing;
 extern const BASE_EXPORT Feature kPartitionAllocPCScanEagerClearing;
+extern const BASE_EXPORT Feature kPartitionAllocUseAlternateDistribution;
 
 }  // namespace features
 }  // namespace base
diff --git a/base/allocator/partition_allocator/partition_alloc_perftest.cc b/base/allocator/partition_allocator/partition_alloc_perftest.cc
index 8eeaa6c..75146c8 100644
--- a/base/allocator/partition_allocator/partition_alloc_perftest.cc
+++ b/base/allocator/partition_allocator/partition_alloc_perftest.cc
@@ -82,7 +82,10 @@
 
 class PartitionAllocator : public Allocator {
  public:
-  PartitionAllocator() = default;
+  explicit PartitionAllocator(bool use_alternate_bucket_dist) {
+    if (!use_alternate_bucket_dist)
+      alloc_.SwitchToDenserBucketDistribution();
+  }
   ~PartitionAllocator() override = default;
 
   void* Alloc(size_t size) override {
@@ -105,7 +108,7 @@
 ThreadSafePartitionRoot* g_partition_root = nullptr;
 class PartitionAllocatorWithThreadCache : public Allocator {
  public:
-  PartitionAllocatorWithThreadCache() {
+  explicit PartitionAllocatorWithThreadCache(bool use_alternate_bucket_dist) {
     if (!g_partition_root) {
       g_partition_root = new ThreadSafePartitionRoot({
           PartitionOptions::AlignedAlloc::kDisallowed,
@@ -117,6 +120,8 @@
       });
     }
     internal::ThreadCacheRegistry::Instance().PurgeAll();
+    if (!use_alternate_bucket_dist)
+      g_partition_root->SwitchToDenserBucketDistribution();
   }
   ~PartitionAllocatorWithThreadCache() override = default;
 
@@ -302,14 +307,16 @@
   return timer.LapsPerSecond();
 }
 
-std::unique_ptr<Allocator> CreateAllocator(AllocatorType type) {
+std::unique_ptr<Allocator> CreateAllocator(AllocatorType type,
+                                           bool use_alternate_bucket_dist) {
   switch (type) {
     case AllocatorType::kSystem:
       return std::make_unique<SystemAllocator>();
     case AllocatorType::kPartitionAlloc:
-      return std::make_unique<PartitionAllocator>();
+      return std::make_unique<PartitionAllocator>(use_alternate_bucket_dist);
     case AllocatorType::kPartitionAllocWithThreadCache:
-      return std::make_unique<PartitionAllocatorWithThreadCache>();
+      return std::make_unique<PartitionAllocatorWithThreadCache>(
+          use_alternate_bucket_dist);
   }
 }
 
@@ -323,11 +330,12 @@
 }
 
 void RunTest(int thread_count,
+             bool use_alternate_bucket_dist,
              AllocatorType alloc_type,
              float (*test_fn)(Allocator*),
              float (*noisy_neighbor_fn)(Allocator*),
              const char* story_base_name) {
-  auto alloc = CreateAllocator(alloc_type);
+  auto alloc = CreateAllocator(alloc_type, use_alternate_bucket_dist);
 
   std::unique_ptr<TestLoopThread> noisy_neighbor_thread = nullptr;
   if (noisy_neighbor_fn) {
@@ -376,7 +384,7 @@
 }
 
 class PartitionAllocMemoryAllocationPerfTest
-    : public testing::TestWithParam<std::tuple<int, AllocatorType>> {};
+    : public testing::TestWithParam<std::tuple<int, bool, AllocatorType>> {};
 
 // Only one partition with a thread cache: cannot use the thread cache when
 // PartitionAlloc is malloc().
@@ -385,6 +393,7 @@
     PartitionAllocMemoryAllocationPerfTest,
     ::testing::Combine(
         ::testing::Values(1, 2, 3, 4),
+        ::testing::Values(false, true),
         ::testing::Values(AllocatorType::kSystem,
                           AllocatorType::kPartitionAlloc,
                           AllocatorType::kPartitionAllocWithThreadCache)));
@@ -394,34 +403,38 @@
 #if !defined(MEMORY_CONSTRAINED)
 TEST_P(PartitionAllocMemoryAllocationPerfTest, SingleBucket) {
   auto params = GetParam();
-  RunTest(std::get<0>(params), std::get<1>(params), SingleBucket, nullptr,
+  RunTest(std::get<int>(params), std::get<bool>(params),
+          std::get<AllocatorType>(params), SingleBucket, nullptr,
           "SingleBucket");
 }
 #endif  // defined(MEMORY_CONSTRAINED)
 
 TEST_P(PartitionAllocMemoryAllocationPerfTest, SingleBucketWithFree) {
   auto params = GetParam();
-  RunTest(std::get<0>(params), std::get<1>(params), SingleBucketWithFree,
-          nullptr, "SingleBucketWithFree");
+  RunTest(std::get<int>(params), std::get<bool>(params),
+          std::get<AllocatorType>(params), SingleBucketWithFree, nullptr,
+          "SingleBucketWithFree");
 }
 
 #if !defined(MEMORY_CONSTRAINED)
 TEST_P(PartitionAllocMemoryAllocationPerfTest, MultiBucket) {
   auto params = GetParam();
-  RunTest(std::get<0>(params), std::get<1>(params), MultiBucket, nullptr,
-          "MultiBucket");
+  RunTest(std::get<int>(params), std::get<bool>(params),
+          std::get<AllocatorType>(params), MultiBucket, nullptr, "MultiBucket");
 }
 #endif  // defined(MEMORY_CONSTRAINED)
 
 TEST_P(PartitionAllocMemoryAllocationPerfTest, MultiBucketWithFree) {
   auto params = GetParam();
-  RunTest(std::get<0>(params), std::get<1>(params), MultiBucketWithFree,
-          nullptr, "MultiBucketWithFree");
+  RunTest(std::get<int>(params), std::get<bool>(params),
+          std::get<AllocatorType>(params), MultiBucketWithFree, nullptr,
+          "MultiBucketWithFree");
 }
 
 TEST_P(PartitionAllocMemoryAllocationPerfTest, DirectMapped) {
   auto params = GetParam();
-  RunTest(std::get<0>(params), std::get<1>(params), DirectMapped, nullptr,
+  RunTest(std::get<int>(params), std::get<bool>(params),
+          std::get<AllocatorType>(params), DirectMapped, nullptr,
           "DirectMapped");
 }
 
@@ -429,7 +442,8 @@
 TEST_P(PartitionAllocMemoryAllocationPerfTest,
        DISABLED_MultiBucketWithNoisyNeighbor) {
   auto params = GetParam();
-  RunTest(std::get<0>(params), std::get<1>(params), MultiBucket, DirectMapped,
+  RunTest(std::get<int>(params), std::get<bool>(params),
+          std::get<AllocatorType>(params), MultiBucket, DirectMapped,
           "MultiBucketWithNoisyNeighbor");
 }
 #endif  // !defined(MEMORY_CONSTRAINED)
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc
index ec884b0..248e3928 100644
--- a/base/allocator/partition_allocator/partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -223,7 +223,7 @@
   char* ptr_;
 };
 
-class PartitionAllocTest : public testing::Test {
+class PartitionAllocTest : public testing::TestWithParam<bool> {
  protected:
   PartitionAllocTest() = default;
 
@@ -262,10 +262,16 @@
 
     allocator.root()->UncapEmptySlotSpanMemoryForTesting();
     aligned_allocator.root()->UncapEmptySlotSpanMemoryForTesting();
+
+    if (!GetParam())
+      allocator.root()->SwitchToDenserBucketDistribution();
+    else
+      allocator.root()->ResetBucketDistributionForTesting();
   }
 
   size_t SizeToIndex(size_t size) {
-    return PartitionRoot<base::internal::ThreadSafe>::SizeToBucketIndex(size);
+    return PartitionRoot<base::internal::ThreadSafe>::SizeToBucketIndex(
+        size, GetParam());
   }
 
   void TearDown() override {
@@ -513,8 +519,12 @@
 
 }  // namespace
 
+INSTANTIATE_TEST_SUITE_P(AlternateBucketDistribution,
+                         PartitionAllocTest,
+                         testing::Values(false, true));
+
 // Check that the most basic of allocate / free pairs work.
-TEST_F(PartitionAllocTest, Basic) {
+TEST_P(PartitionAllocTest, Basic) {
   PartitionRoot<ThreadSafe>::Bucket* bucket =
       &allocator.root()->buckets[test_bucket_index_];
   auto* seed_slot_span = SlotSpan::get_sentinel_slot_span();
@@ -540,7 +550,7 @@
 }
 
 // Test multiple allocations, and freelist handling.
-TEST_F(PartitionAllocTest, MultiAlloc) {
+TEST_P(PartitionAllocTest, MultiAlloc) {
   char* ptr1 = reinterpret_cast<char*>(
       allocator.root()->Alloc(kTestAllocSize, type_name));
   char* ptr2 = reinterpret_cast<char*>(
@@ -581,7 +591,7 @@
 }
 
 // Test a bucket with multiple slot spans.
-TEST_F(PartitionAllocTest, MultiSlotSpans) {
+TEST_P(PartitionAllocTest, MultiSlotSpans) {
   PartitionRoot<ThreadSafe>::Bucket* bucket =
       &allocator.root()->buckets[test_bucket_index_];
 
@@ -622,7 +632,7 @@
 }
 
 // Test some finer aspects of internal slot span transitions.
-TEST_F(PartitionAllocTest, SlotSpanTransitions) {
+TEST_P(PartitionAllocTest, SlotSpanTransitions) {
   PartitionRoot<ThreadSafe>::Bucket* bucket =
       &allocator.root()->buckets[test_bucket_index_];
 
@@ -683,7 +693,7 @@
 
 // Test some corner cases relating to slot span transitions in the internal
 // free slot span list metadata bucket.
-TEST_F(PartitionAllocTest, FreeSlotSpanListSlotSpanTransitions) {
+TEST_P(PartitionAllocTest, FreeSlotSpanListSlotSpanTransitions) {
   PartitionRoot<ThreadSafe>::Bucket* bucket =
       &allocator.root()->buckets[test_bucket_index_];
 
@@ -728,7 +738,7 @@
 
 // Test a large series of allocations that cross more than one underlying
 // super page.
-TEST_F(PartitionAllocTest, MultiPageAllocs) {
+TEST_P(PartitionAllocTest, MultiPageAllocs) {
   size_t num_pages_per_slot_span = GetNumPagesPerSlotSpan(kTestAllocSize);
   // 1 super page has 2 guard partition pages.
   size_t num_slot_spans_needed =
@@ -761,7 +771,7 @@
 
 // Test the generic allocation functions that can handle arbitrary sizes and
 // reallocing etc.
-TEST_F(PartitionAllocTest, Alloc) {
+TEST_P(PartitionAllocTest, Alloc) {
   void* ptr = allocator.root()->Alloc(1, type_name);
   EXPECT_TRUE(ptr);
   allocator.root()->Free(ptr);
@@ -855,7 +865,7 @@
 
 // Test the generic allocation functions can handle some specific sizes of
 // interest.
-TEST_F(PartitionAllocTest, AllocSizes) {
+TEST_P(PartitionAllocTest, AllocSizes) {
   {
     void* ptr = allocator.root()->Alloc(0, type_name);
     EXPECT_TRUE(ptr);
@@ -957,7 +967,7 @@
 }
 
 // Test that we can fetch the real allocated size after an allocation.
-TEST_F(PartitionAllocTest, AllocGetSizeAndStart) {
+TEST_P(PartitionAllocTest, AllocGetSizeAndStart) {
   void* ptr;
   size_t requested_size, actual_capacity, predicted_capacity;
 
@@ -1071,7 +1081,7 @@
 }
 
 #if BUILDFLAG(USE_BACKUP_REF_PTR)
-TEST_F(PartitionAllocTest, IsValidPtrDelta) {
+TEST_P(PartitionAllocTest, IsValidPtrDelta) {
   const size_t kMinReasonableTestSize =
       base::bits::AlignUp(kExtraAllocSize + 1, base::kAlignment);
   ASSERT_GT(kMinReasonableTestSize, kExtraAllocSize);
@@ -1150,7 +1160,7 @@
   }
 }
 
-TEST_F(PartitionAllocTest, GetSlotStartMultiplePages) {
+TEST_P(PartitionAllocTest, GetSlotStartMultiplePages) {
   const size_t real_size = 80;
   const size_t requested_size = real_size - kExtraAllocSize;
   // Double check we don't end up with 0 or negative size.
@@ -1180,7 +1190,7 @@
 #endif  // BUILDFLAG(USE_BACKUP_REF_PTR)
 
 // Test the realloc() contract.
-TEST_F(PartitionAllocTest, Realloc) {
+TEST_P(PartitionAllocTest, Realloc) {
   // realloc(0, size) should be equivalent to malloc().
   void* ptr = allocator.root()->Realloc(nullptr, kTestAllocSize, type_name);
   memset(ptr, 'A', kTestAllocSize);
@@ -1296,7 +1306,7 @@
   allocator.root()->Free(ptr3);
 }
 
-TEST_F(PartitionAllocTest, ReallocDirectMapAligned) {
+TEST_P(PartitionAllocTest, ReallocDirectMapAligned) {
   size_t alignments[] = {
       PartitionPageSize(),
       2 * PartitionPageSize(),
@@ -1347,7 +1357,7 @@
   }
 }
 
-TEST_F(PartitionAllocTest, ReallocDirectMapAlignedRelocate) {
+TEST_P(PartitionAllocTest, ReallocDirectMapAlignedRelocate) {
   // Pick size such that the alignment will put it cross the super page
   // boundary.
   size_t size = 2 * kSuperPageSize - kMaxSupportedAlignment + SystemPageSize();
@@ -1373,7 +1383,7 @@
 }
 
 // Tests the handing out of freelists for partial slot spans.
-TEST_F(PartitionAllocTest, PartialPageFreelists) {
+TEST_P(PartitionAllocTest, PartialPageFreelists) {
   size_t big_size = SystemPageSize() - kExtraAllocSize;
   size_t bucket_index = SizeToIndex(big_size + kExtraAllocSize);
   PartitionRoot<ThreadSafe>::Bucket* bucket =
@@ -1586,7 +1596,7 @@
 }
 
 // Test some of the fragmentation-resistant properties of the allocator.
-TEST_F(PartitionAllocTest, SlotSpanRefilling) {
+TEST_P(PartitionAllocTest, SlotSpanRefilling) {
   PartitionRoot<ThreadSafe>::Bucket* bucket =
       &allocator.root()->buckets[test_bucket_index_];
 
@@ -1620,7 +1630,7 @@
 }
 
 // Basic tests to ensure that allocations work for partial page buckets.
-TEST_F(PartitionAllocTest, PartialPages) {
+TEST_P(PartitionAllocTest, PartialPages) {
   // Find a size that is backed by a partial partition page.
   size_t size = sizeof(void*);
   size_t bucket_index;
@@ -1643,7 +1653,7 @@
 }
 
 // Test correct handling if our mapping collides with another.
-TEST_F(PartitionAllocTest, MappingCollision) {
+TEST_P(PartitionAllocTest, MappingCollision) {
   size_t num_pages_per_slot_span = GetNumPagesPerSlotSpan(kTestAllocSize);
   // The -2 is because the first and last partition pages in a super page are
   // guard pages.
@@ -1733,7 +1743,7 @@
 
 // Tests that slot spans in the free slot span cache do get freed as
 // appropriate.
-TEST_F(PartitionAllocTest, FreeCache) {
+TEST_P(PartitionAllocTest, FreeCache) {
   EXPECT_EQ(0U, allocator.root()->get_total_size_of_committed_pages());
 
   size_t big_size = 1000 - kExtraAllocSize;
@@ -1791,7 +1801,7 @@
 }
 
 // Tests for a bug we had with losing references to free slot spans.
-TEST_F(PartitionAllocTest, LostFreeSlotSpansBug) {
+TEST_P(PartitionAllocTest, LostFreeSlotSpansBug) {
   size_t size = PartitionPageSize() - kExtraAllocSize;
 
   void* ptr = allocator.root()->Alloc(size, type_name);
@@ -1870,6 +1880,10 @@
 // Death tests misbehave on Android, http://crbug.com/643760.
 #if defined(GTEST_HAS_DEATH_TEST) && !BUILDFLAG(IS_ANDROID)
 
+INSTANTIATE_TEST_SUITE_P(AlternateBucketDistribution,
+                         PartitionAllocDeathTest,
+                         testing::Values(false, true));
+
 // Unit tests that check if an allocation fails in "return null" mode,
 // repeating it doesn't crash, and still returns null. The tests need to
 // stress memory subsystem limits to do so, hence they try to allocate
@@ -1900,7 +1914,7 @@
 // These tests are *very* slow when DCHECK_IS_ON(), because they memset() many
 // GiB of data (see crbug.com/1168168).
 // TODO(lizeb): make these tests faster.
-TEST_F(PartitionAllocDeathTest, RepeatedAllocReturnNullDirect) {
+TEST_P(PartitionAllocDeathTest, RepeatedAllocReturnNullDirect) {
   // A direct-mapped allocation size.
   size_t direct_map_size = 32 * 1024 * 1024;
   ASSERT_GT(direct_map_size, kMaxBucketed);
@@ -1909,7 +1923,7 @@
 }
 
 // Repeating above test with Realloc
-TEST_F(PartitionAllocDeathTest, RepeatedReallocReturnNullDirect) {
+TEST_P(PartitionAllocDeathTest, RepeatedReallocReturnNullDirect) {
   size_t direct_map_size = 32 * 1024 * 1024;
   ASSERT_GT(direct_map_size, kMaxBucketed);
   EXPECT_DEATH(DoReturnNullTest(direct_map_size, kPartitionReallocFlags),
@@ -1917,7 +1931,7 @@
 }
 
 // Repeating above test with TryRealloc
-TEST_F(PartitionAllocDeathTest, RepeatedTryReallocReturnNullDirect) {
+TEST_P(PartitionAllocDeathTest, RepeatedTryReallocReturnNullDirect) {
   size_t direct_map_size = 32 * 1024 * 1024;
   ASSERT_GT(direct_map_size, kMaxBucketed);
   EXPECT_DEATH(DoReturnNullTest(direct_map_size, kPartitionRootTryRealloc),
@@ -1926,7 +1940,7 @@
 
 // See crbug.com/1187404 to re-enable the tests below.
 // Test "return null" with a 512 kB block size.
-TEST_F(PartitionAllocDeathTest, DISABLED_RepeatedAllocReturnNull) {
+TEST_P(PartitionAllocDeathTest, DISABLED_RepeatedAllocReturnNull) {
   // A single-slot but non-direct-mapped allocation size.
   size_t single_slot_size = 512 * 1024;
   ASSERT_GT(single_slot_size, MaxRegularSlotSpanSize());
@@ -1936,7 +1950,7 @@
 }
 
 // Repeating above test with Realloc.
-TEST_F(PartitionAllocDeathTest, DISABLED_RepeatedReallocReturnNull) {
+TEST_P(PartitionAllocDeathTest, DISABLED_RepeatedReallocReturnNull) {
   size_t single_slot_size = 512 * 1024;
   ASSERT_GT(single_slot_size, MaxRegularSlotSpanSize());
   ASSERT_LE(single_slot_size, kMaxBucketed);
@@ -1945,7 +1959,7 @@
 }
 
 // Repeating above test with TryRealloc.
-TEST_F(PartitionAllocDeathTest, DISABLED_RepeatedTryReallocReturnNull) {
+TEST_P(PartitionAllocDeathTest, DISABLED_RepeatedTryReallocReturnNull) {
   size_t single_slot_size = 512 * 1024;
   ASSERT_GT(single_slot_size, MaxRegularSlotSpanSize());
   ASSERT_LE(single_slot_size, kMaxBucketed);
@@ -1959,7 +1973,7 @@
 // Make sure that malloc(-1) dies.
 // In the past, we had an integer overflow that would alias malloc(-1) to
 // malloc(0), which is not good.
-TEST_F(PartitionAllocDeathTest, LargeAllocs) {
+TEST_P(PartitionAllocDeathTest, LargeAllocs) {
   // Largest alloc.
   EXPECT_DEATH(allocator.root()->Alloc(static_cast<size_t>(-1), type_name), "");
   // And the smallest allocation we expect to die.
@@ -1980,7 +1994,7 @@
     (defined(PA_HAS_64_BITS_POINTERS) && defined(ARCH_CPU_LITTLE_ENDIAN))
 
 // Check that our immediate double-free detection works.
-TEST_F(PartitionAllocDeathTest, ImmediateDoubleFree) {
+TEST_P(PartitionAllocDeathTest, ImmediateDoubleFree) {
   void* ptr = allocator.root()->Alloc(kTestAllocSize, type_name);
   EXPECT_TRUE(ptr);
   allocator.root()->Free(ptr);
@@ -1988,7 +2002,7 @@
 }
 
 // As above, but when this isn't the only slot in the span.
-TEST_F(PartitionAllocDeathTest, ImmediateDoubleFree2ndSlot) {
+TEST_P(PartitionAllocDeathTest, ImmediateDoubleFree2ndSlot) {
   void* ptr0 = allocator.root()->Alloc(kTestAllocSize, type_name);
   EXPECT_TRUE(ptr0);
   void* ptr = allocator.root()->Alloc(kTestAllocSize, type_name);
@@ -2004,7 +2018,7 @@
 // Unlike in ImmediateDoubleFree test, we can't have a 2ndSlot version, as this
 // protection wouldn't work when there is another slot present in the span. It
 // will prevent |num_allocated_slots| from going below 0.
-TEST_F(PartitionAllocDeathTest, NumAllocatedSlotsDoubleFree) {
+TEST_P(PartitionAllocDeathTest, NumAllocatedSlotsDoubleFree) {
   void* ptr = allocator.root()->Alloc(kTestAllocSize, type_name);
   EXPECT_TRUE(ptr);
   void* ptr2 = allocator.root()->Alloc(kTestAllocSize, type_name);
@@ -2021,7 +2035,7 @@
         // (defined(PA_HAS_64_BITS_POINTERS) && defined(ARCH_CPU_LITTLE_ENDIAN))
 
 // Check that guard pages are present where expected.
-TEST_F(PartitionAllocDeathTest, DirectMapGuardPages) {
+TEST_P(PartitionAllocDeathTest, DirectMapGuardPages) {
   const size_t kSizes[] = {
       kMaxBucketed + kExtraAllocSize + 1, kMaxBucketed + SystemPageSize(),
       kMaxBucketed + PartitionPageSize(),
@@ -2045,7 +2059,7 @@
 }
 
 #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)) && defined(ARCH_CPU_ARM64)
-TEST_F(PartitionAllocTest, MTEProtectsFreedPtr) {
+TEST_P(PartitionAllocTest, MTEProtectsFreedPtr) {
   // This test checks that Arm's memory tagging extension is correctly
   // protecting freed pointers. Writes to a freed pointer should cause a crash.
   CPU cpu;
@@ -2081,7 +2095,7 @@
 // These tests rely on precise layout. They handle cookie, not ref-count.
 #if !BUILDFLAG(USE_BACKUP_REF_PTR) && defined(PA_HAS_FREELIST_SHADOW_ENTRY)
 
-TEST_F(PartitionAllocDeathTest, UseAfterFreeDetection) {
+TEST_P(PartitionAllocDeathTest, UseAfterFreeDetection) {
   CPU cpu;
   void* data = allocator.root()->Alloc(100, "");
   allocator.root()->Free(data);
@@ -2092,7 +2106,7 @@
   EXPECT_DEATH(allocator.root()->Alloc(100, ""), "");
 }
 
-TEST_F(PartitionAllocDeathTest, FreelistCorruption) {
+TEST_P(PartitionAllocDeathTest, FreelistCorruption) {
   CPU cpu;
   const size_t alloc_size = 2 * sizeof(void*);
   void** fake_freelist_entry =
@@ -2116,7 +2130,7 @@
 
 // With DCHECK_IS_ON(), cookie already handles off-by-one detection.
 #if !DCHECK_IS_ON()
-TEST_F(PartitionAllocDeathTest, OffByOneDetection) {
+TEST_P(PartitionAllocDeathTest, OffByOneDetection) {
   CPU cpu;
   const size_t alloc_size = 2 * sizeof(void*);
   char* array = static_cast<char*>(allocator.root()->Alloc(alloc_size, ""));
@@ -2139,7 +2153,7 @@
   }
 }
 
-TEST_F(PartitionAllocDeathTest, OffByOneDetectionWithRealisticData) {
+TEST_P(PartitionAllocDeathTest, OffByOneDetectionWithRealisticData) {
   CPU cpu;
   const size_t alloc_size = 2 * sizeof(void*);
   void** array = static_cast<void**>(allocator.root()->Alloc(alloc_size, ""));
@@ -2166,7 +2180,7 @@
 
 // Tests that |PartitionDumpStats| and |PartitionDumpStats| run without
 // crashing and return non-zero values when memory is allocated.
-TEST_F(PartitionAllocTest, DumpMemoryStats) {
+TEST_P(PartitionAllocTest, DumpMemoryStats) {
   {
     void* ptr = allocator.root()->Alloc(kTestAllocSize, type_name);
     MockPartitionStatsDumper mock_stats_dumper;
@@ -2427,7 +2441,7 @@
 }
 
 // Tests the API to purge freeable memory.
-TEST_F(PartitionAllocTest, Purge) {
+TEST_P(PartitionAllocTest, Purge) {
   char* ptr = reinterpret_cast<char*>(
       allocator.root()->Alloc(2048 - kExtraAllocSize, type_name));
   allocator.root()->Free(ptr);
@@ -2476,7 +2490,7 @@
 // Tests that we prefer to allocate into a non-empty partition page over an
 // empty one. This is an important aspect of minimizing memory usage for some
 // allocation sizes, particularly larger ones.
-TEST_F(PartitionAllocTest, PreferActiveOverEmpty) {
+TEST_P(PartitionAllocTest, PreferActiveOverEmpty) {
   size_t size = (SystemPageSize() * 2) - kExtraAllocSize;
   // Allocate 3 full slot spans worth of 8192-byte allocations.
   // Each slot span for this size is 16384 bytes, or 1 partition page and 2
@@ -2528,7 +2542,7 @@
 }
 
 // Tests the API to purge discardable memory.
-TEST_F(PartitionAllocTest, PurgeDiscardableSecondPage) {
+TEST_P(PartitionAllocTest, PurgeDiscardableSecondPage) {
   // Free the second of two 4096 byte allocations and then purge.
   void* ptr1 =
       allocator.root()->Alloc(SystemPageSize() - kExtraAllocSize, type_name);
@@ -2562,7 +2576,7 @@
   allocator.root()->Free(ptr1);
 }
 
-TEST_F(PartitionAllocTest, PurgeDiscardableFirstPage) {
+TEST_P(PartitionAllocTest, PurgeDiscardableFirstPage) {
   // Free the first of two 4096 byte allocations and then purge.
   char* ptr1 = reinterpret_cast<char*>(
       allocator.root()->Alloc(SystemPageSize() - kExtraAllocSize, type_name));
@@ -2595,7 +2609,7 @@
   allocator.root()->Free(ptr2);
 }
 
-TEST_F(PartitionAllocTest, PurgeDiscardableNonPageSizedAlloc) {
+TEST_P(PartitionAllocTest, PurgeDiscardableNonPageSizedAlloc) {
   const size_t requested_size = 2.5 * SystemPageSize();
   char* ptr1 = reinterpret_cast<char*>(
       allocator.root()->Alloc(requested_size - kExtraAllocSize, type_name));
@@ -2640,7 +2654,7 @@
   allocator.root()->Free(ptr4);
 }
 
-TEST_F(PartitionAllocTest, PurgeDiscardableManyPages) {
+TEST_P(PartitionAllocTest, PurgeDiscardableManyPages) {
   // On systems with large pages, use less pages because:
   // 1) There must be a bucket for kFirstAllocPages * SystemPageSize(), and
   // 2) On low-end systems, using too many large pages can OOM during the test
@@ -2685,7 +2699,7 @@
     CHECK_PAGE_IN_CORE(p.PageAtIndex(i), false);
 }
 
-TEST_F(PartitionAllocTest, PurgeDiscardableWithFreeListRewrite) {
+TEST_P(PartitionAllocTest, PurgeDiscardableWithFreeListRewrite) {
   // This sub-test tests truncation of the provisioned slots in a trickier
   // case where the freelist is rewritten.
   allocator.root()->PurgeMemory(PartitionPurgeDecommitEmptySlotSpans);
@@ -2753,7 +2767,7 @@
   allocator.root()->Free(ptr3);
 }
 
-TEST_F(PartitionAllocTest, PurgeDiscardableDoubleTruncateFreeList) {
+TEST_P(PartitionAllocTest, PurgeDiscardableDoubleTruncateFreeList) {
   // This sub-test is similar, but tests a double-truncation.
   allocator.root()->PurgeMemory(PartitionPurgeDecommitEmptySlotSpans);
   char* ptr1 = reinterpret_cast<char*>(
@@ -2807,7 +2821,7 @@
   allocator.root()->Free(ptr2);
 }
 
-TEST_F(PartitionAllocTest, ReallocMovesCookie) {
+TEST_P(PartitionAllocTest, ReallocMovesCookie) {
   // Resize so as to be sure to hit a "resize in place" case, and ensure that
   // use of the entire result is compatible with the debug mode's cookie, even
   // when the bucket size is large enough to span more than one partition page
@@ -2824,7 +2838,7 @@
   allocator.root()->Free(ptr);
 }
 
-TEST_F(PartitionAllocTest, SmallReallocDoesNotMoveTrailingCookie) {
+TEST_P(PartitionAllocTest, SmallReallocDoesNotMoveTrailingCookie) {
   // For crbug.com/781473
   static constexpr size_t kSize = 264;
   void* ptr = allocator.root()->Alloc(kSize, type_name);
@@ -2836,7 +2850,7 @@
   allocator.root()->Free(ptr);
 }
 
-TEST_F(PartitionAllocTest, ZeroFill) {
+TEST_P(PartitionAllocTest, ZeroFill) {
   constexpr static size_t kAllZerosSentinel =
       std::numeric_limits<size_t>::max();
   for (size_t size : kTestSizes) {
@@ -2860,7 +2874,7 @@
   }
 }
 
-TEST_F(PartitionAllocTest, Bug_897585) {
+TEST_P(PartitionAllocTest, Bug_897585) {
   // Need sizes big enough to be direct mapped and a delta small enough to
   // allow re-use of the slot span when cookied. These numbers fall out of the
   // test case in the indicated bug.
@@ -2878,7 +2892,7 @@
   allocator.root()->Free(ptr);
 }
 
-TEST_F(PartitionAllocTest, OverrideHooks) {
+TEST_P(PartitionAllocTest, OverrideHooks) {
   constexpr size_t kOverriddenSize = 1234;
   constexpr const char* kOverriddenType = "Overridden type";
   constexpr unsigned char kOverriddenChar = 'A';
@@ -2886,7 +2900,8 @@
   // Marked static so that we can use them in non-capturing lambdas below.
   // (Non-capturing lambdas convert directly to function pointers.)
   static volatile bool free_called = false;
-  static void* overridden_allocation = malloc(kOverriddenSize);
+  static void* overridden_allocation = nullptr;
+  overridden_allocation = malloc(kOverriddenSize);
   memset(overridden_allocation, kOverriddenChar, kOverriddenSize);
 
   PartitionAllocHooks::SetOverrideHooks(
@@ -2934,7 +2949,7 @@
   free(overridden_allocation);
 }
 
-TEST_F(PartitionAllocTest, Alignment) {
+TEST_P(PartitionAllocTest, Alignment) {
   std::vector<void*> allocated_ptrs;
 
   for (size_t size = 1; size <= base::PartitionPageSize(); size <<= 1) {
@@ -2963,7 +2978,7 @@
     allocator.root()->Free(ptr);
 }
 
-TEST_F(PartitionAllocTest, FundamentalAlignment) {
+TEST_P(PartitionAllocTest, FundamentalAlignment) {
   // See the test above for details. Essentially, checking the bucket size is
   // sufficient to ensure that alignment will always be respected, as long as
   // the fundamental alignment is <= 16 bytes.
@@ -3020,7 +3035,7 @@
     PartitionRoot<ThreadSafe>::Free(ptr);
 }
 
-TEST_F(PartitionAllocTest, AlignedAllocations) {
+TEST_P(PartitionAllocTest, AlignedAllocations) {
   size_t alloc_sizes[] = {1,
                           10,
                           100,
@@ -3051,7 +3066,7 @@
 
 // Test that the optimized `GetSlotNumber` implementation produces valid
 // results.
-TEST_F(PartitionAllocTest, OptimizedGetSlotNumber) {
+TEST_P(PartitionAllocTest, OptimizedGetSlotNumber) {
   for (size_t i = 0; i < kNumBuckets; ++i) {
     auto& bucket = allocator.root()->buckets[i];
     if (SizeToIndex(bucket.slot_size) != i)
@@ -3065,11 +3080,11 @@
   }
 }
 
-TEST_F(PartitionAllocTest, GetUsableSizeNull) {
+TEST_P(PartitionAllocTest, GetUsableSizeNull) {
   EXPECT_EQ(0ULL, PartitionRoot<ThreadSafe>::GetUsableSize(nullptr));
 }
 
-TEST_F(PartitionAllocTest, GetUsableSize) {
+TEST_P(PartitionAllocTest, GetUsableSize) {
   size_t delta = SystemPageSize() + 1;
   for (size_t size = 1; size <= kMinDirectMappedDownsize; size += delta) {
     void* ptr = allocator.root()->Alloc(size, "");
@@ -3082,7 +3097,7 @@
   }
 }
 
-TEST_F(PartitionAllocTest, Bookkeeping) {
+TEST_P(PartitionAllocTest, Bookkeeping) {
   auto& root = *allocator.root();
 
   EXPECT_EQ(0U, root.total_size_of_committed_pages);
@@ -3327,7 +3342,7 @@
 
 #if BUILDFLAG(USE_BACKUP_REF_PTR)
 
-TEST_F(PartitionAllocTest, RefCountBasic) {
+TEST_P(PartitionAllocTest, RefCountBasic) {
   constexpr uint64_t kCookie = 0x1234567890ABCDEF;
   constexpr uint64_t kQuarantined = 0xEFEFEFEFEFEFEFEF;
 
@@ -3421,7 +3436,7 @@
   allocator.root()->Free(ptr2);
 }
 
-TEST_F(PartitionAllocTest, RefCountRealloc) {
+TEST_P(PartitionAllocTest, RefCountRealloc) {
   size_t alloc_sizes[] = {500, 5000, 50000, 400000};
 
   for (size_t alloc_size : alloc_sizes) {
@@ -3435,7 +3450,7 @@
 
 #endif  // BUILDFLAG(USE_BACKUP_REF_PTR)
 
-TEST_F(PartitionAllocTest, ReservationOffset) {
+TEST_P(PartitionAllocTest, ReservationOffset) {
   // For normal buckets, offset should be kOffsetTagNormalBuckets.
   void* ptr = allocator.root()->Alloc(kTestAllocSize, type_name);
   EXPECT_TRUE(ptr);
@@ -3481,7 +3496,7 @@
             *ReservationOffsetPointer(ptr_as_uintptr + kSuperPageSize * 5));
 }
 
-TEST_F(PartitionAllocTest, GetReservationStart) {
+TEST_P(PartitionAllocTest, GetReservationStart) {
   size_t large_size = kSuperPageSize * 3 + PartitionPageSize() * .5f;
   ASSERT_GT(large_size, kMaxBucketed);
   void* ptr = allocator.root()->Alloc(large_size, type_name);
@@ -3502,7 +3517,7 @@
   allocator.root()->Free(ptr);
 }
 
-TEST_F(PartitionAllocTest, CheckReservationType) {
+TEST_P(PartitionAllocTest, CheckReservationType) {
   void* ptr = allocator.root()->Alloc(kTestAllocSize, type_name);
   EXPECT_TRUE(ptr);
   uintptr_t address = reinterpret_cast<uintptr_t>(ptr);
@@ -3567,7 +3582,7 @@
 }
 
 // Test for crash http://crbug.com/1169003.
-TEST_F(PartitionAllocTest, CrossPartitionRootRealloc) {
+TEST_P(PartitionAllocTest, CrossPartitionRootRealloc) {
   // Size is large enough to satisfy it from a single-slot slot span
   size_t test_size = MaxRegularSlotSpanSize() - kExtraAllocSize;
   void* ptr = allocator.root()->AllocFlags(PartitionAllocReturnNull, test_size,
@@ -3593,7 +3608,7 @@
   PA_EXPECT_PTR_NE(ptr, ptr2);
 }
 
-TEST_F(PartitionAllocTest, FastPathOrReturnNull) {
+TEST_P(PartitionAllocTest, FastPathOrReturnNull) {
   size_t allocation_size = 64;
   // The very first allocation is never a fast path one, since it needs a new
   // super page and a new partition page.
@@ -3632,7 +3647,7 @@
 #if defined(GTEST_HAS_DEATH_TEST) && !BUILDFLAG(IS_ANDROID)
 #if !defined(OFFICIAL_BUILD) || !defined(NDEBUG)
 
-TEST_F(PartitionAllocDeathTest, CheckTriggered) {
+TEST_P(PartitionAllocDeathTest, CheckTriggered) {
   using ::testing::ContainsRegex;
 #if DCHECK_IS_ON()
   EXPECT_DEATH(PA_CHECK(5 == 7), ContainsRegex("Check failed.*5 == 7"));
@@ -3670,7 +3685,7 @@
 // Disabled because executing it causes Gtest to show a warning in the output,
 // which confuses the runner on some platforms, making the test report an
 // "UNKNOWN" status even though it succeeded.
-TEST_F(PartitionAllocTest, DISABLED_PreforkHandler) {
+TEST_P(PartitionAllocTest, DISABLED_PreforkHandler) {
   std::atomic<bool> please_stop;
   std::atomic<int> started_threads{0};
 
@@ -3719,7 +3734,7 @@
         // !BUILDFLAG(IS_CHROMECAST)
 
 // Checks the bucket index logic.
-TEST_F(PartitionAllocTest, GetIndex) {
+TEST_P(PartitionAllocTest, GetIndex) {
   BucketIndexLookup lookup{};
 
   for (size_t size = 0; size < kMaxBucketed; size++) {
@@ -3737,7 +3752,7 @@
 
 // Used to check alignment. If the compiler understands the annotations, the
 // zeroing in the constructor uses aligned SIMD instructions.
-TEST_F(PartitionAllocTest, MallocFunctionAnnotations) {
+TEST_P(PartitionAllocTest, MallocFunctionAnnotations) {
   struct TestStruct {
     uint64_t a = 0;
     uint64_t b = 0;
@@ -3752,7 +3767,7 @@
 }
 
 // Test that the ConfigurablePool works properly.
-TEST_F(PartitionAllocTest, ConfigurablePool) {
+TEST_P(PartitionAllocTest, ConfigurablePool) {
   EXPECT_FALSE(IsConfigurablePoolAvailable());
 
   // The rest is only applicable to 64-bit mode
@@ -3801,7 +3816,7 @@
 #endif  // defined(ARCH_CPU_64_BITS)
 }
 
-TEST_F(PartitionAllocTest, EmptySlotSpanSizeIsCapped) {
+TEST_P(PartitionAllocTest, EmptySlotSpanSizeIsCapped) {
   // Use another root, since the ones from the test harness disable the empty
   // slot span size cap.
   PartitionRoot<ThreadSafe> root;
@@ -3860,7 +3875,7 @@
     root.Free(ptr);
 }
 
-TEST_F(PartitionAllocTest, IncreaseEmptySlotSpanRingSize) {
+TEST_P(PartitionAllocTest, IncreaseEmptySlotSpanRingSize) {
   PartitionRoot<ThreadSafe> root({
       PartitionOptions::AlignedAlloc::kDisallowed,
       PartitionOptions::ThreadCache::kDisabled,
@@ -3930,14 +3945,14 @@
 void* __real_malloc(size_t);
 }  // extern "C"
 
-TEST_F(PartitionAllocTest, HandleMixedAllocations) {
+TEST_P(PartitionAllocTest, HandleMixedAllocations) {
   void* ptr = __real_malloc(12);
   // Should not crash, no test assertion.
   free(ptr);
 }
 #endif
 
-TEST_F(PartitionAllocTest, SortFreelist) {
+TEST_P(PartitionAllocTest, SortFreelist) {
   const size_t count = 100;
   const size_t allocation_size = 1;
   void* first_ptr = allocator.root()->Alloc(allocation_size, "");
@@ -3995,7 +4010,7 @@
 
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && BUILDFLAG(IS_LINUX) && \
     defined(ARCH_CPU_64_BITS)
-TEST_F(PartitionAllocTest, CrashOnUnknownPointer) {
+TEST_P(PartitionAllocTest, CrashOnUnknownPointer) {
   int not_a_heap_object = 42;
   EXPECT_DEATH(
       allocator.root()->Free(reinterpret_cast<void*>(&not_a_heap_object)), "");
@@ -4089,7 +4104,7 @@
 // On macOS 10.11, allocations are made with PartitionAlloc, but the pointer
 // is incorrectly passed by CoreFoundation to the previous default zone,
 // causing crashes. This is intended to detect these issues coming back.
-TEST_F(PartitionAllocTest, OpenCL) {
+TEST_P(PartitionAllocTest, OpenCL) {
   // Skip on 10.11, as it fails there.
   // TODO(crbug.com/1268776): Make it pass on macOS 10.11.
   if (base::mac::IsOS10_11())
diff --git a/base/allocator/partition_allocator/partition_bucket_lookup.h b/base/allocator/partition_allocator/partition_bucket_lookup.h
index 483cf55..83001bb 100644
--- a/base/allocator/partition_allocator/partition_bucket_lookup.h
+++ b/base/allocator/partition_allocator/partition_bucket_lookup.h
@@ -104,6 +104,7 @@
 // The class used to generate the bucket lookup table at compile-time.
 class BucketIndexLookup final {
  public:
+  ALWAYS_INLINE constexpr static size_t GetIndexForDenserBuckets(size_t size);
   ALWAYS_INLINE constexpr static size_t GetIndex(size_t size);
 
   constexpr BucketIndexLookup() {
@@ -201,8 +202,53 @@
       bucket_index_lookup_[((kBitsPerSizeT + 1) * kNumBucketsPerOrder) + 1]{};
 };
 
+ALWAYS_INLINE constexpr size_t RoundUpToPowerOfTwo(size_t size) {
+  const size_t n = 1 << bits::Log2Ceiling(static_cast<uint32_t>(size));
+  PA_DCHECK(size <= n);
+  return n;
+}
+
+ALWAYS_INLINE constexpr size_t RoundUpSize(size_t size) {
+  const size_t next_power = RoundUpToPowerOfTwo(size);
+  const size_t prev_power = next_power >> 1;
+  PA_DCHECK(size <= next_power);
+  PA_DCHECK(prev_power < size);
+  if (size <= prev_power * 5 / 4) {
+    return prev_power * 5 / 4;
+  } else {
+    return next_power;
+  }
+}
+
 // static
 ALWAYS_INLINE constexpr size_t BucketIndexLookup::GetIndex(size_t size) {
+  // For any order 2^N, under the denser bucket distribution ("Distribution A"),
+  // we have 4 evenly distributed buckets: 2^N, 1.25*2^N, 1.5*2^N, and 1.75*2^N.
+  // These numbers represent the maximum size of an allocation that can go into
+  // a given bucket.
+  //
+  // Under the less dense bucket distribution ("Distribution B"), we only have
+  // 2 buckets for the same order 2^N: 2^N and 1.25*2^N.
+  //
+  // Everything that would be mapped to the last two buckets of an order under
+  // Distribution A is instead mapped to the first bucket of the next order
+  // under Distribution B. The following diagram shows roughly what this looks
+  // like for the order starting from 2^10, as an example.
+  //
+  // A: ... | 2^10 | 1.25*2^10 | 1.5*2^10 | 1.75*2^10 | 2^11 | ...
+  // B: ... | 2^10 | 1.25*2^10 | -------- | --------- | 2^11 | ...
+  //
+  // So, an allocation of size 1.4*2^10 would go into the 1.5*2^10 bucket under
+  // Distribution A, but to the 2^11 bucket under Distribution B.
+  if (1 << 8 < size && size < 1 << 19)
+    return BucketIndexLookup::GetIndexForDenserBuckets(RoundUpSize(size));
+  else
+    return BucketIndexLookup::GetIndexForDenserBuckets(size);
+}
+
+// static
+ALWAYS_INLINE constexpr size_t BucketIndexLookup::GetIndexForDenserBuckets(
+    size_t size) {
   // This forces the bucket table to be constant-initialized and immediately
   // materialized in the binary.
   constexpr BucketIndexLookup lookup{};
diff --git a/base/allocator/partition_allocator/partition_root.h b/base/allocator/partition_allocator/partition_root.h
index 193e066..9f6a766 100644
--- a/base/allocator/partition_allocator/partition_root.h
+++ b/base/allocator/partition_allocator/partition_root.h
@@ -208,6 +208,7 @@
       ScanMode scan_mode;
 
       bool with_thread_cache = false;
+      bool with_denser_bucket_distribution = false;
 
       bool allow_aligned_alloc;
       bool allow_cookie;
@@ -450,7 +451,8 @@
   static void DeleteForTesting(PartitionRoot* partition_root);
   void ResetBookkeepingForTesting();
 
-  static uint16_t SizeToBucketIndex(size_t size);
+  static uint16_t SizeToBucketIndex(size_t size,
+                                    bool with_denser_bucket_distribution);
 
   ALWAYS_INLINE void FreeInSlotSpan(uintptr_t slot_start, SlotSpan* slot_span)
       EXCLUSIVE_LOCKS_REQUIRED(lock_);
@@ -468,6 +470,21 @@
   ALWAYS_INLINE void RawFreeWithThreadCache(uintptr_t slot_start,
                                             SlotSpan* slot_span);
 
+  // This is safe to do because we are switching to a bucket distribution with
+  // more buckets, meaning any allocations we have done before the switch are
+  // guaranteed to have a bucket under the new distribution when they are
+  // eventually deallocated. We do not need synchronization here or below.
+  void SwitchToDenserBucketDistribution() {
+    with_denser_bucket_distribution = true;
+  }
+  // Switching back to the less dense bucket distribution is ok during tests.
+  // At worst, we end up with deallocations that are sent to a bucket that we
+  // cannot allocate from, which will not cause problems besides wasting
+  // memory.
+  void ResetBucketDistributionForTesting() {
+    with_denser_bucket_distribution = false;
+  }
+
   internal::ThreadCache* thread_cache_for_testing() const {
     return with_thread_cache ? internal::ThreadCache::Get() : nullptr;
   }
@@ -1425,9 +1442,13 @@
 
 // static
 template <bool thread_safe>
-ALWAYS_INLINE uint16_t
-PartitionRoot<thread_safe>::SizeToBucketIndex(size_t size) {
-  return internal::BucketIndexLookup::GetIndex(size);
+ALWAYS_INLINE uint16_t PartitionRoot<thread_safe>::SizeToBucketIndex(
+    size_t size,
+    bool with_denser_bucket_distribution) {
+  if (with_denser_bucket_distribution)
+    return internal::BucketIndexLookup::GetIndexForDenserBuckets(size);
+  else
+    return internal::BucketIndexLookup::GetIndex(size);
 }
 
 template <bool thread_safe>
@@ -1504,7 +1525,12 @@
   size_t raw_size = AdjustSizeForExtrasAdd(requested_size);
   PA_CHECK(raw_size >= requested_size);  // check for overflows
 
-  uint16_t bucket_index = SizeToBucketIndex(raw_size);
+  // We should only call |SizeToBucketIndex| at most once when allocating.
+  // Otherwise, we risk having |with_denser_bucket_distribution| changed
+  // underneath us (between calls to |SizeToBucketIndex| during the same call),
+  // which would result in an inconsistent state.
+  uint16_t bucket_index =
+      SizeToBucketIndex(raw_size, with_denser_bucket_distribution);
   size_t usable_size;
   bool is_already_zeroed = false;
   uintptr_t slot_start = 0;
@@ -1791,7 +1817,8 @@
 #else
   PA_DCHECK(PartitionRoot<thread_safe>::initialized);
   size = AdjustSizeForExtrasAdd(size);
-  auto& bucket = bucket_at(SizeToBucketIndex(size));
+  auto& bucket =
+      bucket_at(SizeToBucketIndex(size, with_denser_bucket_distribution));
   PA_DCHECK(!bucket.slot_size || bucket.slot_size >= size);
   PA_DCHECK(!(bucket.slot_size % kSmallestBucket));
 
diff --git a/base/allocator/partition_allocator/starscan/pcscan_unittest.cc b/base/allocator/partition_allocator/starscan/pcscan_unittest.cc
index e0a4608a..7ab4035b 100644
--- a/base/allocator/partition_allocator/starscan/pcscan_unittest.cc
+++ b/base/allocator/partition_allocator/starscan/pcscan_unittest.cc
@@ -74,6 +74,7 @@
         PartitionOptions::UseConfigurablePool::kNo,
     });
     allocator_.root()->UncapEmptySlotSpanMemoryForTesting();
+    allocator_.root()->SwitchToDenserBucketDistribution();
 
     PCScan::RegisterScannableRoot(allocator_.root());
   }
@@ -142,7 +143,8 @@
   CHECK_EQ(0u, root.get_total_size_of_committed_pages());
 
   const size_t raw_size = root.AdjustSizeForExtrasAdd(object_size);
-  const size_t bucket_index = root.SizeToBucketIndex(raw_size);
+  const size_t bucket_index =
+      root.SizeToBucketIndex(raw_size, root.with_denser_bucket_distribution);
   ThreadSafePartitionRoot::Bucket& bucket = root.buckets[bucket_index];
   const size_t num_slots = (bucket.get_bytes_per_span()) / bucket.slot_size;
 
diff --git a/base/allocator/partition_allocator/thread_cache.cc b/base/allocator/partition_allocator/thread_cache.cc
index 4f373f6..d8497014 100644
--- a/base/allocator/partition_allocator/thread_cache.cc
+++ b/base/allocator/partition_allocator/thread_cache.cc
@@ -398,7 +398,7 @@
   if (size > ThreadCache::kLargeSizeThreshold)
     size = ThreadCache::kLargeSizeThreshold;
   largest_active_bucket_index_ =
-      PartitionRoot<internal::ThreadSafe>::SizeToBucketIndex(size);
+      PartitionRoot<internal::ThreadSafe>::SizeToBucketIndex(size, false);
   PA_CHECK(largest_active_bucket_index_ < kBucketCount);
   ThreadCacheRegistry::Instance().SetLargestActiveBucketIndex(
       largest_active_bucket_index_);
@@ -422,8 +422,8 @@
   bool already_zeroed;
 
   auto* bucket =
-      root->buckets +
-      PartitionRoot<internal::ThreadSafe>::SizeToBucketIndex(raw_size);
+      root->buckets + PartitionRoot<internal::ThreadSafe>::SizeToBucketIndex(
+                          raw_size, root->with_denser_bucket_distribution);
   uintptr_t buffer =
       root->RawAlloc(bucket, PartitionAllocZeroFill, raw_size,
                      PartitionPageSize(), &usable_size, &already_zeroed);
diff --git a/base/allocator/partition_allocator/thread_cache_unittest.cc b/base/allocator/partition_allocator/thread_cache_unittest.cc
index 9c369cf3..80f49e55 100644
--- a/base/allocator/partition_allocator/thread_cache_unittest.cc
+++ b/base/allocator/partition_allocator/thread_cache_unittest.cc
@@ -95,7 +95,7 @@
 
 }  // namespace
 
-class PartitionAllocThreadCacheTest : public ::testing::Test {
+class PartitionAllocThreadCacheTest : public ::testing::TestWithParam<bool> {
  public:
   PartitionAllocThreadCacheTest() : root_(CreatePartitionRoot()) {}
 
@@ -112,6 +112,11 @@
 
  protected:
   void SetUp() override {
+    if (!GetParam())
+      root_->SwitchToDenserBucketDistribution();
+    else
+      root_->ResetBucketDistributionForTesting();
+
 #if defined(PA_HAS_64_BITS_POINTERS)
     // Another test can uninitialize the pools, so make sure they are
     // initialized.
@@ -135,8 +140,17 @@
     tcache->ResetForTesting();
   }
 
+  void TearDown() override {
+    auto* tcache = root_->thread_cache_for_testing();
+    ASSERT_TRUE(tcache);
+    tcache->Purge();
+
+    ASSERT_EQ(root_->get_total_size_of_allocated_bytes(), sizeof(ThreadCache));
+  }
+
   size_t FillThreadCacheAndReturnIndex(size_t size, size_t count = 1) {
-    uint16_t bucket_index = PartitionRoot<ThreadSafe>::SizeToBucketIndex(size);
+    uint16_t bucket_index =
+        PartitionRoot<ThreadSafe>::SizeToBucketIndex(size, GetParam());
     std::vector<void*> allocated_data;
 
     for (size_t i = 0; i < count; ++i) {
@@ -167,7 +181,11 @@
   ThreadSafePartitionRoot* root_;
 };
 
-TEST_F(PartitionAllocThreadCacheTest, Simple) {
+INSTANTIATE_TEST_SUITE_P(AlternateBucketDistribution,
+                         PartitionAllocThreadCacheTest,
+                         ::testing::Values(false, true));
+
+TEST_P(PartitionAllocThreadCacheTest, Simple) {
   // There is a cache.
   auto* tcache = root_->thread_cache_for_testing();
   EXPECT_TRUE(tcache);
@@ -176,7 +194,8 @@
   void* ptr = root_->Alloc(kSmallSize, "");
   ASSERT_TRUE(ptr);
 
-  uint16_t index = PartitionRoot<ThreadSafe>::SizeToBucketIndex(kSmallSize);
+  uint16_t index =
+      PartitionRoot<ThreadSafe>::SizeToBucketIndex(kSmallSize, GetParam());
   EXPECT_EQ(kFillCountForSmallBucket - 1,
             tcache->bucket_count_for_testing(index));
 
@@ -196,7 +215,7 @@
   root_->Free(ptr2);
 }
 
-TEST_F(PartitionAllocThreadCacheTest, InexactSizeMatch) {
+TEST_P(PartitionAllocThreadCacheTest, InexactSizeMatch) {
   void* ptr = root_->Alloc(kSmallSize, "");
   ASSERT_TRUE(ptr);
 
@@ -204,7 +223,8 @@
   auto* tcache = root_->thread_cache_for_testing();
   EXPECT_TRUE(tcache);
 
-  uint16_t index = PartitionRoot<ThreadSafe>::SizeToBucketIndex(kSmallSize);
+  uint16_t index =
+      PartitionRoot<ThreadSafe>::SizeToBucketIndex(kSmallSize, GetParam());
   EXPECT_EQ(kFillCountForSmallBucket - 1,
             tcache->bucket_count_for_testing(index));
 
@@ -218,9 +238,10 @@
   // Allocated from the thread cache.
   EXPECT_EQ(kFillCountForSmallBucket - 1,
             tcache->bucket_count_for_testing(index));
+  root_->Free(ptr2);
 }
 
-TEST_F(PartitionAllocThreadCacheTest, MultipleObjectsCachedPerBucket) {
+TEST_P(PartitionAllocThreadCacheTest, MultipleObjectsCachedPerBucket) {
   auto* tcache = root_->thread_cache_for_testing();
   DeltaCounter batch_fill_counter{tcache->stats_.batch_fill_count};
   size_t bucket_index =
@@ -232,13 +253,13 @@
   EXPECT_EQ(2u, batch_fill_counter.Delta());
 }
 
-TEST_F(PartitionAllocThreadCacheTest, ObjectsCachedCountIsLimited) {
+TEST_P(PartitionAllocThreadCacheTest, ObjectsCachedCountIsLimited) {
   size_t bucket_index = FillThreadCacheAndReturnIndex(kMediumSize, 1000);
   auto* tcache = root_->thread_cache_for_testing();
   EXPECT_LT(tcache->bucket_count_for_testing(bucket_index), 1000u);
 }
 
-TEST_F(PartitionAllocThreadCacheTest, Purge) {
+TEST_P(PartitionAllocThreadCacheTest, Purge) {
   size_t allocations = 10;
   size_t bucket_index = FillThreadCacheAndReturnIndex(kMediumSize, allocations);
   auto* tcache = root_->thread_cache_for_testing();
@@ -249,7 +270,7 @@
   EXPECT_EQ(0u, tcache->bucket_count_for_testing(bucket_index));
 }
 
-TEST_F(PartitionAllocThreadCacheTest, NoCrossPartitionCache) {
+TEST_P(PartitionAllocThreadCacheTest, NoCrossPartitionCache) {
   ThreadSafePartitionRoot root({
       PartitionOptions::AlignedAlloc::kAllowed,
       PartitionOptions::ThreadCache::kDisabled,
@@ -274,7 +295,7 @@
 
 #if defined(PA_ENABLE_THREAD_CACHE_STATISTICS)  // Required to record hits and
                                                 // misses.
-TEST_F(PartitionAllocThreadCacheTest, LargeAllocationsAreNotCached) {
+TEST_P(PartitionAllocThreadCacheTest, LargeAllocationsAreNotCached) {
   auto* tcache = root_->thread_cache_for_testing();
   DeltaCounter alloc_miss_counter{tcache->stats_.alloc_misses};
   DeltaCounter alloc_miss_too_large_counter{
@@ -291,7 +312,7 @@
 }
 #endif  // defined(PA_ENABLE_THREAD_CACHE_STATISTICS)
 
-TEST_F(PartitionAllocThreadCacheTest, DirectMappedAllocationsAreNotCached) {
+TEST_P(PartitionAllocThreadCacheTest, DirectMappedAllocationsAreNotCached) {
   FillThreadCacheAndReturnIndex(1024 * 1024);
   // The line above would crash due to out of bounds access if this wasn't
   // properly handled.
@@ -299,7 +320,7 @@
 
 // This tests that Realloc properly handles bookkeeping, specifically the path
 // that reallocates in place.
-TEST_F(PartitionAllocThreadCacheTest, DirectMappedReallocMetrics) {
+TEST_P(PartitionAllocThreadCacheTest, DirectMappedReallocMetrics) {
   root_->ResetBookkeepingForTesting();
 
   size_t expected_allocated_size = root_->get_total_size_of_allocated_bytes();
@@ -328,7 +349,7 @@
   root_->Free(ptr);
 }
 
-TEST_F(PartitionAllocThreadCacheTest, MultipleThreadCaches) {
+TEST_P(PartitionAllocThreadCacheTest, MultipleThreadCaches) {
   FillThreadCacheAndReturnIndex(kMediumSize);
   auto* parent_thread_tcache = root_->thread_cache_for_testing();
   ASSERT_TRUE(parent_thread_tcache);
@@ -347,7 +368,7 @@
   PlatformThread::Join(thread_handle);
 }
 
-TEST_F(PartitionAllocThreadCacheTest, ThreadCacheReclaimedWhenThreadExits) {
+TEST_P(PartitionAllocThreadCacheTest, ThreadCacheReclaimedWhenThreadExits) {
   // Make sure that there is always at least one object allocated in the test
   // bucket, so that the PartitionPage is no reclaimed.
   //
@@ -390,7 +411,7 @@
 #define MAYBE_ThreadCacheRegistry ThreadCacheRegistry
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && BUILDFLAG(IS_ANDROID)
 
-TEST_F(PartitionAllocThreadCacheTest, MAYBE_ThreadCacheRegistry) {
+TEST_P(PartitionAllocThreadCacheTest, MAYBE_ThreadCacheRegistry) {
   auto* parent_thread_tcache = root_->thread_cache_for_testing();
   ASSERT_TRUE(parent_thread_tcache);
 
@@ -421,7 +442,7 @@
 }
 
 #if defined(PA_ENABLE_THREAD_CACHE_STATISTICS)
-TEST_F(PartitionAllocThreadCacheTest, RecordStats) {
+TEST_P(PartitionAllocThreadCacheTest, RecordStats) {
   auto* tcache = root_->thread_cache_for_testing();
   DeltaCounter alloc_counter{tcache->stats_.alloc_count};
   DeltaCounter alloc_hits_counter{tcache->stats_.alloc_hits};
@@ -469,7 +490,7 @@
   EXPECT_EQ(sizeof(ThreadCache), stats.metadata_overhead);
 }
 
-TEST_F(PartitionAllocThreadCacheTest, MultipleThreadCachesAccounting) {
+TEST_P(PartitionAllocThreadCacheTest, MultipleThreadCachesAccounting) {
   FillThreadCacheAndReturnIndex(kMediumSize);
   uint64_t alloc_count = root_->thread_cache_for_testing()->stats_.alloc_count;
 
@@ -503,7 +524,7 @@
 #else
 #define MAYBE_PurgeAll PurgeAll
 #endif
-TEST_F(PartitionAllocThreadCacheTest, MAYBE_PurgeAll)
+TEST_P(PartitionAllocThreadCacheTest, MAYBE_PurgeAll)
 NO_THREAD_SAFETY_ANALYSIS {
   std::atomic<bool> other_thread_started{false};
   std::atomic<bool> purge_called{false};
@@ -556,7 +577,7 @@
   PlatformThread::Join(thread_handle);
 }
 
-TEST_F(PartitionAllocThreadCacheTest, PeriodicPurge) {
+TEST_P(PartitionAllocThreadCacheTest, PeriodicPurge) {
   auto& registry = ThreadCacheRegistry::Instance();
   auto NextInterval = [&registry]() {
     return Microseconds(registry.GetPeriodicPurgeNextIntervalInMicroseconds());
@@ -604,7 +625,7 @@
 }
 
 // Disabled due to flakiness: crbug.com/1220371
-TEST_F(PartitionAllocThreadCacheTest,
+TEST_P(PartitionAllocThreadCacheTest,
        DISABLED_PeriodicPurgeSumsOverAllThreads) {
   auto& registry = ThreadCacheRegistry::Instance();
   auto NextInterval = [&registry]() {
@@ -669,7 +690,7 @@
 #else
 #define MAYBE_DynamicCountPerBucket DynamicCountPerBucket
 #endif
-TEST_F(PartitionAllocThreadCacheTest, MAYBE_DynamicCountPerBucket) {
+TEST_P(PartitionAllocThreadCacheTest, MAYBE_DynamicCountPerBucket) {
   auto* tcache = root_->thread_cache_for_testing();
   size_t bucket_index =
       FillThreadCacheAndReturnIndex(kMediumSize, kDefaultCountForMediumBucket);
@@ -702,7 +723,7 @@
             kDefaultCountForMediumBucket / 2);
 }
 
-TEST_F(PartitionAllocThreadCacheTest, DynamicCountPerBucketClamping) {
+TEST_P(PartitionAllocThreadCacheTest, DynamicCountPerBucketClamping) {
   auto* tcache = root_->thread_cache_for_testing();
 
   ThreadCacheRegistry::Instance().SetThreadCacheMultiplier(
@@ -736,7 +757,7 @@
 #define MAYBE_DynamicCountPerBucketMultipleThreads \
   DynamicCountPerBucketMultipleThreads
 #endif
-TEST_F(PartitionAllocThreadCacheTest,
+TEST_P(PartitionAllocThreadCacheTest,
        MAYBE_DynamicCountPerBucketMultipleThreads) {
   std::atomic<bool> other_thread_started{false};
   std::atomic<bool> threshold_changed{false};
@@ -782,7 +803,7 @@
   PlatformThread::Join(thread_handle);
 }
 
-TEST_F(PartitionAllocThreadCacheTest, DynamicSizeThreshold) {
+TEST_P(PartitionAllocThreadCacheTest, DynamicSizeThreshold) {
   auto* tcache = root_->thread_cache_for_testing();
   DeltaCounter alloc_miss_counter{tcache->stats_.alloc_misses};
   DeltaCounter alloc_miss_too_large_counter{
@@ -819,7 +840,7 @@
 }
 
 // Disabled due to flakiness: crbug.com/1287811
-TEST_F(PartitionAllocThreadCacheTest, DISABLED_DynamicSizeThresholdPurge) {
+TEST_P(PartitionAllocThreadCacheTest, DISABLED_DynamicSizeThresholdPurge) {
   auto* tcache = root_->thread_cache_for_testing();
   DeltaCounter alloc_miss_counter{tcache->stats_.alloc_misses};
   DeltaCounter alloc_miss_too_large_counter{
@@ -846,7 +867,7 @@
   EXPECT_EQ(0u, tcache->buckets_[index].count);
 }
 
-TEST_F(PartitionAllocThreadCacheTest, ClearFromTail) {
+TEST_P(PartitionAllocThreadCacheTest, ClearFromTail) {
   auto count_items = [](ThreadCache* tcache, size_t index) {
     uint8_t count = 0;
     auto* head = tcache->buckets_[index].freelist_head;
@@ -877,7 +898,7 @@
 #else
 #define MAYBE_Bookkeeping Bookkeeping
 #endif
-TEST_F(PartitionAllocThreadCacheTest, MAYBE_Bookkeeping) {
+TEST_P(PartitionAllocThreadCacheTest, MAYBE_Bookkeeping) {
   void* arr[kFillCountForMediumBucket] = {};
   auto* tcache = root_->thread_cache_for_testing();
 
@@ -885,7 +906,8 @@
                      PartitionPurgeDiscardUnusedSystemPages);
   root_->ResetBookkeepingForTesting();
 
-  size_t tc_bucket_index = root_->SizeToBucketIndex(sizeof(ThreadCache));
+  size_t tc_bucket_index =
+      root_->SizeToBucketIndex(sizeof(ThreadCache), GetParam());
   auto* tc_bucket = &root_->buckets[tc_bucket_index];
   size_t expected_allocated_size =
       tc_bucket->slot_size;  // For the ThreadCache itself.
@@ -900,7 +922,8 @@
 
   void* ptr = root_->Alloc(kMediumSize, "");
 
-  auto* medium_bucket = &root_->buckets[root_->SizeToBucketIndex(kMediumSize)];
+  auto* medium_bucket =
+      &root_->buckets[root_->SizeToBucketIndex(kMediumSize, GetParam())];
   size_t medium_alloc_size = medium_bucket->slot_size;
   expected_allocated_size += medium_alloc_size;
   expected_committed_size +=
@@ -934,6 +957,121 @@
   for (auto*& el : arr) {
     root_->Free(el);
   }
+  EXPECT_EQ(root_->get_total_size_of_allocated_bytes(),
+            expected_allocated_size);
+  tcache->Purge();
+  EXPECT_EQ(root_->get_total_size_of_allocated_bytes(), sizeof(ThreadCache));
+}
+
+TEST(AlternateBucketDistributionTest, SizeToIndex) {
+  // The first 12 buckets are the same as the default bucket index.
+  for (size_t i = 1 << 0; i < 1 << 8; i <<= 1) {
+    for (size_t offset = 0; offset < 4; offset++) {
+      size_t n = i * (4 + offset) / 4;
+      EXPECT_EQ(internal::BucketIndexLookup::GetIndex(n),
+                internal::BucketIndexLookup::GetIndexForDenserBuckets(n));
+    }
+  }
+
+  // The alternate bucket distribution is different in the middle values.
+  //
+  // For each order, the top two buckets are removed compared with the default
+  // distribution. Values that would be allocated in those two buckets are
+  // instead allocated in the next power of two bucket.
+  //
+  // The first two buckets (each power of two and the next bucket up) remain
+  // the same between the two bucket distributions.
+  size_t expected_index = 11;
+  for (size_t i = 1 << 8; i < 1 << 19; i <<= 1) {
+    // The first two buckets in the order should match up to the normal bucket
+    // distribution.
+    for (size_t offset = 0; offset < 2; offset++) {
+      size_t n = i * (4 + offset) / 4;
+      EXPECT_EQ(internal::BucketIndexLookup::GetIndex(n),
+                internal::BucketIndexLookup::GetIndexForDenserBuckets(n));
+      EXPECT_EQ(internal::BucketIndexLookup::GetIndex(n), expected_index++);
+    }
+    // The last two buckets in the order are "rounded up" to the same bucket
+    // as the next power of two.
+    expected_index += 2;
+    for (size_t offset = 2; offset < 4; offset++) {
+      size_t n = i * (4 + offset) / 4;
+      // These two are rounded up in the alternate distribution, so we expect
+      // the bucket index to be larger than the bucket index for the same
+      // allocation under the default distribution.
+      EXPECT_GT(internal::BucketIndexLookup::GetIndex(n),
+                internal::BucketIndexLookup::GetIndexForDenserBuckets(n));
+      // We expect both allocations in this loop to be rounded up to the next
+      // power of two bucket.
+      EXPECT_EQ(internal::BucketIndexLookup::GetIndex(n), expected_index);
+    }
+  }
+
+  // The rest of the buckets all match up exactly with the existing
+  // bucket distribution.
+  for (size_t i = 1 << 19; i < kMaxBucketed; i <<= 1) {
+    for (size_t offset = 0; offset < 4; offset++) {
+      size_t n = i * (4 + offset) / 4;
+      EXPECT_EQ(internal::BucketIndexLookup::GetIndex(n),
+                internal::BucketIndexLookup::GetIndexForDenserBuckets(n));
+    }
+  }
+}
+
+// This test makes sure it's safe to switch to the alternate bucket distribution
+// at runtime. This is intended to happen once, near the start of Chrome,
+// once we have enabled features.
+TEST(AlternateBucketDistributionTest, SwitchBeforeAlloc) {
+  auto* root = CreatePartitionRoot();
+  root->SwitchToDenserBucketDistribution();
+  constexpr size_t n = (1 << 12) * 3 / 2;
+  EXPECT_NE(internal::BucketIndexLookup::GetIndex(n),
+            internal::BucketIndexLookup::GetIndexForDenserBuckets(n));
+
+  void* ptr = root->Alloc(n, "");
+
+  root->ResetBucketDistributionForTesting();
+
+  root->Free(ptr);
+
+  // Clean up
+  ThreadCache::SetLargestCachedSize(ThreadCache::kDefaultSizeThreshold);
+  SwapInProcessThreadCacheForTesting(root);
+
+  ThreadSafePartitionRoot::DeleteForTesting(root);
+
+  // Cleanup the global state so next test can recreate ThreadCache.
+  if (internal::ThreadCache::IsTombstone(internal::ThreadCache::Get()))
+    internal::ThreadCache::RemoveTombstoneForTesting();
+}
+
+// This test makes sure it's safe to switch to the alternate bucket distribution
+// at runtime. This is intended to happen once, near the start of Chrome,
+// once we have enabled features.
+TEST(AlternateBucketDistributionTest, SwitchAfterAlloc) {
+  auto* root = CreatePartitionRoot();
+  constexpr size_t n = (1 << 12) * 3 / 2;
+  EXPECT_NE(internal::BucketIndexLookup::GetIndex(n),
+            internal::BucketIndexLookup::GetIndexForDenserBuckets(n));
+
+  void* ptr = root->Alloc(n, "");
+
+  root->SwitchToDenserBucketDistribution();
+
+  void* ptr2 = root->Alloc(n, "");
+
+  root->Free(ptr2);
+  root->Free(ptr);
+
+  // Clean up
+  ThreadCache::SetLargestCachedSize(ThreadCache::kDefaultSizeThreshold);
+  SwapInProcessThreadCacheForTesting(root);
+
+  ThreadSafePartitionRoot::DeleteForTesting(root);
+
+  // Cleanup the global state so next test can recreate ThreadCache.
+  if (internal::ThreadCache::IsTombstone(internal::ThreadCache::Get()))
+    internal::ThreadCache::RemoveTombstoneForTesting();
 }
 
 }  // namespace internal
diff --git a/base/ios/ios_util.h b/base/ios/ios_util.h
index d3528dd..8332b51 100644
--- a/base/ios/ios_util.h
+++ b/base/ios/ios_util.h
@@ -55,11 +55,6 @@
 // supportsMultipleScenes] instead.
 BASE_EXPORT bool IsMultiwindowSupported();
 
-// Returns true if the iOS13 UIScene-based startup flow is supported, regardless
-// of whether multiple windows are permitted. This always returns true if
-// base::ios::IsMultiwindowSupported() returns true.
-BASE_EXPORT bool IsSceneStartupSupported();
-
 // Returns true iff multiple windows can be opened, i.e. when the multiwindow
 // build flag is on, the device is running on iOS 13+ and it's a compatible
 // iPad.
diff --git a/base/ios/ios_util.mm b/base/ios/ios_util.mm
index e3f864a..34a8dab3 100644
--- a/base/ios/ios_util.mm
+++ b/base/ios/ios_util.mm
@@ -111,16 +111,6 @@
   return cached_value;
 }
 
-bool IsSceneStartupSupported() {
-  static bool cached_value = false;
-  static dispatch_once_t once_token = 0;
-  dispatch_once(&once_token, ^{
-    NSDictionary* scene_api_manifest = SceneAPIManifestFromInfoPlist();
-    cached_value = scene_api_manifest != nil;
-  });
-  return cached_value;
-}
-
 bool IsMultipleScenesSupported() {
   if (@available(iOS 13, *)) {
     return UIApplication.sharedApplication.supportsMultipleScenes;
diff --git a/build/android/fast_local_dev_server.py b/build/android/fast_local_dev_server.py
index a35c5007..a1e0d79cd 100755
--- a/build/android/fast_local_dev_server.py
+++ b/build/android/fast_local_dev_server.py
@@ -281,6 +281,7 @@
   tasks: Dict[Tuple[str, str], Task] = {}
   task_manager = TaskManager()
   try:
+    log(f'READY for tasks...')
     for data in _listen_for_request_data(sock):
       task = Task(name=data['name'],
                   cwd=data['cwd'],
@@ -303,7 +304,23 @@
 
 def main():
   parser = argparse.ArgumentParser(description=__doc__)
-  parser.parse_args()
+  parser.add_argument(
+      '--fail-if-not-running',
+      action='store_true',
+      help='Used by GN to fail fast if the build server is not running.')
+  args = parser.parse_args()
+  if args.fail_if_not_running:
+    with socket.socket(socket.AF_UNIX) as sock:
+      try:
+        sock.connect(server_utils.SOCKET_ADDRESS)
+      except socket.error:
+        print('Build server is not running and '
+              'android_static_analysis="build_server" is set.\nPlease run '
+              'this command in a separate terminal:\n\n'
+              '$ build/android/fast_local_dev_server.py\n')
+        return 1
+      else:
+        return 0
   with socket.socket(socket.AF_UNIX) as sock:
     sock.bind(server_utils.SOCKET_ADDRESS)
     sock.listen()
diff --git a/build/android/gyp/bytecode_processor.py b/build/android/gyp/bytecode_processor.py
index d77f159..049e26d 100755
--- a/build/android/gyp/bytecode_processor.py
+++ b/build/android/gyp/bytecode_processor.py
@@ -21,6 +21,9 @@
   argv = build_utils.ExpandFileArgs(argv[1:])
   parser = argparse.ArgumentParser()
   parser.add_argument('--target-name', help='Fully qualified GN target name.')
+  parser.add_argument('--use-build-server',
+                      action='store_true',
+                      help='Always use the build server.')
   parser.add_argument('--script', required=True,
                       help='Path to the java binary wrapper script.')
   parser.add_argument('--gn-target', required=True)
@@ -40,7 +43,8 @@
 
   if server_utils.MaybeRunCommand(name=args.target_name,
                                   argv=sys.argv,
-                                  stamp_file=args.stamp):
+                                  stamp_file=args.stamp,
+                                  force=args.use_build_server):
     return
 
   args.sdk_classpath_jars = build_utils.ParseGnList(args.sdk_classpath_jars)
diff --git a/build/android/gyp/compile_java.py b/build/android/gyp/compile_java.py
index 842ca18..6be0eed 100755
--- a/build/android/gyp/compile_java.py
+++ b/build/android/gyp/compile_java.py
@@ -586,6 +586,9 @@
   parser.add_option('--skip-build-server',
                     action='store_true',
                     help='Avoid using the build server.')
+  parser.add_option('--use-build-server',
+                    action='store_true',
+                    help='Always use the build server.')
   parser.add_option(
       '--java-srcjars',
       action='append',
@@ -694,7 +697,8 @@
   if (options.enable_errorprone and not options.skip_build_server
       and server_utils.MaybeRunCommand(name=options.target_name,
                                        argv=sys.argv,
-                                       stamp_file=options.jar_path)):
+                                       stamp_file=options.jar_path,
+                                       force=options.use_build_server)):
     return
 
   javac_cmd = []
diff --git a/build/android/gyp/lint.py b/build/android/gyp/lint.py
index 5a336a9..6bf2fec 100755
--- a/build/android/gyp/lint.py
+++ b/build/android/gyp/lint.py
@@ -377,6 +377,9 @@
   parser.add_argument('--skip-build-server',
                       action='store_true',
                       help='Avoid using the build server.')
+  parser.add_argument('--use-build-server',
+                      action='store_true',
+                      help='Always use the build server.')
   parser.add_argument('--lint-binary-path',
                       required=True,
                       help='Path to lint executable.')
@@ -457,8 +460,10 @@
   # Avoid parallelizing cache creation since lint runs without the cache defeat
   # the purpose of creating the cache in the first place.
   if (not args.create_cache and not args.skip_build_server
-      and server_utils.MaybeRunCommand(
-          name=args.target_name, argv=sys.argv, stamp_file=args.stamp)):
+      and server_utils.MaybeRunCommand(name=args.target_name,
+                                       argv=sys.argv,
+                                       stamp_file=args.stamp,
+                                       force=args.use_build_server)):
     return
 
   sources = []
diff --git a/build/android/gyp/turbine.py b/build/android/gyp/turbine.py
index 074550e..247924b 100755
--- a/build/android/gyp/turbine.py
+++ b/build/android/gyp/turbine.py
@@ -14,6 +14,7 @@
 
 import javac_output_processor
 from util import build_utils
+from util import server_utils
 
 
 def ProcessJavacOutput(output, target_name):
diff --git a/build/android/gyp/turbine.pydeps b/build/android/gyp/turbine.pydeps
index 8f20e8b..9e82b0cf 100644
--- a/build/android/gyp/turbine.pydeps
+++ b/build/android/gyp/turbine.pydeps
@@ -24,3 +24,4 @@
 turbine.py
 util/__init__.py
 util/build_utils.py
+util/server_utils.py
diff --git a/build/android/gyp/util/server_utils.py b/build/android/gyp/util/server_utils.py
index e050ef6..852f04b 100644
--- a/build/android/gyp/util/server_utils.py
+++ b/build/android/gyp/util/server_utils.py
@@ -13,7 +13,7 @@
 BUILD_SERVER_ENV_VARIABLE = 'INVOKED_BY_BUILD_SERVER'
 
 
-def MaybeRunCommand(name, argv, stamp_file):
+def MaybeRunCommand(name, argv, stamp_file, force):
   """Returns True if the command was successfully sent to the build server."""
 
   # When the build server runs a command, it sets this environment variable.
@@ -36,6 +36,12 @@
       # [Errno 111] Connection refused. Either the server has not been started
       #             or the server is not currently accepting new connections.
       if e.errno == 111:
+        if force:
+          raise RuntimeError(
+              '\n\nBuild server is not running and '
+              'android_static_analysis="build_server" is set.\nPlease run '
+              'this command in a separate terminal:\n\n'
+              '$ build/android/fast_local_dev_server.py\n\n') from None
         return False
       raise e
   return True
diff --git a/build/config/android/config.gni b/build/config/android/config.gni
index 69ba216..5fa6099 100644
--- a/build/config/android/config.gni
+++ b/build/config/android/config.gni
@@ -51,11 +51,22 @@
     # not explicitly set it.
     default_min_sdk_version = 23
 
-    # [WIP] Allows devs to achieve much faster edit-build-install cycles.
-    # Currently only works for ChromeModern apks due to incremental install.
-    # This needs to be in a separate declare_args as it determines some of the
-    # args in the main declare_args block below.
-    android_fast_local_dev = false
+    # Static analysis can be either "on" or "off" or "build_server". This
+    # controls how android lint, error-prone, bytecode checks are run. This
+    # needs to be in a separate declare_args as it determines some of the args
+    # in the main declare_args block below.
+    # "on" is the default.
+    # "off" avoids running any static analysis. This is the default for
+    #     official builds to reduce build times. Failures in static analysis
+    #     would have been caught by other bots.
+    # "build_server" ensures that fast_local_dev_server.py is running and
+    #     offloads analysis tasks to it to be run after the build completes.
+    #     This is the recommended setting for local development.
+    if (is_official_build) {
+      android_static_analysis = "off"
+    } else {
+      android_static_analysis = "on"
+    }
   }
 
   declare_args() {
@@ -211,24 +222,18 @@
     debuggable_apks = !is_official_build
 
     # Set to false to disable the Errorprone compiler.
-    # Defaults to false for official builds to reduce build times.
-    # Static analysis failures should have been already caught by normal bots.
-    # Disabled when fast_local_dev is turned on.
-    use_errorprone_java_compiler = !is_official_build && !android_fast_local_dev
+    use_errorprone_java_compiler = android_static_analysis != "off"
 
     # Build incremental targets whenever possible.
     # See //build/android/incremental_install/README.md for more details.
-    incremental_install = android_fast_local_dev
+    incremental_install = false
 
     # When true, updates all android_aar_prebuilt() .info files during gn gen.
     # Refer to android_aar_prebuilt() for more details.
     update_android_aar_prebuilts = false
 
-    # Turns off android lint. Useful for prototyping or for faster local builds.
-    # Defaults to true for official builds to reduce build times.
-    # Static analysis failures should have been already caught by normal bots.
-    # Disabled when fast_local_dev is turned on.
-    disable_android_lint = is_official_build || android_fast_local_dev
+    # Turns off android lint.
+    disable_android_lint = android_static_analysis == "off"
 
     # Location of aapt2 used for app bundles. For now, a more recent version
     # than the one distributed with the Android SDK is required.
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 0ee70903..5027a004 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -1097,6 +1097,8 @@
       if (defined(invoker.skip_build_server) && invoker.skip_build_server) {
         # Nocompile tests need lint to fail through ninja.
         args += [ "--skip-build-server" ]
+      } else if (android_static_analysis == "build_server") {
+        args += [ "--use-build-server" ]
       }
 
       if (defined(invoker.lint_suppressions_file)) {
@@ -1948,6 +1950,9 @@
         "--full-classpath-jars=@FileArg($_rebased_build_config:deps_info:javac_full_classpath)",
         "--full-classpath-gn-targets=@FileArg($_rebased_build_config:deps_info:javac_full_classpath_targets)",
       ]
+      if (android_static_analysis == "build_server") {
+        args += [ "--use-build-server" ]
+      }
       if (invoker.requires_android) {
         args += [ "--sdk-classpath-jars=@FileArg($_rebased_build_config:android:sdk_jars)" ]
       }
@@ -3120,6 +3125,8 @@
       if (defined(invoker.skip_build_server) && invoker.skip_build_server) {
         # Nocompile tests need lint to fail through ninja.
         args += [ "--skip-build-server" ]
+      } else if (android_static_analysis == "build_server") {
+        args += [ "--use-build-server" ]
       }
 
       foreach(e, _processor_args) {
@@ -3891,8 +3898,9 @@
     }
 
     if (_build_host_jar || _build_device_jar) {
-      _enable_bytecode_checks = !defined(invoker.enable_bytecode_checks) ||
-                                invoker.enable_bytecode_checks
+      _enable_bytecode_checks =
+          (!defined(invoker.enable_bytecode_checks) ||
+           invoker.enable_bytecode_checks) && android_static_analysis != "off"
       if (_enable_bytecode_checks) {
         _bytecode_checks_target = "${target_name}__validate_classpath"
         bytecode_processor(_bytecode_checks_target) {
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index ae7d047..86881561 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-7.20220201.0.1
+7.20220201.2.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index ae7d047..a5c06ad3 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-7.20220201.0.1
+7.20220201.1.1
diff --git a/build/rust/rustc_wrapper.py b/build/rust/rustc_wrapper.py
index 328f011b..9f94006 100755
--- a/build/rust/rustc_wrapper.py
+++ b/build/rust/rustc_wrapper.py
@@ -110,7 +110,9 @@
     env[k] = v
     fixed_env_vars.append(k)
 
-  subprocess.run([args.rustc, *rustc_args], env=env, check=True)
+  r = subprocess.run([args.rustc, *rustc_args], env=env, check=False)
+  if r.returncode != 0:
+    sys.exit(r.returncode)
 
   # Now edit the depfile produced
   if args.depfile is not None:
diff --git a/build_overrides/pdfium.gni b/build_overrides/pdfium.gni
index 9ece390..f5759bd 100644
--- a/build_overrides/pdfium.gni
+++ b/build_overrides/pdfium.gni
@@ -17,7 +17,3 @@
 
 # Disable use of Skia backend, paths only (experimental)
 pdf_use_skia_paths_override = false
-
-# TODO(crbug.com/1188795) Remove when this is no longer required in PDFium.
-# Enable experimental win32 GDI APIs.
-pdf_use_win32_gdi_override = false
diff --git a/chrome/VERSION b/chrome/VERSION
index 3ebe92ff..5477145 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=100
 MINOR=0
-BUILD=4864
+BUILD=4865
 PATCH=0
diff --git a/chrome/android/features/autofill_assistant/BUILD.gn b/chrome/android/features/autofill_assistant/BUILD.gn
index 9ee5e6c6..c54f7e1 100644
--- a/chrome/android/features/autofill_assistant/BUILD.gn
+++ b/chrome/android/features/autofill_assistant/BUILD.gn
@@ -172,7 +172,6 @@
     "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantTermsSection.java",
     "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantVerticalExpander.java",
     "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantVerticalExpanderAccordion.java",
-    "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AutofillUtilChrome.java",
     "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSection.java",
     "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionContainer.java",
     "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionFactory.java",
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java
index cf93514..5472455 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java
@@ -101,7 +101,8 @@
             @Nullable AssistantTabObscuringUtil tabObscuringUtil,
             @NonNull AssistantBrowserControlsFactory browserControlsFactory,
             AccessibilityUtil accessibilityUtil, AssistantInfoPageUtil infoPageUtil,
-            @Nullable AssistantProfileImageUtil profileImageUtil) {
+            @Nullable AssistantProfileImageUtil profileImageUtil,
+            AssistantEditorFactory editorFactory) {
         mAccessibilityUtil = accessibilityUtil;
         mModel = model;
         mOverlayCoordinator = overlayCoordinator;
@@ -145,8 +146,8 @@
                 new AssistantDetailsCoordinator(activity, infoPageUtil, model.getDetailsModel(),
                         ImageFetcherFactory.createImageFetcher(ImageFetcherConfig.DISK_CACHE_ONLY,
                                 AutofillAssistantUiController.getProfile().getProfileKey()));
-        mCollectUserDataCoordinator =
-                new AssistantCollectUserDataCoordinator(activity, model.getCollectUserDataModel());
+        mCollectUserDataCoordinator = new AssistantCollectUserDataCoordinator(
+                activity, model.getCollectUserDataModel(), editorFactory);
         AssistantFormCoordinator formCoordinator =
                 new AssistantFormCoordinator(activity, model.getFormModel());
         mActionsCoordinator =
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantCoordinator.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantCoordinator.java
index 78a731b..bf0599a 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantCoordinator.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantCoordinator.java
@@ -35,7 +35,8 @@
             @NonNull AssistantBrowserControlsFactory browserControlsFactory,
             @NonNull ApplicationViewportInsetSupplier applicationBottomInsetProvider,
             AccessibilityUtil accessibilityUtil, AssistantInfoPageUtil infoPageUtil,
-            @Nullable AssistantProfileImageUtil profileImageUtil) {
+            @Nullable AssistantProfileImageUtil profileImageUtil,
+            AssistantEditorFactory editorFactory) {
         if (overlayCoordinator != null) {
             mModel = new AssistantModel(overlayCoordinator.getModel());
             mOverlayCoordinator = overlayCoordinator;
@@ -46,9 +47,10 @@
                     accessibilityUtil);
         }
 
-        mBottomBarCoordinator = new AssistantBottomBarCoordinator(activity, mModel,
-                mOverlayCoordinator, controller, applicationBottomInsetProvider, tabObscuringUtil,
-                browserControlsFactory, accessibilityUtil, infoPageUtil, profileImageUtil);
+        mBottomBarCoordinator =
+                new AssistantBottomBarCoordinator(activity, mModel, mOverlayCoordinator, controller,
+                        applicationBottomInsetProvider, tabObscuringUtil, browserControlsFactory,
+                        accessibilityUtil, infoPageUtil, profileImageUtil, editorFactory);
         mKeyboardCoordinator = new AssistantKeyboardCoordinator(activity, keyboardDelegate,
                 rootView, mModel, keyboardCoordinatorDelegate, controller);
     }
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java
index 6e0a469..8d3a092 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java
@@ -103,7 +103,8 @@
                 dependencies.createBrowserControlsFactory(), dependencies.getBottomInsetProvider(),
                 dependencies.getAccessibilityUtil(), dependencies.createInfoPageUtil(),
                 dependencies.createProfileImageUtilOrNull(
-                        mActivity, R.dimen.autofill_assistant_profile_size));
+                        mActivity, R.dimen.autofill_assistant_profile_size),
+                dependencies.createEditorFactory());
 
         mTabChangeObserverDestroyer =
                 dependencies.observeTabChanges(new AssistantTabChangeObserver() {
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataBinder.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataBinder.java
index c1f63c6ca..3eb8ecc 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataBinder.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataBinder.java
@@ -9,31 +9,21 @@
 import android.view.ViewGroup;
 
 import org.chromium.base.task.PostTask;
-import org.chromium.chrome.browser.autofill.prefeditor.EditorDialog;
-import org.chromium.chrome.browser.autofill.settings.AddressEditor;
-import org.chromium.chrome.browser.autofill.settings.CardEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditorFactory;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.AddressModel;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.ContactModel;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.PaymentInstrumentModel;
 import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue;
-import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel.AddressModel;
-import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel.ContactModel;
 import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel.LoginChoiceModel;
-import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel.PaymentInstrumentModel;
 import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantAdditionalSection.Delegate;
 import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantAdditionalSectionContainer;
-import org.chromium.chrome.browser.payments.ContactEditor;
-import org.chromium.chrome.browser.profiles.Profile;
-import org.chromium.components.payments.BasicCardUtils;
-import org.chromium.components.payments.MethodStrings;
-import org.chromium.components.version_info.VersionInfo;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
 import org.chromium.content_public.browser.WebContents;
-import org.chromium.payments.mojom.PaymentMethodData;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 
 /**
  * This class is responsible for pushing updates to the Autofill Assistant UI for requesting user
@@ -64,6 +54,7 @@
         private final ViewGroup mGenericUserInterfaceContainerAppended;
         private final Object mDividerTag;
         private final Activity mActivity;
+        private final AssistantEditorFactory mEditorFactory;
 
         public ViewHolder(View rootView, AssistantVerticalExpanderAccordion accordion,
                 int sectionPadding, AssistantLoginSection loginSection,
@@ -76,7 +67,7 @@
                 AssistantAdditionalSectionContainer appendedSections,
                 ViewGroup genericUserInterfaceContainerPrepended,
                 ViewGroup genericUserInterfaceContainerAppended, Object dividerTag,
-                Activity activity) {
+                Activity activity, AssistantEditorFactory editorFactory) {
             mRootView = rootView;
             mPaymentRequestExpanderAccordion = accordion;
             mSectionToSectionPadding = sectionPadding;
@@ -93,6 +84,7 @@
             mGenericUserInterfaceContainerAppended = genericUserInterfaceContainerAppended;
             mDividerTag = dividerTag;
             mActivity = activity;
+            mEditorFactory = editorFactory;
         }
     }
 
@@ -204,17 +196,10 @@
      */
     private boolean updateSectionContents(
             AssistantCollectUserDataModel model, PropertyKey propertyKey, ViewHolder view) {
-        if (propertyKey == AssistantCollectUserDataModel.AVAILABLE_PAYMENT_INSTRUMENTS
-                || propertyKey == AssistantCollectUserDataModel.WEB_CONTENTS) {
+        if (propertyKey == AssistantCollectUserDataModel.AVAILABLE_PAYMENT_INSTRUMENTS) {
             if (model.get(AssistantCollectUserDataModel.REQUEST_PAYMENT)) {
-                List<PaymentInstrumentModel> paymentInstruments;
-                if (model.get(AssistantCollectUserDataModel.WEB_CONTENTS) == null) {
-                    paymentInstruments = Collections.emptyList();
-                } else {
-                    paymentInstruments =
-                            model.get(AssistantCollectUserDataModel.AVAILABLE_PAYMENT_INSTRUMENTS);
-                }
-                view.mPaymentMethodSection.onAvailablePaymentMethodsChanged(paymentInstruments);
+                view.mPaymentMethodSection.onAvailablePaymentMethodsChanged(
+                        model.get(AssistantCollectUserDataModel.AVAILABLE_PAYMENT_INSTRUMENTS));
             }
             return true;
         } else if (propertyKey == AssistantCollectUserDataModel.AVAILABLE_CONTACTS) {
@@ -521,12 +506,12 @@
      */
     private boolean updateEditors(
             AssistantCollectUserDataModel model, PropertyKey propertyKey, ViewHolder view) {
-        if ((propertyKey != AssistantCollectUserDataModel.WEB_CONTENTS)
-                && (propertyKey != AssistantCollectUserDataModel.REQUEST_NAME)
-                && (propertyKey != AssistantCollectUserDataModel.REQUEST_EMAIL)
-                && (propertyKey != AssistantCollectUserDataModel.REQUEST_PHONE)
-                && (propertyKey != AssistantCollectUserDataModel.SUPPORTED_BASIC_CARD_NETWORKS)
-                && (propertyKey != AssistantCollectUserDataModel.SHOULD_STORE_USER_DATA_CHANGES)) {
+        if (propertyKey != AssistantCollectUserDataModel.WEB_CONTENTS
+                && propertyKey != AssistantCollectUserDataModel.REQUEST_NAME
+                && propertyKey != AssistantCollectUserDataModel.REQUEST_EMAIL
+                && propertyKey != AssistantCollectUserDataModel.REQUEST_PHONE
+                && propertyKey != AssistantCollectUserDataModel.SUPPORTED_BASIC_CARD_NETWORKS
+                && propertyKey != AssistantCollectUserDataModel.SHOULD_STORE_USER_DATA_CHANGES) {
             return false;
         }
 
@@ -535,74 +520,26 @@
             view.mContactDetailsSection.setEditor(null);
             view.mPaymentMethodSection.setEditor(null);
             view.mShippingAddressSection.setEditor(null);
-            view.mPaymentMethodSection.setWebContents(null);
             return true;
         }
 
         boolean shouldStoreChanges =
                 model.get(AssistantCollectUserDataModel.SHOULD_STORE_USER_DATA_CHANGES);
 
-        Profile profile = Profile.fromWebContents(webContents);
         if (shouldShowContactDetails(model)) {
-            ContactEditor contactEditor =
-                    new ContactEditor(model.get(AssistantCollectUserDataModel.REQUEST_NAME),
-                            model.get(AssistantCollectUserDataModel.REQUEST_PHONE),
-                            model.get(AssistantCollectUserDataModel.REQUEST_EMAIL),
-                            /* saveToDisk= */ shouldStoreChanges);
-            contactEditor.setEditorDialog(new EditorDialog(view.mActivity,
-                    /*deleteRunnable =*/null, profile));
-            view.mContactDetailsSection.setEditor(contactEditor);
+            view.mContactDetailsSection.setEditor(view.mEditorFactory.createContactEditor(
+                    webContents, view.mActivity,
+                    model.get(AssistantCollectUserDataModel.REQUEST_NAME),
+                    model.get(AssistantCollectUserDataModel.REQUEST_PHONE),
+                    model.get(AssistantCollectUserDataModel.REQUEST_EMAIL), shouldStoreChanges));
         }
+        view.mShippingAddressSection.setEditor(view.mEditorFactory.createAddressEditor(
+                webContents, view.mActivity, shouldStoreChanges));
+        view.mPaymentMethodSection.setEditor(
+                view.mEditorFactory.createPaymentInstrumentEditor(webContents, view.mActivity,
+                        model.get(AssistantCollectUserDataModel.SUPPORTED_BASIC_CARD_NETWORKS),
+                        shouldStoreChanges));
 
-        AddressEditor addressEditor = new AddressEditor(AddressEditor.Purpose.AUTOFILL_ASSISTANT,
-                /* saveToDisk= */ shouldStoreChanges);
-        addressEditor.setEditorDialog(new EditorDialog(view.mActivity,
-                /* deleteRunnable= */ null, profile));
-
-        CardEditor cardEditor = new CardEditor(webContents, addressEditor,
-                /* includeOrgLabel= */ false, /* saveToDisk= */ shouldStoreChanges);
-        List<String> supportedCardNetworks =
-                model.get(AssistantCollectUserDataModel.SUPPORTED_BASIC_CARD_NETWORKS);
-        if (supportedCardNetworks != null) {
-            cardEditor.addAcceptedPaymentMethodIfRecognized(
-                    getPaymentMethodDataFromNetworks(supportedCardNetworks));
-        }
-
-        EditorDialog cardEditorDialog = new EditorDialog(view.mActivity,
-                /*deleteRunnable =*/null, profile);
-        if (VersionInfo.isBetaBuild() || VersionInfo.isStableBuild()) {
-            cardEditorDialog.disableScreenshots();
-        }
-        cardEditor.setEditorDialog(cardEditorDialog);
-
-        view.mShippingAddressSection.setEditor(addressEditor);
-        view.mPaymentMethodSection.setEditor(cardEditor);
-        view.mPaymentMethodSection.setWebContents(webContents);
         return true;
     }
-
-    private PaymentMethodData getPaymentMethodDataFromNetworks(List<String> supportedCardNetworks) {
-        // Only enable 'basic-card' payment method.
-        PaymentMethodData methodData = new PaymentMethodData();
-        methodData.supportedMethod = MethodStrings.BASIC_CARD;
-
-        // Apply basic-card filter if specified
-        if (supportedCardNetworks != null && supportedCardNetworks.size() > 0) {
-            ArrayList<Integer> filteredNetworks = new ArrayList<>();
-            Map<String, Integer> networks = BasicCardUtils.getNetworkIdentifiers();
-            for (String network : supportedCardNetworks) {
-                assert networks.containsKey(network);
-                if (networks.containsKey(network)) {
-                    filteredNetworks.add(networks.get(network));
-                }
-            }
-
-            methodData.supportedNetworks = new int[filteredNetworks.size()];
-            for (int i = 0; i < filteredNetworks.size(); ++i) {
-                methodData.supportedNetworks[i] = filteredNetworks.get(i);
-            }
-        }
-
-        return methodData;
-    }
 }
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java
index 9cf7b2a8..e3954965 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java
@@ -10,6 +10,7 @@
 import android.widget.LinearLayout;
 
 import org.chromium.chrome.autofill_assistant.R;
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditorFactory;
 import org.chromium.chrome.browser.autofill_assistant.AssistantTagsForTesting;
 import org.chromium.chrome.browser.autofill_assistant.LayoutUtils;
 import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantAdditionalSectionContainer;
@@ -27,8 +28,8 @@
     private final AssistantCollectUserDataModel mModel;
     private AssistantCollectUserDataBinder.ViewHolder mViewHolder;
 
-    public AssistantCollectUserDataCoordinator(
-            Activity activity, AssistantCollectUserDataModel model) {
+    public AssistantCollectUserDataCoordinator(Activity activity,
+            AssistantCollectUserDataModel model, AssistantEditorFactory editorFactory) {
         mActivity = activity;
         mModel = model;
         int sectionToSectionPadding = activity.getResources().getDimensionPixelSize(
@@ -115,7 +116,7 @@
                 contactDetailsSection, paymentMethodSection, shippingAddressSection, termsSection,
                 termsAsCheckboxSection, infoSection, prependedSections, appendedSections,
                 genericUserInterfaceContainerPrepended, genericUserInterfaceContainerAppended,
-                DIVIDER_TAG, mActivity);
+                DIVIDER_TAG, mActivity, editorFactory);
         AssistantCollectUserDataBinder binder = new AssistantCollectUserDataBinder();
         PropertyModelChangeProcessor.create(model, mViewHolder, binder);
 
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java
index 4a8c1a0..e00ade3 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java
@@ -6,6 +6,7 @@
 
 import androidx.annotation.Nullable;
 
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel;
 import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue;
 
 /**
@@ -16,16 +17,16 @@
  */
 public interface AssistantCollectUserDataDelegate {
     /** The currently selected contact has changed. */
-    void onContactInfoChanged(@Nullable AssistantCollectUserDataModel.ContactModel contactModel,
+    void onContactInfoChanged(@Nullable AssistantOptionModel.ContactModel contactModel,
             @AssistantUserDataEventType int eventType);
 
     /** The currently selected shipping address has changed. */
-    void onShippingAddressChanged(@Nullable AssistantCollectUserDataModel.AddressModel addressModel,
+    void onShippingAddressChanged(@Nullable AssistantOptionModel.AddressModel addressModel,
             @AssistantUserDataEventType int eventType);
 
     /** The currently selected payment method has changed. */
     void onPaymentMethodChanged(
-            @Nullable AssistantCollectUserDataModel.PaymentInstrumentModel paymentInstrumentModel,
+            @Nullable AssistantOptionModel.PaymentInstrumentModel paymentInstrumentModel,
             @AssistantUserDataEventType int eventType);
 
     /** The currently selected terms & conditions state has changed. */
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataModel.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataModel.java
index 546348b..c7d4839 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataModel.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataModel.java
@@ -14,6 +14,10 @@
 import org.chromium.chrome.browser.autofill_assistant.AssistantAutofillCreditCard;
 import org.chromium.chrome.browser.autofill_assistant.AssistantAutofillProfile;
 import org.chromium.chrome.browser.autofill_assistant.AssistantInfoPopup;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.AddressModel;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.ContactModel;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.PaymentInstrumentModel;
 import org.chromium.chrome.browser.autofill_assistant.AssistantPaymentInstrument;
 import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantAdditionalSectionFactory;
 import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantPopupListSection;
@@ -42,75 +46,8 @@
         public int mMaxNumberLines;
     }
 
-    /**
-     * Model wrapper for a data item to contain errors.
-     *
-     * @param <T> The type that an instance of this class is created for, such as
-     *            {@link AssistantAutofillProfile}, {@link AssistantPaymentInstrument}, etc.
-     */
-    public static class OptionModel<T> {
-        public T mOption;
-        public List<String> mErrors;
-
-        public OptionModel(T option, List<String> errors) {
-            this.mOption = option;
-            this.mErrors = errors;
-        }
-
-        public OptionModel(T option) {
-            this(option, new ArrayList<>());
-        }
-
-        boolean isComplete() {
-            return mErrors.isEmpty();
-        }
-    }
-
-    /** Model wrapper for an {@code AssistantAutofillProfile}. */
-    public static class ContactModel extends OptionModel<AssistantAutofillProfile> {
-        private final boolean mCanEdit;
-
-        public ContactModel(
-                AssistantAutofillProfile contact, List<String> errors, boolean canEdit) {
-            super(contact, errors);
-            mCanEdit = canEdit;
-        }
-
-        public ContactModel(AssistantAutofillProfile contact) {
-            super(contact);
-            mCanEdit = true;
-        }
-
-        public boolean canEdit() {
-            return mCanEdit;
-        }
-    }
-
-    /** Model wrapper for an {@code AssistantAutofillProfile}. */
-    public static class AddressModel extends OptionModel<AssistantAutofillProfile> {
-        public AddressModel(AssistantAutofillProfile address, List<String> errors) {
-            super(address, errors);
-        }
-
-        public AddressModel(AssistantAutofillProfile address) {
-            super(address);
-        }
-    }
-
-    /** Model wrapper for an {@code AssistantPaymentInstrument}. */
-    public static class PaymentInstrumentModel extends OptionModel<AssistantPaymentInstrument> {
-        public PaymentInstrumentModel(
-                AssistantPaymentInstrument paymentInstrument, List<String> errors) {
-            super(paymentInstrument, errors);
-        }
-
-        public PaymentInstrumentModel(AssistantPaymentInstrument paymentInstrument) {
-            super(paymentInstrument);
-        }
-    }
-
     /** Model wrapper for an {@code AssistantLoginChoice}. */
-    public static class LoginChoiceModel extends OptionModel<AssistantLoginChoice> {
+    public static class LoginChoiceModel extends AssistantOptionModel<AssistantLoginChoice> {
         public LoginChoiceModel(AssistantLoginChoice loginChoice) {
             super(loginChoice);
         }
@@ -260,6 +197,7 @@
         set(REQUEST_LOGIN_CHOICE, false);
         set(PREPENDED_SECTIONS, Collections.emptyList());
         set(APPENDED_SECTIONS, Collections.emptyList());
+        set(SUPPORTED_BASIC_CARD_NETWORKS, Collections.emptyList());
         set(AVAILABLE_PAYMENT_INSTRUMENTS, Collections.emptyList());
         set(AVAILABLE_CONTACTS, Collections.emptyList());
         set(AVAILABLE_SHIPPING_ADDRESSES, Collections.emptyList());
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java
index fa882b8c..0a56605 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java
@@ -11,6 +11,7 @@
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.autofill_assistant.AssistantAutofillCreditCard;
 import org.chromium.chrome.browser.autofill_assistant.AssistantAutofillProfile;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel;
 import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue;
 
 /** Delegate for the Collect user data UI which forwards events to a native counterpart. */
@@ -29,8 +30,7 @@
     }
 
     @Override
-    public void onContactInfoChanged(
-            @Nullable AssistantCollectUserDataModel.ContactModel contactModel,
+    public void onContactInfoChanged(@Nullable AssistantOptionModel.ContactModel contactModel,
             @AssistantUserDataEventType int eventType) {
         if (mNativeAssistantCollectUserDataDelegate != 0) {
             AssistantCollectUserDataNativeDelegateJni.get().onContactInfoChanged(
@@ -41,8 +41,7 @@
     }
 
     @Override
-    public void onShippingAddressChanged(
-            @Nullable AssistantCollectUserDataModel.AddressModel addressModel,
+    public void onShippingAddressChanged(@Nullable AssistantOptionModel.AddressModel addressModel,
             @AssistantUserDataEventType int eventType) {
         if (mNativeAssistantCollectUserDataDelegate != 0) {
             AssistantCollectUserDataNativeDelegateJni.get().onShippingAddressChanged(
@@ -54,7 +53,7 @@
 
     @Override
     public void onPaymentMethodChanged(
-            @Nullable AssistantCollectUserDataModel.PaymentInstrumentModel paymentInstrumentModel,
+            @Nullable AssistantOptionModel.PaymentInstrumentModel paymentInstrumentModel,
             @AssistantUserDataEventType int eventType) {
         if (mNativeAssistantCollectUserDataDelegate != 0) {
             AssistantCollectUserDataNativeDelegateJni.get().onCreditCardChanged(
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataSection.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataSection.java
index 9f248ad5..8873782 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataSection.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataSection.java
@@ -16,10 +16,10 @@
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.autofill_assistant.R;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel;
 import org.chromium.chrome.browser.autofill_assistant.AssistantTagsForTesting;
 import org.chromium.chrome.browser.autofill_assistant.AssistantTextUtils;
 import org.chromium.chrome.browser.autofill_assistant.LayoutUtils;
-import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel.OptionModel;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -30,7 +30,7 @@
  * @param <T> The type of entry that a concrete instance of this class is created for,
  *            such as {@link AssistantAutofillProfile}, {@link AssistantPaymentInstrument}, etc.
  */
-public abstract class AssistantCollectUserDataSection<T extends OptionModel> {
+public abstract class AssistantCollectUserDataSection<T extends AssistantOptionModel> {
     interface Delegate<T> {
         void onUserDataChanged(T item, @AssistantUserDataEventType int type);
     }
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantContactDetailsSection.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantContactDetailsSection.java
index 51f04d38..e9040b7 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantContactDetailsSection.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantContactDetailsSection.java
@@ -16,9 +16,8 @@
 import org.chromium.base.Callback;
 import org.chromium.chrome.autofill_assistant.R;
 import org.chromium.chrome.browser.autofill_assistant.AssistantAutofillProfile;
-import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel.ContactModel;
-import org.chromium.chrome.browser.payments.AutofillContact;
-import org.chromium.chrome.browser.payments.ContactEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditor.AssistantContactEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.ContactModel;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -27,7 +26,8 @@
  * The contact details section of the Autofill Assistant payment request.
  */
 public class AssistantContactDetailsSection extends AssistantCollectUserDataSection<ContactModel> {
-    private ContactEditor mEditor;
+    @Nullable
+    private AssistantContactEditor mEditor;
     private boolean mIgnoreProfileChangeNotifications;
     private AssistantCollectUserDataModel.ContactDescriptionOptions mSummaryOptions;
     private AssistantCollectUserDataModel.ContactDescriptionOptions mFullOptions;
@@ -41,14 +41,14 @@
                 context.getString(R.string.payments_add_contact));
     }
 
-    public void setEditor(ContactEditor editor) {
+    public void setEditor(@Nullable AssistantContactEditor editor) {
         mEditor = editor;
         if (mEditor == null) {
             return;
         }
 
         for (ContactModel item : getItems()) {
-            addAutocompleteInformationToEditor(item.mOption);
+            mEditor.addContactInformationForAutocomplete(item.mOption);
         }
     }
 
@@ -58,24 +58,16 @@
             return;
         }
 
-        AutofillContact oldContact = oldItem == null
-                ? null
-                : AutofillUtilChrome.assistantAutofillProfileToAutofillContact(
-                        oldItem.mOption, mContext, mEditor);
-
-        Callback<AutofillContact> doneCallback = contact -> {
-            assert (contact != null && contact.isComplete() && contact.getProfile() != null);
+        Callback<ContactModel> doneCallback = editedItem -> {
             mIgnoreProfileChangeNotifications = true;
-            addOrUpdateItem(
-                    new ContactModel(AutofillUtilChrome.autofillProfileToAssistantAutofillProfile(
-                            contact.getProfile())),
+            addOrUpdateItem(editedItem,
                     /* select= */ true, /* notify= */ true);
             mIgnoreProfileChangeNotifications = false;
         };
 
-        Callback<AutofillContact> cancelCallback = contact -> {};
+        Callback<ContactModel> cancelCallback = ignoredItem -> {};
 
-        mEditor.edit(oldContact, doneCallback, cancelCallback);
+        mEditor.createOrEditItem(oldItem, doneCallback, cancelCallback);
     }
 
     @Override
@@ -173,16 +165,10 @@
     @Override
     protected void addOrUpdateItem(ContactModel model, boolean select, boolean notify) {
         super.addOrUpdateItem(model, select, notify);
-        addAutocompleteInformationToEditor(model.mOption);
-    }
 
-    private void addAutocompleteInformationToEditor(AssistantAutofillProfile contact) {
-        if (mEditor == null || contact == null) {
-            return;
+        if (mEditor != null) {
+            mEditor.addContactInformationForAutocomplete(model.mOption);
         }
-        mEditor.addEmailAddressIfValid(contact.getEmailAddress());
-        mEditor.addPayerNameIfValid(contact.getFullName());
-        mEditor.addPhoneNumberIfValid(contact.getPhoneNumber());
     }
 
     /**
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantPaymentMethodSection.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantPaymentMethodSection.java
index 1f09c5ff..a1d65278 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantPaymentMethodSection.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantPaymentMethodSection.java
@@ -17,14 +17,11 @@
 
 import org.chromium.base.Callback;
 import org.chromium.chrome.autofill_assistant.R;
-import org.chromium.chrome.browser.autofill.settings.CardEditor;
 import org.chromium.chrome.browser.autofill_assistant.AssistantAutofillCreditCard;
 import org.chromium.chrome.browser.autofill_assistant.AssistantAutofillProfile;
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditor.AssistantPaymentInstrumentEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.PaymentInstrumentModel;
 import org.chromium.chrome.browser.autofill_assistant.AssistantPaymentInstrument;
-import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel.PaymentInstrumentModel;
-import org.chromium.chrome.browser.payments.AutofillAddress;
-import org.chromium.chrome.browser.payments.AutofillPaymentInstrument;
-import org.chromium.content_public.browser.WebContents;
 
 import java.util.List;
 
@@ -33,8 +30,8 @@
  */
 public class AssistantPaymentMethodSection
         extends AssistantCollectUserDataSection<PaymentInstrumentModel> {
-    private CardEditor mEditor;
-    private WebContents mWebContents;
+    @Nullable
+    private AssistantPaymentInstrumentEditor mEditor;
     private boolean mIgnorePaymentMethodsChangeNotifications;
 
     AssistantPaymentMethodSection(Context context, ViewGroup parent) {
@@ -47,7 +44,7 @@
         setTitle(context.getString(R.string.payments_method_of_payment_label));
     }
 
-    public void setEditor(CardEditor editor) {
+    public void setEditor(@Nullable AssistantPaymentInstrumentEditor editor) {
         mEditor = editor;
         if (mEditor == null) {
             return;
@@ -61,34 +58,23 @@
         }
     }
 
-    public void setWebContents(WebContents webContents) {
-        mWebContents = webContents;
-    }
-
     @Override
     protected void createOrEditItem(@Nullable PaymentInstrumentModel oldItem) {
-        if (mEditor == null || mWebContents == null) {
+        if (mEditor == null) {
             return;
         }
 
-        AutofillPaymentInstrument oldPaymentInstrument = oldItem == null
-                ? null
-                : AutofillUtilChrome.assistantPaymentInstrumentToAutofillPaymentInstrument(
-                        oldItem.mOption, mWebContents);
-        Callback<AutofillPaymentInstrument> doneCallback = paymentInstrument -> {
-            assert (paymentInstrument != null && paymentInstrument.isComplete()
-                    && paymentInstrument.getCard() != null);
+        Callback<PaymentInstrumentModel> doneCallback = editedItem -> {
             mIgnorePaymentMethodsChangeNotifications = true;
-            addOrUpdateItem(new PaymentInstrumentModel(
-                                    AutofillUtilChrome
-                                            .autofillPaymentInstrumentToAssistantPaymentInstrument(
-                                                    paymentInstrument)),
+            addOrUpdateItem(editedItem,
                     /* select= */ true,
                     /* notify= */ true);
             mIgnorePaymentMethodsChangeNotifications = false;
         };
-        Callback<AutofillPaymentInstrument> cancelCallback = paymentInstrument -> {};
-        mEditor.edit(oldPaymentInstrument, doneCallback, cancelCallback);
+
+        Callback<PaymentInstrumentModel> cancelCallback = ignoredItem -> {};
+
+        mEditor.createOrEditItem(oldItem, doneCallback, cancelCallback);
     }
 
     @Override
@@ -219,16 +205,8 @@
     }
 
     private void addAutocompleteInformationToEditor(AssistantAutofillProfile profile) {
-        if (mEditor == null) {
-            return;
+        if (mEditor != null) {
+            mEditor.addAddressInformationForAutocomplete(profile);
         }
-        // TODO(sandromaggi): Find a way to abstract this, such that we can remove the
-        //  AutofillAddress.
-        AutofillAddress address =
-                AutofillUtilChrome.assistantAutofillProfileToAutofillAddress(profile, mContext);
-        if (address.getProfile().getLabel() == null) {
-            address.getProfile().setLabel(AutofillUtilChrome.getBillingAddressLabel(profile));
-        }
-        mEditor.updateBillingAddressIfComplete(address);
     }
 }
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantShippingAddressSection.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantShippingAddressSection.java
index 71495247..9e69a5e 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantShippingAddressSection.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantShippingAddressSection.java
@@ -15,9 +15,9 @@
 
 import org.chromium.base.Callback;
 import org.chromium.chrome.autofill_assistant.R;
-import org.chromium.chrome.browser.autofill.settings.AddressEditor;
-import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel.AddressModel;
-import org.chromium.chrome.browser.payments.AutofillAddress;
+import org.chromium.chrome.browser.autofill_assistant.AssistantAutofillUtilChrome;
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditor.AssistantAddressEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.AddressModel;
 
 import java.util.List;
 
@@ -25,7 +25,8 @@
  * The shipping address section of the Autofill Assistant payment request.
  */
 public class AssistantShippingAddressSection extends AssistantCollectUserDataSection<AddressModel> {
-    private AddressEditor mEditor;
+    @Nullable
+    private AssistantAddressEditor mEditor;
     private boolean mIgnoreProfileChangeNotifications;
 
     AssistantShippingAddressSection(Context context, ViewGroup parent) {
@@ -37,7 +38,7 @@
                 context.getString(R.string.payments_add_address));
     }
 
-    public void setEditor(AddressEditor editor) {
+    public void setEditor(@Nullable AssistantAddressEditor editor) {
         mEditor = editor;
     }
 
@@ -47,24 +48,16 @@
             return;
         }
 
-        AutofillAddress oldAddress = oldItem == null
-                ? null
-                : AutofillUtilChrome.assistantAutofillProfileToAutofillAddress(
-                        oldItem.mOption, mContext);
-
-        Callback<AutofillAddress> doneCallback = address -> {
-            assert (address != null && address.isComplete() && address.getProfile() != null);
+        Callback<AddressModel> doneCallback = editedItem -> {
             mIgnoreProfileChangeNotifications = true;
-            addOrUpdateItem(
-                    new AddressModel(AutofillUtilChrome.autofillProfileToAssistantAutofillProfile(
-                            address.getProfile())),
+            addOrUpdateItem(editedItem,
                     /* select= */ true, /* notify= */ true);
             mIgnoreProfileChangeNotifications = false;
         };
 
-        Callback<AutofillAddress> cancelCallback = address -> {};
+        Callback<AddressModel> cancelCallback = ignoredItem -> {};
 
-        mEditor.edit(oldAddress, doneCallback, cancelCallback);
+        mEditor.createOrEditItem(oldItem, doneCallback, cancelCallback);
     }
 
     @Override
@@ -77,8 +70,9 @@
         hideIfEmpty(fullNameView);
 
         TextView fullAddressView = fullView.findViewById(R.id.full_address);
-        fullAddressView.setText(
-                AutofillUtilChrome.getShippingAddressLabel(model.mOption, /* withCountry= */ true));
+        // TODO(b/211748133): Remove dependency to AutofillUtilChrome.
+        fullAddressView.setText(AssistantAutofillUtilChrome.getShippingAddressLabel(
+                model.mOption, /* withCountry= */ true));
         hideIfEmpty(fullAddressView);
 
         TextView errorView = fullView.findViewById(R.id.incomplete_error);
@@ -101,7 +95,8 @@
         hideIfEmpty(fullNameView);
 
         TextView shortAddressView = summaryView.findViewById(R.id.short_address);
-        shortAddressView.setText(AutofillUtilChrome.getShippingAddressLabel(
+        // TODO(b/211748133): Remove dependency to AutofillUtilChrome.
+        shortAddressView.setText(AssistantAutofillUtilChrome.getShippingAddressLabel(
                 model.mOption, /* withCountry= */ false));
         hideIfEmpty(shortAddressView);
 
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java
index 579b10a..c04ca223 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java
@@ -106,22 +106,21 @@
         Map<String, AssistantValue> mAdditionalValues = new HashMap<>();
 
         @Override
-        public void onContactInfoChanged(
-                @Nullable AssistantCollectUserDataModel.ContactModel contactModel,
+        public void onContactInfoChanged(@Nullable AssistantOptionModel.ContactModel contactModel,
                 @AssistantUserDataEventType int eventType) {
             mContact = contactModel == null ? null : contactModel.mOption;
         }
 
         @Override
         public void onShippingAddressChanged(
-                @Nullable AssistantCollectUserDataModel.AddressModel addressModel,
+                @Nullable AssistantOptionModel.AddressModel addressModel,
                 @AssistantUserDataEventType int eventType) {
             mShippingAddress = addressModel == null ? null : addressModel.mOption;
         }
 
         @Override
-        public void onPaymentMethodChanged(@Nullable AssistantCollectUserDataModel
-                                                   .PaymentInstrumentModel paymentInstrumentModel,
+        public void onPaymentMethodChanged(
+                @Nullable AssistantOptionModel.PaymentInstrumentModel paymentInstrumentModel,
                 @AssistantUserDataEventType int eventType) {
             mPaymentInstrument =
                     paymentInstrumentModel == null ? null : paymentInstrumentModel.mOption;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java
index 4900d6a..2370583 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java
@@ -49,13 +49,13 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.autofill_assistant.R;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.AddressModel;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.ContactModel;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.PaymentInstrumentModel;
 import org.chromium.chrome.browser.autofill_assistant.AutofillAssistantCollectUserDataTestHelper.ViewHolder;
 import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue;
 import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataCoordinator;
 import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel;
-import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel.AddressModel;
-import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel.ContactModel;
-import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel.PaymentInstrumentModel;
 import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantContactField;
 import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantLoginChoice;
 import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantTermsAndConditionsState;
@@ -113,7 +113,9 @@
     private AssistantCollectUserDataCoordinator createCollectUserDataCoordinator(
             AssistantCollectUserDataModel model) throws Exception {
         AssistantCollectUserDataCoordinator coordinator = TestThreadUtils.runOnUiThreadBlocking(
-                () -> new AssistantCollectUserDataCoordinator(mTestRule.getActivity(), model));
+                ()
+                        -> new AssistantCollectUserDataCoordinator(mTestRule.getActivity(), model,
+                                new AssistantStaticDependenciesChrome().createEditorFactory()));
 
         TestThreadUtils.runOnUiThreadBlocking(
                 ()
@@ -136,8 +138,7 @@
         assertThat(model.get(AssistantCollectUserDataModel.AVAILABLE_CONTACTS), empty());
         assertThat(model.get(AssistantCollectUserDataModel.AVAILABLE_SHIPPING_ADDRESSES), empty());
         assertThat(model.get(AssistantCollectUserDataModel.AVAILABLE_PAYMENT_INSTRUMENTS), empty());
-        assertThat(model.get(AssistantCollectUserDataModel.SUPPORTED_BASIC_CARD_NETWORKS),
-                nullValue());
+        assertThat(model.get(AssistantCollectUserDataModel.SUPPORTED_BASIC_CARD_NETWORKS), empty());
         assertThat(model.get(AssistantCollectUserDataModel.EXPANDED_SECTION), nullValue());
         assertThat(model.get(AssistantCollectUserDataModel.DELEGATE), nullValue());
         assertThat(model.get(AssistantCollectUserDataModel.WEB_CONTENTS), nullValue());
@@ -489,66 +490,6 @@
         onView(withId(R.id.editor_container)).check(matches(isDisplayed()));
     }
 
-    @Test
-    @MediumTest
-    public void testPaymentMethodsUpdatesFromWebContents() throws Exception {
-        AssistantCollectUserDataModel model = createCollectUserDataModel();
-        AssistantCollectUserDataCoordinator coordinator = createCollectUserDataCoordinator(model);
-        AutofillAssistantCollectUserDataTestHelper
-                .ViewHolder viewHolder = TestThreadUtils.runOnUiThreadBlocking(
-                () -> new AutofillAssistantCollectUserDataTestHelper.ViewHolder(coordinator));
-
-        PersonalDataManager.AutofillProfile billingAddress =
-                mHelper.createDummyProfile("Jill Doe", "jill@gmail.com");
-        String billingAddressId = mHelper.setProfile(billingAddress);
-        PersonalDataManager.CreditCard creditCard = mHelper.createDummyCreditCard(billingAddressId);
-
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            // WEB_CONTENTS are necessary for the creation of the editors.
-            model.set(AssistantCollectUserDataModel.WEB_CONTENTS, mTestRule.getWebContents());
-            model.set(AssistantCollectUserDataModel.REQUEST_PAYMENT, true);
-            model.set(AssistantCollectUserDataModel.VISIBLE, true);
-            AssistantPaymentInstrument paymentInstrument =
-                    AssistantCollectUserDataModel.createAssistantPaymentInstrument(
-                            createDummyCreditCard(creditCard), createDummyAddress(billingAddress));
-            model.set(AssistantCollectUserDataModel.AVAILABLE_PAYMENT_INSTRUMENTS,
-                    Collections.singletonList(new PaymentInstrumentModel(paymentInstrument)));
-            model.set(AssistantCollectUserDataModel.SELECTED_PAYMENT_INSTRUMENT,
-                    new PaymentInstrumentModel(paymentInstrument));
-        });
-
-        // Payment method section contains the new credit card, which should be pre-selected.
-        onView(allOf(withId(R.id.section_title_add_button),
-                       isDescendantOfA(is(viewHolder.mPaymentSection))))
-                .check(matches(not(isDisplayed())));
-        assertThat(viewHolder.mPaymentMethodList.getItemCount(), is(1));
-        onView(allOf(withId(R.id.credit_card_name),
-                       isDescendantOfA(is(viewHolder.mPaymentMethodList.getItem(0)))))
-                .check(matches(withText("Jill Doe")));
-
-        // Detach WebContents. Section should be empty again.
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> { model.set(AssistantCollectUserDataModel.WEB_CONTENTS, null); });
-
-        onView(allOf(withId(R.id.section_title_add_button),
-                       isDescendantOfA(is(viewHolder.mPaymentSection))))
-                .check(matches(isDisplayed()));
-        assertThat(viewHolder.mPaymentMethodList.getItemCount(), is(0));
-
-        // Attach WebContents again. Section should be filled.
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            model.set(AssistantCollectUserDataModel.WEB_CONTENTS, mTestRule.getWebContents());
-        });
-
-        onView(allOf(withId(R.id.section_title_add_button),
-                       isDescendantOfA(is(viewHolder.mPaymentSection))))
-                .check(matches(not(isDisplayed())));
-        assertThat(viewHolder.mPaymentMethodList.getItemCount(), is(1));
-        onView(allOf(withId(R.id.credit_card_name),
-                       isDescendantOfA(is(viewHolder.mPaymentMethodList.getItem(0)))))
-                .check(matches(withText("Jill Doe")));
-    }
-
     /**
      * Test assumptions about a payment request for a personal data manager with a complete profile
      * and payment method, i.e., all PR sections should be non-empty.
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTest.java
index 31fbacc1..d4aac60d1 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTest.java
@@ -120,7 +120,8 @@
                     staticDependencies.getAccessibilityUtil(),
                     staticDependencies.createInfoPageUtil(),
                     staticDependencies.createProfileImageUtilOrNull(
-                            getActivity(), R.dimen.autofill_assistant_profile_size));
+                            getActivity(), R.dimen.autofill_assistant_profile_size),
+                    staticDependencies.createEditorFactory());
             coordinator.show();
             return coordinator;
         });
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAddressEditorAutofill.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAddressEditorAutofill.java
new file mode 100644
index 0000000..91df573
--- /dev/null
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAddressEditorAutofill.java
@@ -0,0 +1,59 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill_assistant;
+
+import android.app.Activity;
+import android.content.Context;
+
+import androidx.annotation.Nullable;
+
+import org.chromium.base.Callback;
+import org.chromium.chrome.browser.autofill.prefeditor.EditorDialog;
+import org.chromium.chrome.browser.autofill.settings.AddressEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditor.AssistantAddressEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.AddressModel;
+import org.chromium.chrome.browser.payments.AutofillAddress;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.content_public.browser.WebContents;
+
+/**
+ * Editor for addresses in Chrome using Autofill as a base.
+ */
+public class AssistantAddressEditorAutofill implements AssistantAddressEditor {
+    private final AddressEditor mEditor;
+    private final Context mContext;
+
+    public AssistantAddressEditorAutofill(
+            WebContents webContents, Activity activity, boolean shouldStoreChanges) {
+        mEditor = new AddressEditor(AddressEditor.Purpose.AUTOFILL_ASSISTANT,
+                /* saveToDisk= */ shouldStoreChanges);
+        mEditor.setEditorDialog(new EditorDialog(activity,
+                /* deleteRunnable= */ null, Profile.fromWebContents(webContents)));
+        mContext = activity;
+    }
+
+    @Override
+    public void createOrEditItem(@Nullable AddressModel oldItem,
+            Callback<AddressModel> doneCallback, Callback<AddressModel> cancelCallback) {
+        @Nullable
+        AutofillAddress address = oldItem == null
+                ? null
+                : AssistantAutofillUtilChrome.assistantAutofillProfileToAutofillAddress(
+                        oldItem.mOption, mContext);
+
+        Callback<AutofillAddress> editorDoneCallback = editedAddress -> {
+            assert (editedAddress != null && editedAddress.isComplete()
+                    && editedAddress.getProfile() != null);
+            doneCallback.onResult(new AddressModel(
+                    AssistantAutofillUtilChrome.autofillProfileToAssistantAutofillProfile(
+                            editedAddress.getProfile())));
+        };
+
+        Callback<AutofillAddress> editorCancelCallback =
+                editedAddress -> cancelCallback.onResult(oldItem);
+
+        mEditor.edit(address, editorDoneCallback, editorCancelCallback);
+    }
+}
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AutofillUtilChrome.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillUtilChrome.java
similarity index 95%
rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AutofillUtilChrome.java
rename to chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillUtilChrome.java
index 8e0e10e6..0347a52 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AutofillUtilChrome.java
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillUtilChrome.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.autofill_assistant.user_data;
+package org.chromium.chrome.browser.autofill_assistant;
 
 import android.content.Context;
 
@@ -11,9 +11,6 @@
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
-import org.chromium.chrome.browser.autofill_assistant.AssistantAutofillCreditCard;
-import org.chromium.chrome.browser.autofill_assistant.AssistantAutofillProfile;
-import org.chromium.chrome.browser.autofill_assistant.AssistantPaymentInstrument;
 import org.chromium.chrome.browser.payments.AutofillAddress;
 import org.chromium.chrome.browser.payments.AutofillAddress.CompletenessCheckType;
 import org.chromium.chrome.browser.payments.AutofillContact;
@@ -25,7 +22,7 @@
 /**
  * Utility class for Chrome to handle Autofill / Assistant conversions.
  */
-public class AutofillUtilChrome {
+public class AssistantAutofillUtilChrome {
     /**
      * Transform an {@link AssistantAutofillProfile} to an {@link AutofillProfile}.
      *
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantContactEditorAutofill.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantContactEditorAutofill.java
new file mode 100644
index 0000000..0930623
--- /dev/null
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantContactEditorAutofill.java
@@ -0,0 +1,72 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill_assistant;
+
+import android.app.Activity;
+import android.content.Context;
+
+import androidx.annotation.Nullable;
+
+import org.chromium.base.Callback;
+import org.chromium.chrome.browser.autofill.prefeditor.EditorDialog;
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditor.AssistantContactEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.ContactModel;
+import org.chromium.chrome.browser.payments.AutofillContact;
+import org.chromium.chrome.browser.payments.ContactEditor;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.content_public.browser.WebContents;
+
+/**
+ * Editor for contact information in Chrome using Autofill as a base.
+ */
+class AssistantContactEditorAutofill implements AssistantContactEditor {
+    private final ContactEditor mEditor;
+    private final Context mContext;
+
+    public AssistantContactEditorAutofill(WebContents webContents, Activity activity,
+            boolean requestName, boolean requestPhone, boolean requestEmail,
+            boolean shouldStoreChanges) {
+        mEditor = new ContactEditor(requestName, requestPhone, requestEmail,
+                /* saveToDisk= */ shouldStoreChanges);
+        mEditor.setEditorDialog(new EditorDialog(activity,
+                /*deleteRunnable =*/null, Profile.fromWebContents(webContents)));
+        mContext = activity;
+    }
+
+    @Override
+    public void createOrEditItem(@Nullable ContactModel oldItem,
+            Callback<ContactModel> doneCallback, Callback<ContactModel> cancelCallback) {
+        @Nullable
+        AutofillContact contact = oldItem == null
+                ? null
+                : AssistantAutofillUtilChrome.assistantAutofillProfileToAutofillContact(
+                        oldItem.mOption, mContext, mEditor);
+
+        Callback<AutofillContact> editorDoneCallback = editedContact -> {
+            assert (editedContact != null && editedContact.isComplete()
+                    && editedContact.getProfile() != null);
+            doneCallback.onResult(new ContactModel(
+                    AssistantAutofillUtilChrome.autofillProfileToAssistantAutofillProfile(
+                            editedContact.getProfile())));
+        };
+
+        Callback<AutofillContact> editorCancelCallback =
+                editedContact -> cancelCallback.onResult(oldItem);
+
+        mEditor.edit(contact, editorDoneCallback, editorCancelCallback);
+    }
+
+    /**
+     * Adds the contact's information to the editor such that it can be auto-completed while typing.
+     *
+     * @param contact The {@link AssistantAutofillProfile} to add information for.
+     */
+    @Override
+    public void addContactInformationForAutocomplete(AssistantAutofillProfile contact) {
+        mEditor.addEmailAddressIfValid(contact.getEmailAddress());
+        mEditor.addPayerNameIfValid(contact.getFullName());
+        mEditor.addPhoneNumberIfValid(contact.getPhoneNumber());
+    }
+}
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantEditor.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantEditor.java
new file mode 100644
index 0000000..66a6031
--- /dev/null
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantEditor.java
@@ -0,0 +1,60 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill_assistant;
+
+import androidx.annotation.Nullable;
+
+import org.chromium.base.Callback;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.AddressModel;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.ContactModel;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.PaymentInstrumentModel;
+
+/**
+ * Generic Editor interface.
+ *
+ * @param <T> The type of {@link AssistantOptionModel} this editor will operate on.
+ */
+public interface AssistantEditor<T extends AssistantOptionModel> {
+    /**
+     * Create or edit an item. If |oldItem| is null, a new item is being created, otherwise the
+     * provided item is edited. The |callback| is invoked with the new item after the editor is
+     * closed with saving the changes.
+     *
+     * @param oldItem The item to be edited, can be null in which case a new item is created.
+     * @param doneCallback Called after the editor is closed, assuming that the item has been
+     *                     successfully edited.
+     * @param cancelCallback Called after the editor is closed, assuming that the edit has been
+     *                       abandoned.
+     */
+    void createOrEditItem(
+            @Nullable T oldItem, Callback<T> doneCallback, Callback<T> cancelCallback);
+
+    /**
+     * Editor for {@link ContactModel}.
+     */
+    interface AssistantContactEditor extends AssistantEditor<ContactModel> {
+        /**
+         * Adds information from the contact to the UI of the editor.
+         * @param contact The {@link AssistantAutofillProfile} to add information for.
+         */
+        void addContactInformationForAutocomplete(AssistantAutofillProfile contact);
+    }
+
+    /**
+     * Editor for {@link AddressModel}.
+     */
+    interface AssistantAddressEditor extends AssistantEditor<AddressModel> {}
+
+    /**
+     * Editor for {@link PaymentInstrumentModel}.
+     */
+    interface AssistantPaymentInstrumentEditor extends AssistantEditor<PaymentInstrumentModel> {
+        /**
+         * Adds information from the address to the UI of the editor.
+         * @param address The {@link AssistantAutofillProfile} to add information for.
+         */
+        void addAddressInformationForAutocomplete(AssistantAutofillProfile address);
+    }
+}
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantEditorFactory.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantEditorFactory.java
new file mode 100644
index 0000000..46eeaf4d
--- /dev/null
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantEditorFactory.java
@@ -0,0 +1,30 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill_assistant;
+
+import android.app.Activity;
+
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditor.AssistantAddressEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditor.AssistantContactEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditor.AssistantPaymentInstrumentEditor;
+import org.chromium.content_public.browser.WebContents;
+
+import java.util.List;
+
+/**
+ * Factory for creating editors. Implementations might differ depending on where Autofill
+ * Assistant is running (e.g. WebLayer, Chrome).
+ */
+public interface AssistantEditorFactory {
+    AssistantContactEditor createContactEditor(WebContents webContents, Activity activity,
+            boolean requestName, boolean requestPhone, boolean requestEmail,
+            boolean shouldStoreChanges);
+
+    AssistantAddressEditor createAddressEditor(
+            WebContents webContents, Activity activity, boolean shouldStoreChanges);
+
+    AssistantPaymentInstrumentEditor createPaymentInstrumentEditor(WebContents webContents,
+            Activity activity, List<String> supportedCardNetworks, boolean shouldStoreChanges);
+}
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantEditorFactoryChrome.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantEditorFactoryChrome.java
new file mode 100644
index 0000000..e667afc
--- /dev/null
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantEditorFactoryChrome.java
@@ -0,0 +1,40 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill_assistant;
+
+import android.app.Activity;
+
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditor.AssistantAddressEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditor.AssistantContactEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditor.AssistantPaymentInstrumentEditor;
+import org.chromium.content_public.browser.WebContents;
+
+import java.util.List;
+
+/**
+ * Factory to create editors within Chrome.
+ */
+public class AssistantEditorFactoryChrome implements AssistantEditorFactory {
+    @Override
+    public AssistantContactEditor createContactEditor(WebContents webContents, Activity activity,
+            boolean requestName, boolean requestPhone, boolean requestEmail,
+            boolean shouldStoreChanges) {
+        return new AssistantContactEditorAutofill(
+                webContents, activity, requestName, requestPhone, requestEmail, shouldStoreChanges);
+    }
+
+    @Override
+    public AssistantAddressEditor createAddressEditor(
+            WebContents webContents, Activity activity, boolean shouldStoreChanges) {
+        return new AssistantAddressEditorAutofill(webContents, activity, shouldStoreChanges);
+    }
+
+    @Override
+    public AssistantPaymentInstrumentEditor createPaymentInstrumentEditor(WebContents webContents,
+            Activity activity, List<String> supportedCardNetworks, boolean shouldStoreChanges) {
+        return new AssistantPaymentInstrumentEditorAutofill(
+                webContents, activity, supportedCardNetworks, shouldStoreChanges);
+    }
+}
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantOptionModel.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantOptionModel.java
new file mode 100644
index 0000000..b2cab6ad
--- /dev/null
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantOptionModel.java
@@ -0,0 +1,76 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill_assistant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Model wrapper for a data item to contain errors.
+ *
+ * @param <T> The type that an instance of this class is created for, such as
+ *            {@link AssistantAutofillProfile}, {@link AssistantPaymentInstrument}, etc.
+ */
+public abstract class AssistantOptionModel<T> {
+    public T mOption;
+    public List<String> mErrors;
+
+    public AssistantOptionModel(T option, List<String> errors) {
+        this.mOption = option;
+        this.mErrors = errors;
+    }
+
+    public AssistantOptionModel(T option) {
+        this(option, new ArrayList<>());
+    }
+
+    public boolean isComplete() {
+        return mErrors.isEmpty();
+    }
+
+    /** Model wrapper for an {@link AssistantAutofillProfile}. */
+    public static class ContactModel extends AssistantOptionModel<AssistantAutofillProfile> {
+        private final boolean mCanEdit;
+
+        public ContactModel(
+                AssistantAutofillProfile contact, List<String> errors, boolean canEdit) {
+            super(contact, errors);
+            mCanEdit = canEdit;
+        }
+
+        public ContactModel(AssistantAutofillProfile contact) {
+            super(contact);
+            mCanEdit = true;
+        }
+
+        public boolean canEdit() {
+            return mCanEdit;
+        }
+    }
+
+    /** Model wrapper for an {@link AssistantAutofillProfile}. */
+    public static class AddressModel extends AssistantOptionModel<AssistantAutofillProfile> {
+        public AddressModel(AssistantAutofillProfile address, List<String> errors) {
+            super(address, errors);
+        }
+
+        public AddressModel(AssistantAutofillProfile address) {
+            super(address);
+        }
+    }
+
+    /** Model wrapper for an {@code AssistantPaymentInstrument}. */
+    public static class PaymentInstrumentModel
+            extends AssistantOptionModel<AssistantPaymentInstrument> {
+        public PaymentInstrumentModel(
+                AssistantPaymentInstrument paymentInstrument, List<String> errors) {
+            super(paymentInstrument, errors);
+        }
+
+        public PaymentInstrumentModel(AssistantPaymentInstrument paymentInstrument) {
+            super(paymentInstrument);
+        }
+    }
+}
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantPaymentInstrumentEditorAutofill.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantPaymentInstrumentEditorAutofill.java
new file mode 100644
index 0000000..3647fd1
--- /dev/null
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantPaymentInstrumentEditorAutofill.java
@@ -0,0 +1,149 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill_assistant;
+
+import android.app.Activity;
+import android.content.Context;
+
+import androidx.annotation.Nullable;
+
+import org.chromium.base.Callback;
+import org.chromium.chrome.browser.autofill.prefeditor.EditorDialog;
+import org.chromium.chrome.browser.autofill.settings.AddressEditor;
+import org.chromium.chrome.browser.autofill.settings.CardEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantEditor.AssistantPaymentInstrumentEditor;
+import org.chromium.chrome.browser.autofill_assistant.AssistantOptionModel.PaymentInstrumentModel;
+import org.chromium.chrome.browser.payments.AutofillAddress;
+import org.chromium.chrome.browser.payments.AutofillPaymentInstrument;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.components.version_info.VersionInfo;
+import org.chromium.content_public.browser.WebContents;
+import org.chromium.payments.mojom.BasicCardNetwork;
+import org.chromium.payments.mojom.PaymentMethodData;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Editor for credit cards in Chrome using Autofill as a base.
+ */
+public class AssistantPaymentInstrumentEditorAutofill implements AssistantPaymentInstrumentEditor {
+    private static final String BASIC_CARD = "basic-card";
+
+    private final WebContents mWebContents;
+    private final Context mContext;
+    private final CardEditor mEditor;
+    private final AddressEditor mAddressEditor;
+
+    public AssistantPaymentInstrumentEditorAutofill(WebContents webContents, Activity activity,
+            List<String> supportedCardNetworks, boolean shouldStoreChanges) {
+        mWebContents = webContents;
+        mContext = activity;
+
+        Profile profile = Profile.fromWebContents(webContents);
+
+        mAddressEditor = new AddressEditor(AddressEditor.Purpose.AUTOFILL_ASSISTANT,
+                /* saveToDisk= */ shouldStoreChanges);
+        mAddressEditor.setEditorDialog(new EditorDialog(activity,
+                /* deleteRunnable= */ null, profile));
+
+        mEditor = new CardEditor(webContents, mAddressEditor,
+                /* includeOrgLabel= */ false, /* saveToDisk= */ shouldStoreChanges);
+        EditorDialog cardEditorDialog = new EditorDialog(activity,
+                /*deleteRunnable =*/null, profile);
+        if (VersionInfo.isBetaBuild() || VersionInfo.isStableBuild()) {
+            cardEditorDialog.disableScreenshots();
+        }
+        mEditor.setEditorDialog(cardEditorDialog);
+
+        mEditor.addAcceptedPaymentMethodIfRecognized(
+                getPaymentMethodDataFromNetworks(supportedCardNetworks));
+    }
+
+    private PaymentMethodData getPaymentMethodDataFromNetworks(List<String> supportedCardNetworks) {
+        // Only enable 'basic-card' payment method.
+        PaymentMethodData methodData = new PaymentMethodData();
+        methodData.supportedMethod = BASIC_CARD;
+
+        // Apply basic-card filter if specified
+        if (!supportedCardNetworks.isEmpty()) {
+            ArrayList<Integer> filteredNetworks = new ArrayList<>();
+            Map<String, Integer> networks = getNetworkIdentifiers();
+            for (String network : supportedCardNetworks) {
+                assert networks.containsKey(network);
+                if (networks.containsKey(network)) {
+                    filteredNetworks.add(networks.get(network));
+                }
+            }
+
+            methodData.supportedNetworks = new int[filteredNetworks.size()];
+            for (int i = 0; i < filteredNetworks.size(); ++i) {
+                methodData.supportedNetworks[i] = filteredNetworks.get(i);
+            }
+        }
+
+        return methodData;
+    }
+
+    private static Map<String, Integer> getNetworkIdentifiers() {
+        Map<String, Integer> networks = new HashMap<>();
+        networks.put("amex", BasicCardNetwork.AMEX);
+        networks.put("diners", BasicCardNetwork.DINERS);
+        networks.put("discover", BasicCardNetwork.DISCOVER);
+        networks.put("jcb", BasicCardNetwork.JCB);
+        networks.put("mastercard", BasicCardNetwork.MASTERCARD);
+        networks.put("mir", BasicCardNetwork.MIR);
+        networks.put("unionpay", BasicCardNetwork.UNIONPAY);
+        networks.put("visa", BasicCardNetwork.VISA);
+        return networks;
+    }
+
+    @Override
+    public void createOrEditItem(@Nullable PaymentInstrumentModel oldItem,
+            Callback<PaymentInstrumentModel> doneCallback,
+            Callback<PaymentInstrumentModel> cancelCallback) {
+        @Nullable
+        AutofillPaymentInstrument paymentInstrument = oldItem == null
+                ? null
+                : AssistantAutofillUtilChrome.assistantPaymentInstrumentToAutofillPaymentInstrument(
+                        oldItem.mOption, mWebContents);
+
+        Callback<AutofillPaymentInstrument> editorDoneCallback = editedPaymentInstrument -> {
+            assert (editedPaymentInstrument != null && editedPaymentInstrument.isComplete()
+                    && editedPaymentInstrument.getCard() != null);
+            doneCallback.onResult(new PaymentInstrumentModel(
+                    AssistantAutofillUtilChrome
+                            .autofillPaymentInstrumentToAssistantPaymentInstrument(
+                                    editedPaymentInstrument)));
+        };
+
+        Callback<AutofillPaymentInstrument> editorCancelCallback =
+                editedPaymentInstrument -> cancelCallback.onResult(oldItem);
+
+        mEditor.edit(paymentInstrument, editorDoneCallback, editorCancelCallback);
+    }
+
+    /**
+     * Adds the address's information to the editor, such that it can be selected as a billing
+     * address for the card.
+     *
+     * @param address The {@link AssistantAutofillProfile} to add information for.
+     */
+    @Override
+    public void addAddressInformationForAutocomplete(AssistantAutofillProfile address) {
+        mAddressEditor.addPhoneNumberIfValid(address.getPhoneNumber());
+
+        AutofillAddress autofillAddress =
+                AssistantAutofillUtilChrome.assistantAutofillProfileToAutofillAddress(
+                        address, mContext);
+        if (autofillAddress.getProfile().getLabel() == null) {
+            autofillAddress.getProfile().setLabel(
+                    AssistantAutofillUtilChrome.getBillingAddressLabel(address));
+        }
+        mEditor.updateBillingAddressIfComplete(autofillAddress);
+    }
+}
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantStaticDependencies.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantStaticDependencies.java
index 2e7bb6d..f50d1da 100644
--- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantStaticDependencies.java
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantStaticDependencies.java
@@ -22,7 +22,7 @@
 @JNINamespace("autofill_assistant")
 public interface AssistantStaticDependencies {
     @CalledByNative
-    long getNativePointer();
+    long createNative();
 
     /**
      * Create the Activity specific dependencies.
@@ -54,4 +54,6 @@
     @Nullable
     AssistantProfileImageUtil createProfileImageUtilOrNull(
             Context context, @DimenRes int imageSizeRedId);
+
+    AssistantEditorFactory createEditorFactory();
 }
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantStaticDependenciesChrome.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantStaticDependenciesChrome.java
index 74d35e7..b011353 100644
--- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantStaticDependenciesChrome.java
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantStaticDependenciesChrome.java
@@ -31,11 +31,9 @@
     private long mNativePointer;
 
     @Override
-    public long getNativePointer() {
-        if (mNativePointer == 0) {
-            mNativePointer = AssistantStaticDependenciesChromeJni.get().init(this);
-        }
-        return mNativePointer;
+    public long createNative() {
+        return AssistantStaticDependenciesChromeJni.get().init(
+                new AssistantStaticDependenciesChrome());
     }
 
     @Override
@@ -100,6 +98,11 @@
         return new AssistantProfileImageUtilChrome(context, signedInAccountEmail, imageSizeRedId);
     }
 
+    @Override
+    public AssistantEditorFactory createEditorFactory() {
+        return new AssistantEditorFactoryChrome();
+    }
+
     @NativeMethods
     interface Natives {
         long init(AssistantStaticDependencies staticDependencies);
diff --git a/chrome/android/features/autofill_assistant/public/java_sources.gni b/chrome/android/features/autofill_assistant/public/java_sources.gni
index e730039..9ef7fd0 100644
--- a/chrome/android/features/autofill_assistant/public/java_sources.gni
+++ b/chrome/android/features/autofill_assistant/public/java_sources.gni
@@ -5,14 +5,20 @@
 public_autofill_assistant_java_sources = [
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAccessTokenUtil.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAccessTokenUtilChrome.java",
+  "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAddressEditorAutofill.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillCreditCard.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillProfile.java",
+  "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillUtilChrome.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBrowserControls.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBrowserControlsChrome.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBrowserControlsFactory.java",
+  "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantContactEditorAutofill.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantDependencies.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantDependenciesChrome.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantDependencyUtilsChrome.java",
+  "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantEditor.java",
+  "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantEditorFactory.java",
+  "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantEditorFactoryChrome.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantFeatures.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantFeedbackUtil.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantFeedbackUtilChrome.java",
@@ -23,7 +29,9 @@
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantModuleInstallUi.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantModuleInstallUiProviderChrome.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelper.java",
+  "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantOptionModel.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantPaymentInstrument.java",
+  "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantPaymentInstrumentEditorAutofill.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantProfileImageUtil.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantProfileImageUtilChrome.java",
   "//chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantSnackbar.java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java
index 0e2d4c3..f7a1705 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java
@@ -164,7 +164,7 @@
         offlineItem.totalSizeBytes = downloadInfo.getBytesTotalSize();
         offlineItem.receivedBytes = downloadInfo.getBytesReceived();
         offlineItem.isResumable = downloadInfo.isResumable();
-        offlineItem.url = downloadInfo.getUrl() == null ? null : downloadInfo.getUrl().getSpec();
+        offlineItem.url = downloadInfo.getUrl();
         offlineItem.originalUrl = downloadInfo.getOriginalUrl();
         offlineItem.isOffTheRecord = downloadInfo.isOffTheRecord();
         offlineItem.otrProfileId = OTRProfileID.serialize(downloadInfo.getOTRProfileId());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
index dd965f7..c12d670e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
@@ -7,10 +7,10 @@
 import static org.chromium.components.webapk.lib.common.WebApkConstants.WEBAPK_PACKAGE_PREFIX;
 
 import android.content.Context;
-import android.graphics.Bitmap;
 import android.os.Handler;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
+import android.util.Pair;
 
 import org.chromium.base.Callback;
 import org.chromium.base.CommandLine;
@@ -19,6 +19,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.task.AsyncTask;
 import org.chromium.blink.mojom.DisplayMode;
 import org.chromium.chrome.browser.ActivityTabProvider;
 import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider;
@@ -313,7 +314,7 @@
             scheduleUpdate();
         };
         String updateRequestPath = mStorage.createAndSetUpdateRequestFilePath(info);
-        storeWebApkUpdateRequestToFile(updateRequestPath, info, primaryIconUrl, splashIconUrl,
+        encodeIconsInBackground(updateRequestPath, info, primaryIconUrl, splashIconUrl,
                 isManifestStale, appIdentityUpdateSupported, updateReasons, callback);
     }
 
@@ -544,10 +545,32 @@
         return null;
     }
 
-    protected void storeWebApkUpdateRequestToFile(String updateRequestPath, WebappInfo info,
+    // Encode the icons in a background process since encoding is expensive.
+    protected void encodeIconsInBackground(String updateRequestPath, WebappInfo info,
             String primaryIconUrl, String splashIconUrl, boolean isManifestStale,
             boolean isAppIdentityUpdateSupported, List<Integer> updateReasons,
             Callback<Boolean> callback) {
+        new AsyncTask<Pair<String, String>>() {
+            @Override
+            protected Pair<String, String> doInBackground() {
+                String primaryIconData = info.icon().encoded();
+                String splashIconData = info.splashIcon().encoded();
+                return Pair.create(primaryIconData, splashIconData);
+            }
+
+            @Override
+            protected void onPostExecute(Pair<String, String> result) {
+                storeWebApkUpdateRequestToFile(updateRequestPath, info, primaryIconUrl,
+                        result.first, splashIconUrl, result.second, isManifestStale,
+                        isAppIdentityUpdateSupported, updateReasons, callback);
+            }
+        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+    }
+
+    protected void storeWebApkUpdateRequestToFile(String updateRequestPath, WebappInfo info,
+            String primaryIconUrl, String primaryIconData, String splashIconUrl,
+            String splashIconData, boolean isManifestStale, boolean isAppIdentityUpdateSupported,
+            List<Integer> updateReasons, Callback<Boolean> callback) {
         int versionCode = info.webApkVersionCode();
         int size = info.iconUrlToMurmur2HashMap().size();
         String[] iconUrls = new String[size];
@@ -594,8 +617,8 @@
 
         WebApkUpdateManagerJni.get().storeWebApkUpdateRequestToFile(updateRequestPath,
                 info.manifestStartUrl(), info.scopeUrl(), info.name(), info.shortName(),
-                primaryIconUrl, info.icon().bitmap(), info.isIconAdaptive(), splashIconUrl,
-                info.splashIcon().bitmap(), info.isSplashIconMaskable(), iconUrls, iconHashes,
+                primaryIconUrl, primaryIconData, info.isIconAdaptive(), splashIconUrl,
+                splashIconData, info.isSplashIconMaskable(), iconUrls, iconHashes,
                 info.displayMode(), info.orientation(), info.toolbarColor(), info.backgroundColor(),
                 shareTargetAction, shareTargetParamTitle, shareTargetParamText,
                 shareTargetIsMethodPost, shareTargetIsEncTypeMultipart, shareTargetParamFileNames,
@@ -608,8 +631,8 @@
     interface Natives {
         public void storeWebApkUpdateRequestToFile(String updateRequestPath, String startUrl,
                 String scope, String name, String shortName, String primaryIconUrl,
-                Bitmap primaryIcon, boolean isPrimaryIconMaskable, String splashIconUrl,
-                Bitmap splashIcon, boolean isSplashIconMaskable, String[] iconUrls,
+                String primaryIconData, boolean isPrimaryIconMaskable, String splashIconUrl,
+                String splashIconData, boolean isSplashIconMaskable, String[] iconUrls,
                 String[] iconHashes, @DisplayMode.EnumType int displayMode, int orientation,
                 long themeColor, long backgroundColor, String shareTargetAction,
                 String shareTargetParamTitle, String shareTargetParamText,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadMessageUiControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadMessageUiControllerTest.java
index ac10c242..9b36c2a5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadMessageUiControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadMessageUiControllerTest.java
@@ -29,6 +29,7 @@
 import org.chromium.components.offline_items_collection.OfflineItemSchedule;
 import org.chromium.components.offline_items_collection.OfflineItemState;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.url.JUnitTestGURLs;
 
 import java.util.UUID;
 
@@ -55,7 +56,7 @@
     private static final String MESSAGE_TWO_DOWNLOAD_SCHEDULED = "2 downloads scheduled";
 
     private static final String DESCRIPTION_DOWNLOADING = "See notification for download status";
-    private static final String DESCRIPTION_DOWNLOAD_COMPLETE = "(0.01 KB) example.com";
+    private static final String DESCRIPTION_DOWNLOAD_COMPLETE = "(0.01 KB) www.example.com";
     private static final String DESCRIPTION_DOWNLOAD_SCHEDULED =
             "Download will start when on Wi-Fi";
 
@@ -128,7 +129,7 @@
     private static void markItemComplete(OfflineItem item) {
         item.state = OfflineItemState.COMPLETE;
         item.title = TEST_FILE_NAME;
-        item.url = "https://example.com";
+        item.url = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL);
         item.receivedBytes = 10L;
         item.totalSizeBytes = 10L;
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupUnitTest.java
index dd402c3e..eed3c9f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupUnitTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupUnitTest.java
@@ -115,6 +115,7 @@
     @Test
     @UiThreadTest
     @SmallTest
+    @FlakyTest(message = "https://crbug.com/1292469")
     public void testInitialiseWithTileList() {
         mMostVisitedSites.setTileSuggestions(URLS);
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
index f89b7dcf..59b8e85 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
@@ -124,7 +124,7 @@
         }
 
         @Override
-        protected void storeWebApkUpdateRequestToFile(String updateRequestPath, WebappInfo info,
+        protected void encodeIconsInBackground(String updateRequestPath, WebappInfo info,
                 String primaryIconUrl, String splashIconUrl, boolean isManifestStale,
                 boolean isAppIdentityUpdateSupported, List<Integer> updateReasons,
                 Callback<Boolean> callback) {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/DeferredStartupHandlerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/DeferredStartupHandlerTest.java
index b660407..98c8906 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/DeferredStartupHandlerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/DeferredStartupHandlerTest.java
@@ -12,6 +12,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadow.api.Shadow;
 
 import org.chromium.base.test.util.CallbackHelper;
@@ -22,6 +23,7 @@
  */
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(manifest = Config.NONE, shadows = {ShadowIdleHandlerAwareMessageQueue.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 public class DeferredStartupHandlerTest {
     private DeferredStartupHandler mDeferredStartupHandler;
     private ShadowIdleHandlerAwareMessageQueue mShadowMessageQueue;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java
index b548a01..2384c83 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java
@@ -31,6 +31,7 @@
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.FeatureList;
@@ -91,6 +92,7 @@
  * Unit tests for {@link AppMenuPropertiesDelegateImpl}.
  */
 @RunWith(BaseRobolectricTestRunner.class)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class AppMenuPropertiesDelegateUnitTest {
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
@@ -448,7 +450,6 @@
     public void testOverviewMenuItems_Phone() {
         setUpMocksForOverviewMenu();
         when(mIncognitoTabModel.getCount()).thenReturn(0);
-
         Assert.assertFalse(mAppMenuPropertiesDelegate.shouldShowPageMenu());
         Assert.assertEquals(
                 MenuGroup.OVERVIEW_MODE_MENU, mAppMenuPropertiesDelegate.getMenuGroup());
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java
index 8fe42ea4..97c8b9a 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java
@@ -30,6 +30,7 @@
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.library_loader.LibraryProcessType;
@@ -54,6 +55,7 @@
 /** Unit tests for {@link NativeBackgroundTask}. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class NativeBackgroundTaskTest {
     private enum InitializerSetup {
         SUCCESS,
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/QualityEnforcerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/QualityEnforcerUnitTest.java
index b1fa5e7a..6d083ea 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/QualityEnforcerUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/QualityEnforcerUnitTest.java
@@ -24,6 +24,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowPackageManager;
 import org.robolectric.shadows.ShadowToast;
 
@@ -56,6 +57,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 @EnableFeatures({ChromeFeatureList.TRUSTED_WEB_ACTIVITY_QUALITY_ENFORCEMENT,
         ChromeFeatureList.TRUSTED_WEB_ACTIVITY_QUALITY_ENFORCEMENT_WARNING})
 @DisableFeatures(ChromeFeatureList.TRUSTED_WEB_ACTIVITY_QUALITY_ENFORCEMENT_FORCED)
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappGeolocationBridgeTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappGeolocationBridgeTest.java
index 0c9938a..b2f9621 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappGeolocationBridgeTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappGeolocationBridgeTest.java
@@ -27,6 +27,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Feature;
@@ -41,6 +42,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 @EnableFeatures(ChromeFeatureList.TRUSTED_WEB_ACTIVITY_LOCATION_DELEGATION)
 public class InstalledWebappGeolocationBridgeTest {
     private static final Origin ORIGIN = Origin.create("https://www.website.com");
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/LocationPermissionUpdaterTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/LocationPermissionUpdaterTest.java
index 185f4c4..73b5714 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/LocationPermissionUpdaterTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/LocationPermissionUpdaterTest.java
@@ -25,6 +25,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowPackageManager;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -43,6 +44,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 @EnableFeatures(ChromeFeatureList.TRUSTED_WEB_ACTIVITY_LOCATION_DELEGATION)
 public class LocationPermissionUpdaterTest {
     private static final Origin ORIGIN = Origin.create("https://www.website.com");
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/NotificationPermissionUpdaterTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/NotificationPermissionUpdaterTest.java
index c7c690a..25e14da 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/NotificationPermissionUpdaterTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/NotificationPermissionUpdaterTest.java
@@ -28,6 +28,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowPackageManager;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -42,6 +43,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class NotificationPermissionUpdaterTest {
     private static final Origin ORIGIN = Origin.create("https://www.website.com");
     private static final String PACKAGE_NAME = "com.package.name";
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/childaccounts/ChildAccountServiceTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/childaccounts/ChildAccountServiceTest.java
index 2fd73e8..71a6fa3b 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/childaccounts/ChildAccountServiceTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/childaccounts/ChildAccountServiceTest.java
@@ -25,6 +25,7 @@
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.Callback;
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -41,6 +42,7 @@
  * Unit tests for {@link ChildAccountService}.
  */
 @RunWith(BaseRobolectricTestRunner.class)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class ChildAccountServiceTest {
     private static final Account CHILD_ACCOUNT1 =
             AccountUtils.createAccountFromName("child.account1@gmail.com");
@@ -117,4 +119,4 @@
                 mWindowAndroidMock, CHILD_ACCOUNT1.name, FAKE_NATIVE_CALLBACK);
         verify(mNativeMock).onReauthenticationFailed(FAKE_NATIVE_CALLBACK);
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImplTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImplTest.java
index 82b513fe..c9e208af 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImplTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImplTest.java
@@ -34,6 +34,7 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLooper;
 import org.robolectric.shadows.ShadowSurfaceView;
 
@@ -47,6 +48,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class CompositorSurfaceManagerImplTest {
     @Mock
     private CompositorSurfaceManager.SurfaceManagerCallbackTarget mCallback;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/download/home/FileDeletionQueueTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/download/home/FileDeletionQueueTest.java
index d7ab79f4..fc39107a 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/download/home/FileDeletionQueueTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/download/home/FileDeletionQueueTest.java
@@ -18,6 +18,7 @@
 import org.mockito.junit.MockitoRule;
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLooper;
 
 import org.chromium.base.Callback;
@@ -30,6 +31,7 @@
 /** Unit tests for the FileDeletionQueue class. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class FileDeletionQueueTest {
     @Mock
     public Callback<String> mDeleter;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollectorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollectorTest.java
index d885cfe1..89d59a87 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollectorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollectorTest.java
@@ -34,6 +34,7 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLooper;
 
 import org.chromium.base.Callback;
@@ -53,6 +54,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class ChromeFeedbackCollectorTest {
     @Rule
     public MockitoRule mMockitoRule = MockitoJUnit.rule();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feedback/FeedFeedbackCollectorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feedback/FeedFeedbackCollectorTest.java
index b71f056..1536d85 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/feedback/FeedFeedbackCollectorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/feedback/FeedFeedbackCollectorTest.java
@@ -27,6 +27,7 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLooper;
 
 import org.chromium.base.Callback;
@@ -46,6 +47,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class FeedFeedbackCollectorTest {
     @Rule
     public MockitoRule mMockitoRule = MockitoJUnit.rule();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java
index a9a47133..f95e88c 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java
@@ -21,6 +21,7 @@
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowUserManager;
 
 import org.chromium.base.CommandLine;
@@ -43,6 +44,7 @@
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE,
         shadows = {ShadowRecordHistogram.class, ShadowPostTask.class, ShadowUserManager.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 public class FirstRunAppRestrictionInfoTest {
     private static final List<String> HISTOGRAM_NAMES =
             Arrays.asList("Enterprise.FirstRun.AppRestrictionLoadTime",
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java
index d28ed26..6e03b0a 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java
@@ -26,6 +26,7 @@
 import org.robolectric.Robolectric;
 import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.multidex.ShadowMultiDex;
 
 import org.chromium.base.metrics.UmaRecorder;
@@ -48,6 +49,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE, shadows = {ShadowMultiDex.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 public class FirstRunFlowSequencerTest {
     private static final String ADULT_ACCOUNT_NAME = "adult.account@gmail.com";
     private static final String CHILD_ACCOUNT_NAME =
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/PolicyLoadListenerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/PolicyLoadListenerUnitTest.java
index b150a41..d9bf6ba 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/PolicyLoadListenerUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/PolicyLoadListenerUnitTest.java
@@ -31,6 +31,8 @@
 /** Unit tests for PolicyLoadListener. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE, shadows = {ShadowProcess.class})
+// TODO(crbug.com/1210371): Change to use paused loop. See crbug for details.
+@LooperMode(LooperMode.Mode.LEGACY)
 public class PolicyLoadListenerUnitTest {
     private static final String LOADED_POLICY_READY = "Policy service should be ready to read.";
     private static final String LOADED_NO_POLICY = "Policy should not exist.";
@@ -170,8 +172,6 @@
     }
 
     @Test
-    // TODO(crbug.com/1210371): Change to use paused loop. See crbug for details.
-    @LooperMode(LooperMode.Mode.LEGACY)
     public void testDestroyAfterStart_PolicyInitializedInterleaved() {
         Assert.assertNull(LOADING_NOT_FINISHED, mPolicyLoadListener.onAvailable(mListener));
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/TosDialogBehaviorSharedPrefInvalidatorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/TosDialogBehaviorSharedPrefInvalidatorUnitTest.java
index 533602b..d1fb7f6 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/TosDialogBehaviorSharedPrefInvalidatorUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/TosDialogBehaviorSharedPrefInvalidatorUnitTest.java
@@ -19,6 +19,7 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.Callback;
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -29,6 +30,7 @@
 /** Unit test for {@link TosDialogBehaviorSharedPrefInvalidator}. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class TosDialogBehaviorSharedPrefInvalidatorUnitTest {
     @Rule
     public MockitoRule mMockitoRule = MockitoJUnit.rule();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/init/AsyncInitTaskRunnerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/init/AsyncInitTaskRunnerTest.java
index 200a9d9..98e4d97 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/init/AsyncInitTaskRunnerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/init/AsyncInitTaskRunnerTest.java
@@ -20,6 +20,7 @@
 import org.robolectric.Robolectric;
 import org.robolectric.android.util.concurrent.RoboExecutorService;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.library_loader.LibraryProcessType;
@@ -39,6 +40,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE, shadows = {ShadowAsyncTask.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 public class AsyncInitTaskRunnerTest {
     private static final int THREAD_WAIT_TIME_MS = 1000;
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediatorTest.java
index 37d4a95..fc74c47 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediatorTest.java
@@ -19,6 +19,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.Callback;
 import org.chromium.base.supplier.ObservableSupplier;
@@ -44,6 +45,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class ChromeMessageQueueMediatorTest {
     private static final int EXPECTED_TOKEN = 42;
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/password_manager/settings/DialogManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/password_manager/settings/DialogManagerTest.java
index 9283bb7c..70fc1aa2 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/password_manager/settings/DialogManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/password_manager/settings/DialogManagerTest.java
@@ -22,6 +22,7 @@
 import org.mockito.junit.MockitoRule;
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
 
@@ -33,6 +34,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class DialogManagerTest {
     @Rule
     public MockitoRule mMockitoRule = MockitoJUnit.rule();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/reengagement/ReengagementNotificationControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/reengagement/ReengagementNotificationControllerTest.java
index 058e8b2a..5db94fd 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/reengagement/ReengagementNotificationControllerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/reengagement/ReengagementNotificationControllerTest.java
@@ -29,6 +29,7 @@
 import org.mockito.junit.MockitoRule;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowNotificationManager;
 
 import org.chromium.base.Callback;
@@ -47,6 +48,7 @@
 /** Unit tests for {@link ReengagementNotificationController}. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(shadows = {ShadowNotificationManager.class, ShadowRecordHistogram.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 public class ReengagementNotificationControllerTest {
     @Rule
     public MockitoRule mMockitoRule = MockitoJUnit.rule();
@@ -276,4 +278,4 @@
                 /* isDefaultSystem = */ true, /* hasDefault = */ true, browserCount,
                 /* systemCount = */ 0);
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareRegistrationCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareRegistrationCoordinatorTest.java
index a315b66..471a1a5f 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareRegistrationCoordinatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareRegistrationCoordinatorTest.java
@@ -32,6 +32,7 @@
 import org.mockito.junit.MockitoRule;
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.supplier.Supplier;
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -53,6 +54,7 @@
 /** Tests for ShareRegistrationCoordinator. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class ShareRegistrationCoordinatorTest {
     @Rule
     public TestRule mProcessorRule = new Features.JUnitProcessor();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java
index 00ae96a..74cc71a3 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java
@@ -23,6 +23,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.stubbing.Answer;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.JniMocker;
@@ -49,6 +50,7 @@
 
 /** Tests for {@link SigninManagerImpl}. */
 @RunWith(BaseRobolectricTestRunner.class)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class SigninManagerImplTest {
     private static final long NATIVE_SIGNIN_MANAGER = 10001L;
     private static final long NATIVE_IDENTITY_MANAGER = 10002L;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelperTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelperTest.java
index 4191cd6..981934cf 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelperTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelperTest.java
@@ -15,6 +15,7 @@
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.UserDataHost;
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -30,6 +31,7 @@
 /** Unit tests for {@link TabBrowserControlsConstraintsHelper}. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class TabBrowserControlsConstraintsHelperTest {
     private final UserDataHost mUserDataHost = new UserDataHost();
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java
index 3623966..c00a0d4b 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java
@@ -17,6 +17,7 @@
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -26,6 +27,7 @@
 
 /** Unit tests for the TabViewAndroidDelegate. */
 @RunWith(BaseRobolectricTestRunner.class)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class TabViewAndroidDelegateTest {
     private final ArgumentCaptor<TabObserver> mTabObserverCaptor =
             ArgumentCaptor.forClass(TabObserver.class);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tasks/JourneyManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tasks/JourneyManagerTest.java
index 1671289..4ba46323 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/tasks/JourneyManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/tasks/JourneyManagerTest.java
@@ -21,6 +21,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLooper;
 
 import org.chromium.base.ContextUtils;
@@ -47,6 +48,7 @@
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE,
         shadows = {ShadowRecordHistogram.class, BackgroundShadowAsyncTask.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 public final class JourneyManagerTest {
     private static final int LAST_ENGAGEMENT_ELAPSED_MS = 5000;
     private static final int LAST_ENGAGEMENT_ELAPSED_S = 5;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/usage_stats/EventTrackerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/usage_stats/EventTrackerTest.java
index 63bb4e4..feda46f 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/usage_stats/EventTrackerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/usage_stats/EventTrackerTest.java
@@ -19,6 +19,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.Callback;
 import org.chromium.base.Promise;
@@ -33,6 +34,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class EventTrackerTest {
     @Mock
     private UsageStatsBridge mBridge;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java
index 39bcb993..6e6c0503 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java
@@ -148,8 +148,8 @@
         @Override
         public void storeWebApkUpdateRequestToFile(String updateRequestPath, String startUrl,
                 String scope, String name, String shortName, String primaryIconUrl,
-                Bitmap primaryIcon, boolean isPrimaryIconMaskable, String splashIconUrl,
-                Bitmap splashIcon, boolean isSplashIconMaskable, String[] iconUrls,
+                String primaryIconData, boolean isPrimaryIconMaskable, String splashIconUrl,
+                String splashIconData, boolean isSplashIconMaskable, String[] iconUrls,
                 String[] iconHashes, @DisplayMode.EnumType int displayMode, int orientation,
                 long themeColor, long backgroundColor, String shareTargetAction,
                 String shareTargetParamTitle, String shareTargetParamText,
@@ -231,7 +231,8 @@
 
         @Override
         protected void storeWebApkUpdateRequestToFile(String updateRequestPath, WebappInfo info,
-                String primaryIconUrl, String splashIconUrl, boolean isManifestStale,
+                String primaryIconUrl, String primaryIconData, String splashIconUrl,
+                String splashIconData, boolean isManifestStale,
                 boolean isAppIdentityUpdateSupported, List<Integer> updateReasons,
                 Callback<Boolean> callback) {
             mStoreUpdateRequestCallback = callback;
diff --git a/chrome/app/chrome.cml b/chrome/app/chrome.cml
index a4758471..fbf680c 100644
--- a/chrome/app/chrome.cml
+++ b/chrome/app/chrome.cml
@@ -24,6 +24,7 @@
     capabilities: [
         {
             protocol: [
+                "fuchsia.element.Manager",
                 "fuchsia.ui.app.ViewProvider",
             ],
         },
@@ -72,6 +73,7 @@
     expose: [
         {
             protocol: [
+                "fuchsia.element.Manager",
                 "fuchsia.ui.app.ViewProvider",
             ],
             from: "self",
diff --git a/chrome/app/vector_icons/nearby_share.icon b/chrome/app/vector_icons/nearby_share.icon
index 0902bc5..c4b5842 100644
--- a/chrome/app/vector_icons/nearby_share.icon
+++ b/chrome/app/vector_icons/nearby_share.icon
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 CANVAS_DIMENSIONS, 24,
-PATH_COLOR_ARGB, 0xFF, 0x1A, 0x73, 0xE8,
 MOVE_TO, 2.72f, 8.87f,
 CUBIC_TO, 2.24f, 9.32f, 2.23f, 10.07f, 2.69f, 10.54f,
 LINE_TO, 3.89f, 11.78f,
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 5d5e1da..fbe42f07 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1803,6 +1803,8 @@
     "universal_web_contents_observers.h",
     "update_client/chrome_update_query_params_delegate.cc",
     "update_client/chrome_update_query_params_delegate.h",
+    "url_param_filter/url_param_filterer.cc",
+    "url_param_filter/url_param_filterer.h",
     "usb/frame_usb_services.cc",
     "usb/frame_usb_services.h",
     "usb/usb_blocklist.cc",
@@ -1912,6 +1914,7 @@
     ":permissions_proto",
     ":resource_prefetch_predictor_proto",
     ":unexpire_flags",
+    ":url_param_filter_classification_proto",
     "//base",
     "//base:i18n",
     "//base/allocator:buildflags",
@@ -1928,7 +1931,6 @@
     "//chrome/app/vector_icons",
     "//chrome/browser/breadcrumbs",
     "//chrome/browser/browsing_data:constants",
-    "//chrome/browser/commerce:feature_list",
     "//chrome/browser/devtools",
     "//chrome/browser/feature_guide/notifications:public",
     "//chrome/browser/feature_guide/notifications/internal",
@@ -2028,6 +2030,7 @@
     "//components/certificate_transparency:proto",
     "//components/client_hints/browser",
     "//components/cloud_devices/common",
+    "//components/commerce/core:feature_list",
     "//components/component_updater",
     "//components/component_updater:crl_set_remover",
     "//components/component_updater/installer_policies",
@@ -3365,7 +3368,6 @@
       "//chrome/browser/attribution_reporting/android:jni_headers",
       "//chrome/browser/attribution_reporting/android/internal",
       "//chrome/browser/banners/android:jni_headers",
-      "//chrome/browser/commerce:feature_list",
       "//chrome/browser/commerce/merchant_viewer:merchant_signal_db",
       "//chrome/browser/commerce/merchant_viewer:merchant_signal_db_content_proto",
       "//chrome/browser/commerce/merchant_viewer:merchant_viewer_data_manager",
@@ -3430,6 +3432,7 @@
       "//components/browser_ui/util/android",
       "//components/cbor",
       "//components/cdm/browser",
+      "//components/commerce/core:feature_list",
       "//components/commerce/core:proto",
       "//components/component_updater/android:native_background_task_update_scheduler",
       "//components/content_capture/android",
@@ -5902,6 +5905,8 @@
       "first_run/upgrade_util_fuchsia.cc",
       "fuchsia/chrome_browser_main_parts_fuchsia.cc",
       "fuchsia/chrome_browser_main_parts_fuchsia.h",
+      "fuchsia/element_manager_impl.cc",
+      "fuchsia/element_manager_impl.h",
       "fuchsia/switches.cc",
       "fuchsia/switches.h",
       "fullscreen_fuchsia.cc",
@@ -5920,7 +5925,6 @@
     ]
 
     deps += [
-      "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.element",
       "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.ui.app",
       "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.ui.composition",
       "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.ui.scenic",
@@ -5929,6 +5933,8 @@
       "//third_party/fuchsia-sdk/sdk/pkg/sys_cpp",
       "//ui/platform_window",
     ]
+
+    public_deps += [ "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.element" ]
   }
 
   if (is_posix) {
@@ -7327,6 +7333,10 @@
   sources = [ "permissions/crowd_deny.proto" ]
 }
 
+proto_library("url_param_filter_classification_proto") {
+  sources = [ "url_param_filter/url_param_filter_classification.proto" ]
+}
+
 grit("resources") {
   source = "browser_resources.grd"
 
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index a7bb2e8c..87b12eb 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -36,7 +36,6 @@
 #include "chrome/browser/apps/app_discovery_service/app_discovery_features.h"
 #include "chrome/browser/ash/android_sms/android_sms_switches.h"
 #include "chrome/browser/browser_features.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/feature_guide/notifications/feature_notification_guide_service.h"
 #include "chrome/browser/flag_descriptions.h"
 #include "chrome/browser/login_detection/login_detection_util.h"
@@ -82,11 +81,11 @@
 #include "components/browser_sync/browser_sync_switches.h"
 #include "components/browsing_data/core/features.h"
 #include "components/cloud_devices/common/cloud_devices_switches.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/component_updater/component_updater_command_line_config_policy.h"
 #include "components/component_updater/component_updater_switches.h"
 #include "components/content_settings/core/common/features.h"
 #include "components/contextual_search/core/browser/public.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
 #include "components/dom_distiller/core/dom_distiller_features.h"
 #include "components/dom_distiller/core/dom_distiller_switches.h"
 #include "components/download/public/common/download_features.h"
@@ -3713,10 +3712,6 @@
      flag_descriptions::kEnableLoginDetectionDescription, kOsAll,
      FEATURE_VALUE_TYPE(login_detection::kLoginDetection)},
 #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
-    {"enable-save-data", flag_descriptions::kEnableSaveDataName,
-     flag_descriptions::kEnableSaveDataDescription, kOsCrOS | kOsLinux,
-     SINGLE_VALUE_TYPE(
-         data_reduction_proxy::switches::kEnableDataReductionProxy)},
     {"enable-navigation-predictor",
      flag_descriptions::kEnableNavigationPredictorName,
      flag_descriptions::kEnableNavigationPredictorDescription,
@@ -8015,17 +8010,6 @@
     return true;
 #endif  //  BUILDFLAG(IS_CHROMEOS_LACROS)
 
-  // data-reduction-proxy-lo-fi and enable-data-reduction-proxy-lite-page
-  // are only available for Chromium builds and the Canary/Dev/Beta channels.
-  if ((!strcmp("data-reduction-proxy-lo-fi", entry.internal_name) ||
-       !strcmp("enable-data-reduction-proxy-lite-page", entry.internal_name)) &&
-      channel != version_info::Channel::BETA &&
-      channel != version_info::Channel::DEV &&
-      channel != version_info::Channel::CANARY &&
-      channel != version_info::Channel::UNKNOWN) {
-    return true;
-  }
-
   // enable-unsafe-webgpu is only available on Dev/Canary channels.
   if (!strcmp("enable-unsafe-webgpu", entry.internal_name) &&
       channel != version_info::Channel::DEV &&
diff --git a/chrome/browser/android/autofill_assistant/dependencies.cc b/chrome/browser/android/autofill_assistant/dependencies.cc
index 5d034d4..4f0d3eb 100644
--- a/chrome/browser/android/autofill_assistant/dependencies.cc
+++ b/chrome/browser/android/autofill_assistant/dependencies.cc
@@ -26,9 +26,9 @@
 
 std::unique_ptr<Dependencies> Dependencies::CreateFromJavaStaticDependencies(
     ScopedJavaGlobalRef<jobject> jstatic_dependencies) {
-  const jlong object_ptr = Java_AssistantStaticDependencies_getNativePointer(
-      AttachCurrentThread(), jstatic_dependencies);
-  return base::WrapUnique(reinterpret_cast<Dependencies*>(object_ptr));
+  return base::WrapUnique(reinterpret_cast<Dependencies*>(
+      Java_AssistantStaticDependencies_createNative(AttachCurrentThread(),
+                                                    jstatic_dependencies)));
 }
 
 Dependencies::Dependencies(JNIEnv* env,
diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browser/android/bookmarks/bookmark_bridge.cc
index 9ec2e59..d0a025b 100644
--- a/chrome/browser/android/bookmarks/bookmark_bridge.cc
+++ b/chrome/browser/android/bookmarks/bookmark_bridge.cc
@@ -28,7 +28,6 @@
 #include "chrome/browser/android/reading_list/reading_list_manager_factory.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "chrome/browser/bookmarks/managed_bookmark_service_factory.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
 #include "chrome/browser/power_bookmarks/power_bookmark_utils.h"
@@ -45,6 +44,7 @@
 #include "components/bookmarks/common/android/bookmark_type.h"
 #include "components/bookmarks/common/bookmark_pref_names.h"
 #include "components/bookmarks/managed/managed_bookmark_service.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/commerce/core/proto/price_tracking.pb.h"
 #include "components/dom_distiller/core/url_utils.h"
 #include "components/optimization_guide/proto/hints.pb.h"
diff --git a/chrome/browser/android/chrome_backup_agent.cc b/chrome/browser/android/chrome_backup_agent.cc
index b400bb1..366d645 100644
--- a/chrome/browser/android/chrome_backup_agent.cc
+++ b/chrome/browser/android/chrome_backup_agent.cc
@@ -11,14 +11,12 @@
 #include "chrome/android/chrome_jni_headers/ChromeBackupAgentImpl_jni.h"
 #include "chrome/browser/android/chrome_backup_agent.h"
 #include "chrome/browser/profiles/profile_manager.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/sync/base/pref_names.h"
 
 namespace {
 
 const char* backed_up_preferences_[] = {
-    data_reduction_proxy::prefs::kDataSaverEnabled,
     syncer::prefs::kSyncFirstSetupComplete,
     syncer::prefs::kSyncKeepEverythingSynced,
     syncer::prefs::kSyncAutofill,
diff --git a/chrome/browser/android/webapk/webapk_installer.cc b/chrome/browser/android/webapk/webapk_installer.cc
index 06814db..071c9d2b 100644
--- a/chrome/browser/android/webapk/webapk_installer.cc
+++ b/chrome/browser/android/webapk/webapk_installer.cc
@@ -183,9 +183,9 @@
 // static
 void WebApkInstaller::BuildProto(
     const webapps::ShortcutInfo& shortcut_info,
-    const SkBitmap& primary_icon,
+    const std::string& primary_icon_data,
     bool is_primary_icon_maskable,
-    const SkBitmap& splash_icon,
+    const std::string& splash_icon_data,
     const std::string& package_name,
     const std::string& version,
     std::map<std::string, webapps::WebApkIconHasher::Icon>
@@ -196,9 +196,10 @@
   base::PostTaskAndReplyWithResult(
       GetBackgroundTaskRunner().get(), FROM_HERE,
       base::BindOnce(&webapps::BuildProtoInBackground, shortcut_info,
-                     primary_icon, is_primary_icon_maskable, splash_icon,
-                     package_name, version, std::move(icon_url_to_murmur2_hash),
-                     is_manifest_stale, is_app_identity_update_supported,
+                     primary_icon_data, is_primary_icon_maskable,
+                     splash_icon_data, package_name, version,
+                     std::move(icon_url_to_murmur2_hash), is_manifest_stale,
+                     is_app_identity_update_supported,
                      std::vector<webapps::WebApkUpdateReason>()),
       std::move(callback));
 }
@@ -207,9 +208,9 @@
 void WebApkInstaller::StoreUpdateRequestToFile(
     const base::FilePath& update_request_path,
     const webapps::ShortcutInfo& shortcut_info,
-    const SkBitmap& primary_icon,
+    const std::string& primary_icon_data,
     bool is_primary_icon_maskable,
-    const SkBitmap& splash_icon,
+    const std::string& splash_icon_data,
     const std::string& package_name,
     const std::string& version,
     std::map<std::string, webapps::WebApkIconHasher::Icon>
@@ -221,8 +222,8 @@
   base::PostTaskAndReplyWithResult(
       GetBackgroundTaskRunner().get(), FROM_HERE,
       base::BindOnce(&webapps::StoreUpdateRequestToFileInBackground,
-                     update_request_path, shortcut_info, primary_icon,
-                     is_primary_icon_maskable, splash_icon, package_name,
+                     update_request_path, shortcut_info, primary_icon_data,
+                     is_primary_icon_maskable, splash_icon_data, package_name,
                      version, std::move(icon_url_to_murmur2_hash),
                      is_manifest_stale, is_app_identity_update_supported,
                      std::move(update_reasons)),
@@ -546,12 +547,13 @@
         }
         )");
 
-  // Using empty |splash_icon| here because in this code path (WebApk
-  // install), we are using the splash icon data from |hashes|.
+  // Using empty string for |primary_icon_data| and |splash_icon_data| here
+  // because in WebApk installs, we are using the icon data from |hashes|.
   BuildProto(
-      *install_shortcut_info_, install_primary_icon_, is_primary_icon_maskable_,
-      SkBitmap() /* splash_icon */, "" /* package_name */, "" /* version */,
-      std::move(*hashes), false /* is_manifest_stale */,
+      *install_shortcut_info_, std::string() /* primary_icon_data */,
+      is_primary_icon_maskable_, std::string() /* splash_icon_data */,
+      "" /* package_name */, "" /* version */, std::move(*hashes),
+      false /* is_manifest_stale */,
       false /* is_app_identity_update_supported */,
       base::BindOnce(&WebApkInstaller::SendRequest,
                      weak_ptr_factory_.GetWeakPtr(), traffic_annotation));
diff --git a/chrome/browser/android/webapk/webapk_installer.h b/chrome/browser/android/webapk/webapk_installer.h
index 32835410..14171911 100644
--- a/chrome/browser/android/webapk/webapk_installer.h
+++ b/chrome/browser/android/webapk/webapk_installer.h
@@ -120,9 +120,9 @@
   // or install request. Runs |callback| on the calling thread when complete.
   static void BuildProto(
       const webapps::ShortcutInfo& shortcut_info,
-      const SkBitmap& primary_icon,
+      const std::string& primary_icon_data,
       bool is_primary_icon_maskable,
-      const SkBitmap& splash_icon,
+      const std::string& splash_icon_data,
       const std::string& package_name,
       const std::string& version,
       std::map<std::string, webapps::WebApkIconHasher::Icon>
@@ -137,9 +137,9 @@
   static void StoreUpdateRequestToFile(
       const base::FilePath& update_request_path,
       const webapps::ShortcutInfo& shortcut_info,
-      const SkBitmap& primary_icon,
+      const std::string& primary_icon_data,
       bool is_primary_icon_maskable,
-      const SkBitmap& splash_icon,
+      const std::string& splash_icon_data,
       const std::string& package_name,
       const std::string& version,
       std::map<std::string, webapps::WebApkIconHasher::Icon>
diff --git a/chrome/browser/android/webapk/webapk_installer_unittest.cc b/chrome/browser/android/webapk/webapk_installer_unittest.cc
index 4f3791e..df7faf3 100644
--- a/chrome/browser/android/webapk/webapk_installer_unittest.cc
+++ b/chrome/browser/android/webapk/webapk_installer_unittest.cc
@@ -174,10 +174,9 @@
     base::RunLoop run_loop;
     quit_closure_ = run_loop.QuitClosure();
     WebApkInstaller::StoreUpdateRequestToFile(
-        update_request_path, webapps::ShortcutInfo((GURL())), SkBitmap(), false,
-        SkBitmap(), "", "",
-        std::map<std::string, webapps::WebApkIconHasher::Icon>(), false, false,
-        {webapps::WebApkUpdateReason::PRIMARY_ICON_HASH_DIFFERS},
+        update_request_path, webapps::ShortcutInfo((GURL())), "", false, "", "",
+        "", std::map<std::string, webapps::WebApkIconHasher::Icon>(), false,
+        false, {webapps::WebApkUpdateReason::PRIMARY_ICON_HASH_DIFFERS},
         base::BindOnce(&UpdateRequestStorer::OnComplete,
                        base::Unretained(this)));
     run_loop.Run();
@@ -221,14 +220,19 @@
                  const GURL& splash_image_url,
                  std::map<std::string, webapps::WebApkIconHasher::Icon>
                      icon_url_to_murmur2_hash,
+                 const std::string& primary_icon_data,
+                 const std::string& splash_icon_data,
                  bool is_manifest_stale,
                  bool is_app_identity_update_supported,
                  const std::vector<GURL>& best_shortcut_icon_urls) {
     webapps::ShortcutInfo info(GURL::EmptyGURL());
     info.best_primary_icon_url = best_primary_icon_url;
     info.splash_image_url = splash_image_url;
-    info.icon_urls = {best_primary_icon_url.spec(), splash_image_url.spec(),
-                      kUnusedIconPath};
+    if (!best_primary_icon_url.is_empty())
+      info.icon_urls.push_back(best_primary_icon_url.spec());
+    if (!splash_image_url.is_empty())
+      info.icon_urls.push_back(splash_image_url.spec());
+    info.icon_urls.push_back(kUnusedIconPath);
 
     for (const GURL& shortcut_url : best_shortcut_icon_urls) {
       info.best_shortcut_icon_urls.push_back(shortcut_url);
@@ -237,11 +241,9 @@
       info.shortcut_items.back().icons.back().src = shortcut_url;
     }
 
-    SkBitmap primary_icon(gfx::test::CreateBitmap(144, 144));
-    SkBitmap splash_icon(gfx::test::CreateBitmap(72, 72));
     WebApkInstaller::BuildProto(
-        info, primary_icon, false /* is_primary_icon_maskable */, splash_icon,
-        "" /* package_name */, "" /* version */,
+        info, primary_icon_data, false /* is_primary_icon_maskable */,
+        splash_icon_data, "" /* package_name */, "" /* version */,
         std::move(icon_url_to_murmur2_hash), is_manifest_stale,
         is_app_identity_update_supported,
         base::BindOnce(&BuildProtoRunner::OnBuiltWebApkProto,
@@ -556,35 +558,30 @@
   icon_url_to_murmur2_hash[icon_url_1] = {"data1", "1"};
   icon_url_to_murmur2_hash[icon_url_2] = {"data2", "2"};
 
+  std::string primary_icon_data = "data3";
+  std::string splash_icon_data = "data4";
   std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner();
   runner->BuildSync(GURL(), GURL(), std::move(icon_url_to_murmur2_hash),
+                    primary_icon_data, splash_icon_data,
                     true /* is_manifest_stale */,
                     true /* is_app_identity_update_supported */, {});
   webapk::WebApk* webapk_request = runner->GetWebApkRequest();
   ASSERT_NE(nullptr, webapk_request);
 
   webapk::WebAppManifest manifest = webapk_request->manifest();
-  ASSERT_EQ(5, manifest.icons_size());
+  ASSERT_EQ(3, manifest.icons_size());
 
   EXPECT_EQ("", manifest.icons(0).src());
   EXPECT_FALSE(manifest.icons(0).has_hash());
-  EXPECT_TRUE(manifest.icons(0).has_image_data());
+  EXPECT_EQ(manifest.icons(0).image_data(), primary_icon_data);
 
   EXPECT_EQ("", manifest.icons(1).src());
   EXPECT_FALSE(manifest.icons(1).has_hash());
-  EXPECT_TRUE(manifest.icons(1).has_image_data());
+  EXPECT_EQ(manifest.icons(1).image_data(), splash_icon_data);
 
-  EXPECT_EQ("", manifest.icons(2).src());
-  EXPECT_EQ("", manifest.icons(2).hash());
-  EXPECT_TRUE(manifest.icons(2).has_image_data());
-
-  EXPECT_EQ("", manifest.icons(3).src());
-  EXPECT_EQ("", manifest.icons(3).hash());
-  EXPECT_TRUE(manifest.icons(3).has_image_data());
-
-  EXPECT_EQ(kUnusedIconPath, manifest.icons(4).src());
-  EXPECT_FALSE(manifest.icons(4).has_hash());
-  EXPECT_FALSE(manifest.icons(4).has_image_data());
+  EXPECT_EQ(kUnusedIconPath, manifest.icons(2).src());
+  EXPECT_FALSE(manifest.icons(2).has_hash());
+  EXPECT_FALSE(manifest.icons(2).has_image_data());
 }
 
 // Tests a WebApk install or update request is built properly when the Chrome
@@ -606,7 +603,8 @@
 
   std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner();
   runner->BuildSync(GURL(best_primary_icon_url), GURL(best_splash_icon_url),
-                    icon_url_to_murmur2_hash, false /* is_manifest_stale*/,
+                    icon_url_to_murmur2_hash, "" /* primary_icon_data */,
+                    "" /* splash_icon_data */, false /* is_manifest_stale*/,
                     false /* is_app_identity_update_supported */,
                     {GURL(best_shortcut_icon_url)});
   webapk::WebApk* webapk_request = runner->GetWebApkRequest();
@@ -617,19 +615,21 @@
 
   // Check protobuf fields for kBestPrimaryIconUrl.
   EXPECT_EQ(best_primary_icon_url, manifest.icons(0).src());
-  EXPECT_EQ(icon_url_to_murmur2_hash[best_primary_icon_url].hash,
-            manifest.icons(0).hash());
+  EXPECT_EQ(manifest.icons(0).hash(),
+            icon_url_to_murmur2_hash[best_primary_icon_url].hash);
+  EXPECT_EQ(manifest.icons(0).image_data(),
+            icon_url_to_murmur2_hash[best_primary_icon_url].unsafe_data);
   EXPECT_THAT(manifest.icons(0).usages(),
               testing::ElementsAre(webapk::Image::PRIMARY_ICON));
-  EXPECT_TRUE(manifest.icons(0).has_image_data());
 
   // Check protobuf fields for kBestSplashIconUrl.
   EXPECT_EQ(best_splash_icon_url, manifest.icons(1).src());
-  EXPECT_EQ(icon_url_to_murmur2_hash[best_splash_icon_url].hash,
-            manifest.icons(1).hash());
+  EXPECT_EQ(manifest.icons(1).hash(),
+            icon_url_to_murmur2_hash[best_splash_icon_url].hash);
+  EXPECT_EQ(manifest.icons(1).image_data(),
+            icon_url_to_murmur2_hash[best_splash_icon_url].unsafe_data);
   EXPECT_THAT(manifest.icons(1).usages(),
               testing::ElementsAre(webapk::Image::SPLASH_ICON));
-  EXPECT_TRUE(manifest.icons(1).has_image_data());
 
   // Check protobuf fields for unused icon.
   EXPECT_EQ(kUnusedIconPath, manifest.icons(2).src());
@@ -659,7 +659,8 @@
 
   std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner();
   runner->BuildSync(GURL(best_icon_url), GURL(best_icon_url),
-                    icon_url_to_murmur2_hash, false /* is_manifest_stale*/,
+                    icon_url_to_murmur2_hash, "" /* primary_icon_data */,
+                    "" /* splash_icon_data */, false /* is_manifest_stale*/,
                     false /* is_app_identity_update_supported */,
                     {GURL(best_icon_url)});
   webapk::WebApk* webapk_request = runner->GetWebApkRequest();
@@ -670,20 +671,22 @@
 
   // Check protobuf fields for icons.
   EXPECT_EQ(best_icon_url, manifest.icons(0).src());
-  EXPECT_EQ(icon_url_to_murmur2_hash[best_icon_url].hash,
-            manifest.icons(0).hash());
+  EXPECT_EQ(manifest.icons(0).hash(),
+            icon_url_to_murmur2_hash[best_icon_url].hash);
+  EXPECT_EQ(manifest.icons(0).image_data(),
+            icon_url_to_murmur2_hash[best_icon_url].unsafe_data);
   EXPECT_THAT(manifest.icons(0).usages(),
               testing::ElementsAre(webapk::Image::PRIMARY_ICON,
                                    webapk::Image::SPLASH_ICON));
-  EXPECT_TRUE(manifest.icons(0).has_image_data());
 
   EXPECT_EQ(best_icon_url, manifest.icons(1).src());
-  EXPECT_EQ(icon_url_to_murmur2_hash[best_icon_url].hash,
-            manifest.icons(1).hash());
+  EXPECT_EQ(manifest.icons(1).hash(),
+            icon_url_to_murmur2_hash[best_icon_url].hash);
+  EXPECT_EQ(manifest.icons(1).image_data(),
+            icon_url_to_murmur2_hash[best_icon_url].unsafe_data);
   EXPECT_THAT(manifest.icons(1).usages(),
               testing::ElementsAre(webapk::Image::PRIMARY_ICON,
                                    webapk::Image::SPLASH_ICON));
-  EXPECT_TRUE(manifest.icons(1).has_image_data());
 
   // Check protobuf fields for unused icon.
   EXPECT_EQ(kUnusedIconPath, manifest.icons(2).src());
@@ -712,7 +715,8 @@
 
   std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner();
   runner->BuildSync(
-      GURL(), GURL(), icon_url_to_murmur2_hash, false /* is_manifest_stale*/,
+      GURL(), GURL(), icon_url_to_murmur2_hash, "" /* primary_icon_data */,
+      "" /* splash_icon_data */, false /* is_manifest_stale*/,
       false /* is_app_identity_update_supported */,
       {GURL(best_shortcut_icon_url1), GURL(best_shortcut_icon_url2)});
   webapk::WebApk* webapk_request = runner->GetWebApkRequest();
@@ -747,7 +751,8 @@
 
   std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner();
   runner->BuildSync(
-      GURL(), GURL(), icon_url_to_murmur2_hash, false /* is_manifest_stale*/,
+      GURL(), GURL(), icon_url_to_murmur2_hash, "" /* primary_icon_data */,
+      "" /* splash_icon_data */, false /* is_manifest_stale*/,
       false /* is_app_identity_update_supported */,
       {GURL(best_shortcut_icon_url), GURL(best_shortcut_icon_url)});
   webapk::WebApk* webapk_request = runner->GetWebApkRequest();
@@ -782,7 +787,8 @@
 
   std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner();
   runner->BuildSync(GURL(icon_url_1), GURL(best_icon_url),
-                    icon_url_to_murmur2_hash, false /* is_manifest_stale*/,
+                    icon_url_to_murmur2_hash, "" /* primary_icon_data */,
+                    "" /* splash_icon_data */, false /* is_manifest_stale*/,
                     true /* is_app_identity_update_supported */,
                     {GURL(best_icon_url)});
   webapk::WebApk* webapk_request = runner->GetWebApkRequest();
@@ -794,19 +800,21 @@
 
   // Check primary icon fields.
   EXPECT_EQ(icon_url_1, manifest.icons(0).src());
-  EXPECT_EQ(icon_url_to_murmur2_hash[icon_url_1].hash,
-            manifest.icons(0).hash());
+  EXPECT_EQ(manifest.icons(0).hash(),
+            icon_url_to_murmur2_hash[icon_url_1].hash);
+  EXPECT_EQ(manifest.icons(0).image_data(),
+            icon_url_to_murmur2_hash[icon_url_1].unsafe_data);
   EXPECT_THAT(manifest.icons(0).usages(),
               testing::ElementsAre(webapk::Image::PRIMARY_ICON));
-  EXPECT_TRUE(manifest.icons(0).has_image_data());
 
   // Check splash icon fields
   EXPECT_EQ(best_icon_url, manifest.icons(1).src());
-  EXPECT_EQ(icon_url_to_murmur2_hash[best_icon_url].hash,
-            manifest.icons(1).hash());
+  EXPECT_EQ(manifest.icons(1).hash(),
+            icon_url_to_murmur2_hash[best_icon_url].hash);
+  EXPECT_EQ(manifest.icons(1).image_data(),
+            icon_url_to_murmur2_hash[best_icon_url].unsafe_data);
   EXPECT_THAT(manifest.icons(1).usages(),
               testing::ElementsAre(webapk::Image::SPLASH_ICON));
-  EXPECT_TRUE(manifest.icons(1).has_image_data());
 
   // Check protobuf fields for unused icon.
   EXPECT_EQ(kUnusedIconPath, manifest.icons(2).src());
diff --git a/chrome/browser/android/webapk/webapk_update_manager.cc b/chrome/browser/android/webapk/webapk_update_manager.cc
index cef42d0..cbbdf44 100644
--- a/chrome/browser/android/webapk/webapk_update_manager.cc
+++ b/chrome/browser/android/webapk/webapk_update_manager.cc
@@ -25,9 +25,7 @@
 #include "components/webapps/browser/android/shortcut_info.h"
 #include "content/public/browser/browser_thread.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
-#include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/android/color_utils_android.h"
-#include "ui/gfx/android/java_bitmap.h"
 #include "url/gurl.h"
 
 using base::android::JavaParamRef;
@@ -57,10 +55,10 @@
     const JavaParamRef<jstring>& java_name,
     const JavaParamRef<jstring>& java_short_name,
     const JavaParamRef<jstring>& java_primary_icon_url,
-    const JavaParamRef<jobject>& java_primary_icon_bitmap,
+    const JavaParamRef<jstring>& java_primary_icon_data,
     jboolean java_is_primary_icon_maskable,
     const JavaParamRef<jstring>& java_splash_icon_url,
-    const JavaParamRef<jobject>& java_splash_icon_bitmap,
+    const JavaParamRef<jstring>& java_splash_icon_data,
     jboolean java_is_splash_icon_maskable,
     const JavaParamRef<jobjectArray>& java_icon_urls,
     const JavaParamRef<jobjectArray>& java_icon_hashes,
@@ -158,18 +156,10 @@
         webapps::WebApkIconHasher::Icon{/* data= */ "", icon_hashes[i]};
   }
 
-  gfx::JavaBitmap java_primary_icon_bitmap_lock(java_primary_icon_bitmap);
-  SkBitmap primary_icon =
-      gfx::CreateSkBitmapFromJavaBitmap(java_primary_icon_bitmap_lock);
-  primary_icon.setImmutable();
-
-  SkBitmap splash_icon;
-  if (!java_splash_icon_bitmap.is_null()) {
-    gfx::JavaBitmap java_splash_icon_bitmap_lock(java_splash_icon_bitmap);
-    splash_icon =
-        gfx::CreateSkBitmapFromJavaBitmap(java_splash_icon_bitmap_lock);
-    splash_icon.setImmutable();
-  }
+  std::string primary_icon_data =
+      ConvertJavaStringToUTF8(env, java_primary_icon_data);
+  std::string splash_icon_data =
+      ConvertJavaStringToUTF8(env, java_splash_icon_data);
 
   std::string webapk_package;
   ConvertJavaStringToUTF8(env, java_webapk_package, &webapk_package);
@@ -217,8 +207,8 @@
         static_cast<webapps::WebApkUpdateReason>(update_reason));
 
   WebApkInstaller::StoreUpdateRequestToFile(
-      base::FilePath(update_request_path), info, primary_icon,
-      java_is_primary_icon_maskable, splash_icon, webapk_package,
+      base::FilePath(update_request_path), info, primary_icon_data,
+      java_is_primary_icon_maskable, splash_icon_data, webapk_package,
       base::NumberToString(java_webapk_version),
       std::move(icon_url_to_murmur2_hash), java_is_manifest_stale,
       java_is_app_identity_update_supported, std::move(update_reasons),
diff --git a/chrome/browser/apps/app_service/intent_util.cc b/chrome/browser/apps/app_service/intent_util.cc
index dd039aa1..0291ee1 100644
--- a/chrome/browser/apps/app_service/intent_util.cc
+++ b/chrome/browser/apps/app_service/intent_util.cc
@@ -17,7 +17,6 @@
 #include "build/build_config.h"
 #include "chrome/browser/apps/app_service/file_utils.h"
 #include "chrome/browser/ui/extensions/application_launch.h"
-#include "chrome/browser/web_applications/web_app.h"
 #include "components/services/app_service/public/cpp/file_handler.h"
 #include "components/services/app_service/public/cpp/file_handler_info.h"
 #include "components/services/app_service/public/cpp/intent_filter_util.h"
@@ -113,13 +112,8 @@
 }
 
 std::vector<apps::mojom::IntentFilterPtr> CreateWebAppShareIntentFilters(
-    const web_app::WebApp& web_app) {
-  if (!web_app.share_target().has_value()) {
-    return {};
-  }
-
+    const apps::ShareTarget& share_target) {
   std::vector<apps::mojom::IntentFilterPtr> filters;
-  const apps::ShareTarget& share_target = web_app.share_target().value();
 
   if (!share_target.params.text.empty()) {
     // The share target accepts navigator.share() calls with text.
@@ -149,9 +143,9 @@
 }
 
 std::vector<apps::mojom::IntentFilterPtr> CreateWebAppFileHandlerIntentFilters(
-    const web_app::WebApp& web_app) {
+    const apps::FileHandlers& file_handlers) {
   std::vector<apps::mojom::IntentFilterPtr> filters;
-  for (const apps::FileHandler& handler : web_app.file_handlers()) {
+  for (const apps::FileHandler& handler : file_handlers) {
     std::vector<std::string> mime_types;
     std::vector<std::string> file_extensions;
     std::string action_url = handler.action.spec();
@@ -170,14 +164,7 @@
   return filters;
 }
 
-bool IsNoteTakingWebApp(const web_app::WebApp& web_app) {
-  return web_app.note_taking_new_note_url().is_valid();
-}
-
-apps::mojom::IntentFilterPtr CreateNoteTakingIntentFilter(
-    const web_app::WebApp& web_app) {
-  DCHECK(IsNoteTakingWebApp(web_app));
-
+apps::mojom::IntentFilterPtr CreateNoteTakingIntentFilter() {
   auto intent_filter = apps::mojom::IntentFilter::New();
   AddSingleValueCondition(apps::mojom::ConditionType::kAction,
                           kIntentActionCreateNote,
@@ -314,21 +301,33 @@
 }
 
 std::vector<apps::mojom::IntentFilterPtr> CreateWebAppIntentFilters(
-    const web_app::WebApp& web_app,
-    const GURL& scope) {
+    const web_app::AppId& app_id,
+    bool is_note_taking_web_app,
+    const GURL& app_scope,
+    const apps::ShareTarget* app_share_target,
+    const apps::FileHandlers* enabled_file_handlers) {
   std::vector<apps::mojom::IntentFilterPtr> filters;
-  if (!scope.is_empty())
-    filters.push_back(CreateIntentFilterForUrlScope(scope));
 
-  base::Extend(filters, CreateWebAppShareIntentFilters(web_app));
-  base::Extend(filters, CreateWebAppFileHandlerIntentFilters(web_app));
+  if (!app_scope.is_empty()) {
+    filters.push_back(CreateIntentFilterForUrlScope(app_scope));
+  }
 
-  if (IsNoteTakingWebApp(web_app))
-    filters.push_back(CreateNoteTakingIntentFilter(web_app));
+  if (app_share_target) {
+    base::Extend(filters, CreateWebAppShareIntentFilters(*app_share_target));
+  }
+
+  if (enabled_file_handlers) {
+    base::Extend(filters,
+                 CreateWebAppFileHandlerIntentFilters(*enabled_file_handlers));
+  }
+
+  if (is_note_taking_web_app) {
+    filters.push_back(CreateNoteTakingIntentFilter());
+  }
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   if (ash::features::IsProjectorEnabled() &&
-      web_app.app_id() == ash::kChromeUITrustedProjectorSwaAppId) {
+      app_id == ash::kChromeUITrustedProjectorSwaAppId) {
     filters.push_back(CreateIntentFilterForUrlScope(
         GURL(ash::kChromeUIUntrustedProjectorPwaUrl)));
   }
diff --git a/chrome/browser/apps/app_service/intent_util.h b/chrome/browser/apps/app_service/intent_util.h
index 5169a2e..d6d1a82e 100644
--- a/chrome/browser/apps/app_service/intent_util.h
+++ b/chrome/browser/apps/app_service/intent_util.h
@@ -12,6 +12,8 @@
 #include "build/build_config.h"
 #include "build/buildflag.h"
 #include "build/chromeos_buildflags.h"
+#include "chrome/browser/web_applications/web_app_id.h"
+#include "components/services/app_service/public/cpp/file_handler.h"
 #include "components/services/app_service/public/mojom/types.mojom-forward.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -28,6 +30,10 @@
 }
 #endif
 
+namespace apps {
+struct ShareTarget;
+}
+
 class GURL;
 class Profile;
 
@@ -57,8 +63,11 @@
 // The |scope| is needed because currently the correct app scope is not
 // provided through WebApp API for shortcuts.
 std::vector<apps::mojom::IntentFilterPtr> CreateWebAppIntentFilters(
-    const web_app::WebApp& web_app,
-    const GURL& scope);
+    const web_app::AppId& app_id,
+    bool is_note_taking_web_app,
+    const GURL& app_scope,
+    const apps::ShareTarget* app_share_target,
+    const apps::FileHandlers* enabled_file_handlers);
 
 // Create intent filters for a Chrome app (extension-based) e.g. for
 // file_handlers.
diff --git a/chrome/browser/apps/app_service/intent_util_browsertest.cc b/chrome/browser/apps/app_service/intent_util_browsertest.cc
index 661a5a95..1413f5d5 100644
--- a/chrome/browser/apps/app_service/intent_util_browsertest.cc
+++ b/chrome/browser/apps/app_service/intent_util_browsertest.cc
@@ -138,14 +138,14 @@
 
   std::vector<IntentFilterPtr> filters;
   {
-    const web_app::WebAppRegistrar& registrar =
-        web_app::WebAppProvider::GetForTest(browser()->profile())->registrar();
+    auto& provider = *web_app::WebAppProvider::GetForTest(browser()->profile());
     const web_app::AppId app_id =
         web_app::InstallWebAppFromManifest(browser(), app_url);
-    const web_app::WebApp* web_app = registrar.GetAppById(app_id);
-    GURL scope = registrar.GetAppScope(app_id);
-    ASSERT_TRUE(web_app);
-    filters = CreateWebAppIntentFilters(*web_app, scope);
+    filters = CreateWebAppIntentFilters(
+        app_id, /*is_note_taking_web_app*/ false,
+        provider.registrar().GetAppScope(app_id),
+        provider.registrar().GetAppShareTarget(app_id),
+        provider.os_integration_manager().GetEnabledFileHandlers(app_id));
   }
 
   ASSERT_EQ(filters.size(), 3U);
@@ -172,14 +172,14 @@
 
   std::vector<IntentFilterPtr> filters;
   {
-    const web_app::WebAppRegistrar& registrar =
-        web_app::WebAppProvider::GetForTest(browser()->profile())->registrar();
+    auto& provider = *web_app::WebAppProvider::GetForTest(browser()->profile());
     const web_app::AppId app_id =
         web_app::InstallWebAppFromManifest(browser(), app_url);
-    const web_app::WebApp* web_app = registrar.GetAppById(app_id);
-    GURL scope = registrar.GetAppScope(app_id);
-    ASSERT_TRUE(web_app);
-    filters = CreateWebAppIntentFilters(*web_app, scope);
+    filters = CreateWebAppIntentFilters(
+        app_id, /*is_note_taking_web_app*/ false,
+        provider.registrar().GetAppScope(app_id),
+        provider.registrar().GetAppShareTarget(app_id),
+        provider.os_integration_manager().GetEnabledFileHandlers(app_id));
   }
 
   ASSERT_EQ(filters.size(), 2U);
@@ -203,14 +203,14 @@
 
   std::vector<IntentFilterPtr> filters;
   {
-    const web_app::WebAppRegistrar& registrar =
-        web_app::WebAppProvider::GetForTest(browser()->profile())->registrar();
+    auto& provider = *web_app::WebAppProvider::GetForTest(browser()->profile());
     const web_app::AppId app_id =
         web_app::InstallWebAppFromManifest(browser(), app_url);
-    const web_app::WebApp* web_app = registrar.GetAppById(app_id);
-    GURL scope = registrar.GetAppScope(app_id);
-    ASSERT_TRUE(web_app);
-    filters = CreateWebAppIntentFilters(*web_app, scope);
+    filters = CreateWebAppIntentFilters(
+        app_id, /*is_note_taking_web_app*/ false,
+        provider.registrar().GetAppScope(app_id),
+        provider.registrar().GetAppShareTarget(app_id),
+        provider.os_integration_manager().GetEnabledFileHandlers(app_id));
   }
 
   ASSERT_EQ(filters.size(), 2U);
diff --git a/chrome/browser/apps/app_service/intent_util_unittest.cc b/chrome/browser/apps/app_service/intent_util_unittest.cc
index afdd9b24..0001e84f 100644
--- a/chrome/browser/apps/app_service/intent_util_unittest.cc
+++ b/chrome/browser/apps/app_service/intent_util_unittest.cc
@@ -182,8 +182,9 @@
   GURL scope = web_app->start_url().GetWithoutFilename();
   web_app->SetScope(scope);
 
-  std::vector<IntentFilterPtr> filters =
-      apps_util::CreateWebAppIntentFilters(*web_app.get(), scope);
+  std::vector<IntentFilterPtr> filters = apps_util::CreateWebAppIntentFilters(
+      web_app->app_id(), /*is_note_taking_web_app*/ false, scope,
+      /*app_share_target*/ nullptr, /*enabled_file_handlers*/ nullptr);
 
   ASSERT_EQ(filters.size(), 1);
   IntentFilterPtr& filter = filters[0];
@@ -251,8 +252,9 @@
   file_handlers.push_back(std::move(file_handler));
   web_app->SetFileHandlers(file_handlers);
 
-  std::vector<IntentFilterPtr> filters =
-      apps_util::CreateWebAppIntentFilters(*web_app.get(), scope);
+  std::vector<IntentFilterPtr> filters = apps_util::CreateWebAppIntentFilters(
+      web_app->app_id(), /*is_note_taking_web_app*/ false, scope,
+      /*app_share_target*/ nullptr, &file_handlers);
 
   ASSERT_EQ(filters.size(), 2);
   // 1st filter is URL filter.
@@ -285,8 +287,9 @@
   GURL new_note_url = scope.Resolve("/new_note.html");
   web_app->SetNoteTakingNewNoteUrl(new_note_url);
 
-  std::vector<IntentFilterPtr> filters =
-      apps_util::CreateWebAppIntentFilters(*web_app.get(), scope);
+  std::vector<IntentFilterPtr> filters = apps_util::CreateWebAppIntentFilters(
+      web_app->app_id(), /*is_note_taking_web_app*/ true, scope,
+      /*app_share_target*/ nullptr, /*enabled_file_handlers*/ nullptr);
 
   ASSERT_EQ(filters.size(), 2);
 
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn
index fcc6c04..0f23c795 100644
--- a/chrome/browser/ash/crosapi/BUILD.gn
+++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -108,6 +108,8 @@
     "lacros_availability_policy_observer.h",
     "local_printer_ash.cc",
     "local_printer_ash.h",
+    "login_ash.cc",
+    "login_ash.h",
     "login_state_ash.cc",
     "login_state_ash.h",
     "message_center_ash.cc",
diff --git a/chrome/browser/ash/crosapi/browser_manager.cc b/chrome/browser/ash/crosapi/browser_manager.cc
index 95c00f7..c81f4c02 100644
--- a/chrome/browser/ash/crosapi/browser_manager.cc
+++ b/chrome/browser/ash/crosapi/browser_manager.cc
@@ -147,19 +147,6 @@
     "lacros_cannot_launch_notification_id";
 constexpr char kLacrosLauncherNotifierID[] = "lacros_launcher";
 
-// To be sure the lacros is running with neutral priority
-class ThreadPriorityDelegate : public base::LaunchOptions::PreExecDelegate {
- public:
-  void RunAsyncSafe() override {
-    // TODO(crbug.com/1289736): Currently, this is causing some deadlock issue.
-    // It looks like inside the function, we seem to call async unsafe API.
-    // For the mitigation, disabling this temporarily.
-    // We should revisit here, and see the impact of performance.
-    // base::PlatformThread::SetCurrentThreadPriority(
-    //   base::ThreadPriority::NORMAL);
-  }
-};
-
 base::FilePath LacrosLogPath() {
   return browser_util::GetUserDataDir().Append("lacros.log");
 }
@@ -305,10 +292,14 @@
     : public base::LaunchOptions::PreExecDelegate {
  public:
   void RunAsyncSafe() override {
+    // TODO(crbug.com/1289736): Currently, this is causing some deadlock issue.
+    // It looks like inside the function, we seem to call async unsafe API.
+    // For the mitigation, disabling this temporarily.
+    // We should revisit here, and see the impact of performance.
     // SetCurrentThreadPriority() needs file I/O on /proc and /sys.
-    base::ScopedAllowBlocking allow_blocking;
-    base::PlatformThread::SetCurrentThreadPriority(
-        base::ThreadPriority::NORMAL);
+    // base::ScopedAllowBlocking allow_blocking;
+    // base::PlatformThread::SetCurrentThreadPriority(
+    //     base::ThreadPriority::NORMAL);
   }
 };
 
diff --git a/chrome/browser/ash/crosapi/browser_util.cc b/chrome/browser/ash/crosapi/browser_util.cc
index b4def30..73f0afbe 100644
--- a/chrome/browser/ash/crosapi/browser_util.cc
+++ b/chrome/browser/ash/crosapi/browser_util.cc
@@ -253,7 +253,7 @@
 }
 
 static_assert(
-    crosapi::mojom::Crosapi::Version_ == 62,
+    crosapi::mojom::Crosapi::Version_ == 63,
     "if you add a new crosapi, please add it to kInterfaceVersionEntries");
 
 }  // namespace
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.cc b/chrome/browser/ash/crosapi/crosapi_ash.cc
index e510fe5c..5d2c555 100644
--- a/chrome/browser/ash/crosapi/crosapi_ash.cc
+++ b/chrome/browser/ash/crosapi/crosapi_ash.cc
@@ -46,6 +46,7 @@
 #include "chrome/browser/ash/crosapi/keystore_service_ash.h"
 #include "chrome/browser/ash/crosapi/kiosk_session_service_ash.h"
 #include "chrome/browser/ash/crosapi/local_printer_ash.h"
+#include "chrome/browser/ash/crosapi/login_ash.h"
 #include "chrome/browser/ash/crosapi/login_state_ash.h"
 #include "chrome/browser/ash/crosapi/message_center_ash.h"
 #include "chrome/browser/ash/crosapi/metrics_reporting_ash.h"
@@ -152,6 +153,7 @@
       keystore_service_ash_(std::make_unique<KeystoreServiceAsh>()),
       kiosk_session_service_ash_(std::make_unique<KioskSessionServiceAsh>()),
       local_printer_ash_(std::make_unique<LocalPrinterAsh>()),
+      login_ash_(std::make_unique<LoginAsh>()),
       login_state_ash_(std::make_unique<LoginStateAsh>()),
       message_center_ash_(std::make_unique<MessageCenterAsh>()),
       metrics_reporting_ash_(std::make_unique<MetricsReportingAsh>(
@@ -341,6 +343,11 @@
   local_printer_ash_->BindReceiver(std::move(receiver));
 }
 
+void CrosapiAsh::BindLogin(
+    mojo::PendingReceiver<crosapi::mojom::Login> receiver) {
+  login_ash_->BindReceiver(std::move(receiver));
+}
+
 void CrosapiAsh::BindLoginState(
     mojo::PendingReceiver<crosapi::mojom::LoginState> receiver) {
   login_state_ash_->BindReceiver(std::move(receiver));
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.h b/chrome/browser/ash/crosapi/crosapi_ash.h
index b1bfa052..a96ab0f 100644
--- a/chrome/browser/ash/crosapi/crosapi_ash.h
+++ b/chrome/browser/ash/crosapi/crosapi_ash.h
@@ -49,6 +49,7 @@
 class KeystoreServiceAsh;
 class KioskSessionServiceAsh;
 class LocalPrinterAsh;
+class LoginAsh;
 class LoginStateAsh;
 class MessageCenterAsh;
 class MetricsReportingAsh;
@@ -154,6 +155,7 @@
       mojo::PendingReceiver<mojom::KioskSessionService> receiver) override;
   void BindLocalPrinter(
       mojo::PendingReceiver<mojom::LocalPrinter> receiver) override;
+  void BindLogin(mojo::PendingReceiver<mojom::Login> receiver) override;
   void BindLoginState(
       mojo::PendingReceiver<mojom::LoginState> receiver) override;
   void BindMessageCenter(
@@ -266,6 +268,8 @@
     return keystore_service_ash_.get();
   }
 
+  LoginAsh* login_ash() { return login_ash_.get(); }
+
   LoginStateAsh* login_state_ash() { return login_state_ash_.get(); }
 
   StructuredMetricsServiceAsh* structured_metrics_service_ash() {
@@ -305,6 +309,7 @@
   std::unique_ptr<KeystoreServiceAsh> keystore_service_ash_;
   std::unique_ptr<KioskSessionServiceAsh> kiosk_session_service_ash_;
   std::unique_ptr<LocalPrinterAsh> local_printer_ash_;
+  std::unique_ptr<LoginAsh> login_ash_;
   std::unique_ptr<LoginStateAsh> login_state_ash_;
   std::unique_ptr<MessageCenterAsh> message_center_ash_;
   std::unique_ptr<MetricsReportingAsh> metrics_reporting_ash_;
diff --git a/chrome/browser/ash/crosapi/crosapi_util.cc b/chrome/browser/ash/crosapi/crosapi_util.cc
index 2b2873a4..184628d 100644
--- a/chrome/browser/ash/crosapi/crosapi_util.cc
+++ b/chrome/browser/ash/crosapi/crosapi_util.cc
@@ -54,6 +54,7 @@
 #include "chromeos/crosapi/mojom/kiosk_session_service.mojom.h"
 #include "chromeos/crosapi/mojom/launcher_search.mojom.h"
 #include "chromeos/crosapi/mojom/local_printer.mojom.h"
+#include "chromeos/crosapi/mojom/login.mojom.h"
 #include "chromeos/crosapi/mojom/login_state.mojom.h"
 #include "chromeos/crosapi/mojom/message_center.mojom.h"
 #include "chromeos/crosapi/mojom/metrics_reporting.mojom.h"
@@ -182,6 +183,7 @@
     MakeInterfaceVersionEntry<crosapi::mojom::KeystoreService>(),
     MakeInterfaceVersionEntry<crosapi::mojom::KioskSessionService>(),
     MakeInterfaceVersionEntry<crosapi::mojom::LocalPrinter>(),
+    MakeInterfaceVersionEntry<crosapi::mojom::Login>(),
     MakeInterfaceVersionEntry<crosapi::mojom::LoginState>(),
     MakeInterfaceVersionEntry<
         chromeos::machine_learning::mojom::MachineLearningService>(),
diff --git a/chrome/browser/ash/crosapi/login_ash.cc b/chrome/browser/ash/crosapi/login_ash.cc
new file mode 100644
index 0000000..6f3a7b6e
--- /dev/null
+++ b/chrome/browser/ash/crosapi/login_ash.cc
@@ -0,0 +1,246 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ash/crosapi/login_ash.h"
+
+#include "ash/components/login/auth/user_context.h"
+#include "chrome/browser/ash/login/existing_user_controller.h"
+#include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/extensions/login_screen/login/errors.h"
+#include "chrome/browser/chromeos/extensions/login_screen/login/login_api_lock_handler.h"
+#include "chrome/browser/chromeos/extensions/login_screen/login/shared_session_handler.h"
+#include "chrome/browser/lifetime/application_lifetime.h"
+#include "chrome/common/pref_names.h"
+#include "chromeos/crosapi/mojom/login.mojom.h"
+#include "components/session_manager/core/session_manager.h"
+#include "components/user_manager/user.h"
+#include "components/user_manager/user_manager.h"
+#include "components/user_manager/user_type.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "ui/base/user_activity/user_activity_detector.h"
+
+namespace crosapi {
+
+LoginAsh::LoginAsh() = default;
+LoginAsh::~LoginAsh() = default;
+
+void LoginAsh::BindReceiver(mojo::PendingReceiver<mojom::Login> receiver) {
+  receivers_.Add(this, std::move(receiver));
+}
+
+void LoginAsh::LaunchManagedGuestSession(
+    const absl::optional<std::string>& password,
+    LaunchManagedGuestSessionCallback callback) {
+  ui::UserActivityDetector::Get()->HandleExternalUserActivity();
+
+  if (session_manager::SessionManager::Get()->session_state() !=
+      session_manager::SessionState::LOGIN_PRIMARY) {
+    std::move(callback).Run(
+        extensions::login_api_errors::kAlreadyActiveSession);
+    return;
+  }
+
+  auto* existing_user_controller =
+      ash::ExistingUserController::current_controller();
+  if (existing_user_controller->IsSigninInProgress()) {
+    std::move(callback).Run(
+        extensions::login_api_errors::kAnotherLoginAttemptInProgress);
+    return;
+  }
+
+  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
+  for (const user_manager::User* user : user_manager->GetUsers()) {
+    if (!user || user->GetType() != user_manager::USER_TYPE_PUBLIC_ACCOUNT)
+      continue;
+    ash::UserContext context(user_manager::USER_TYPE_PUBLIC_ACCOUNT,
+                             user->GetAccountId());
+    if (password) {
+      context.SetKey(chromeos::Key(*password));
+      context.SetCanLockManagedGuestSession(true);
+    }
+
+    existing_user_controller->Login(context, ash::SigninSpecifics());
+    std::move(callback).Run(absl::nullopt);
+    return;
+  }
+  std::move(callback).Run(
+      extensions::login_api_errors::kNoManagedGuestSessionAccounts);
+}
+
+void LoginAsh::ExitCurrentSession(
+    const absl::optional<std::string>& data_for_next_login_attempt,
+    ExitCurrentSessionCallback callback) {
+  PrefService* local_state = g_browser_process->local_state();
+  DCHECK(local_state);
+
+  if (data_for_next_login_attempt) {
+    local_state->SetString(prefs::kLoginExtensionApiDataForNextLoginAttempt,
+                           *data_for_next_login_attempt);
+  } else {
+    local_state->ClearPref(prefs::kLoginExtensionApiDataForNextLoginAttempt);
+  }
+
+  chrome::AttemptUserExit();
+  std::move(callback).Run(absl::nullopt);
+}
+
+void LoginAsh::FetchDataForNextLoginAttempt(
+    FetchDataForNextLoginAttemptCallback callback) {
+  PrefService* local_state = g_browser_process->local_state();
+  DCHECK(local_state);
+  std::string data_for_next_login_attempt =
+      local_state->GetString(prefs::kLoginExtensionApiDataForNextLoginAttempt);
+  local_state->ClearPref(prefs::kLoginExtensionApiDataForNextLoginAttempt);
+
+  std::move(callback).Run(data_for_next_login_attempt);
+}
+
+void LoginAsh::LockManagedGuestSession(
+    LockManagedGuestSessionCallback callback) {
+  ui::UserActivityDetector::Get()->HandleExternalUserActivity();
+
+  const user_manager::UserManager* user_manager =
+      user_manager::UserManager::Get();
+  const user_manager::User* active_user = user_manager->GetActiveUser();
+  if (!active_user ||
+      active_user->GetType() != user_manager::USER_TYPE_PUBLIC_ACCOUNT ||
+      !user_manager->CanCurrentUserLock()) {
+    std::move(callback).Run(
+        extensions::login_api_errors::kNoLockableManagedGuestSession);
+    return;
+  }
+
+  if (session_manager::SessionManager::Get()->session_state() !=
+      session_manager::SessionState::ACTIVE) {
+    std::move(callback).Run(extensions::login_api_errors::kSessionIsNotActive);
+    return;
+  }
+
+  chromeos::LoginApiLockHandler::Get()->RequestLockScreen();
+  std::move(callback).Run(absl::nullopt);
+}
+
+void LoginAsh::UnlockManagedGuestSession(
+    const std::string& password,
+    UnlockManagedGuestSessionCallback callback) {
+  ui::UserActivityDetector::Get()->HandleExternalUserActivity();
+
+  const user_manager::UserManager* user_manager =
+      user_manager::UserManager::Get();
+  const user_manager::User* active_user = user_manager->GetActiveUser();
+  if (!active_user ||
+      active_user->GetType() != user_manager::USER_TYPE_PUBLIC_ACCOUNT ||
+      !user_manager->CanCurrentUserLock()) {
+    std::move(callback).Run(
+        extensions::login_api_errors::kNoUnlockableManagedGuestSession);
+    return;
+  }
+
+  if (session_manager::SessionManager::Get()->session_state() !=
+      session_manager::SessionState::LOCKED) {
+    std::move(callback).Run(extensions::login_api_errors::kSessionIsNotLocked);
+    return;
+  }
+
+  chromeos::LoginApiLockHandler* handler = chromeos::LoginApiLockHandler::Get();
+  if (handler->IsUnlockInProgress()) {
+    std::move(callback).Run(
+        extensions::login_api_errors::kAnotherUnlockAttemptInProgress);
+    return;
+  }
+
+  ash::UserContext context(user_manager::USER_TYPE_PUBLIC_ACCOUNT,
+                           active_user->GetAccountId());
+  context.SetKey(chromeos::Key(password));
+  handler->Authenticate(
+      context, base::BindOnce(&LoginAsh::OnScreenLockerAuthenticate,
+                              weak_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void LoginAsh::LaunchSharedManagedGuestSession(
+    const std::string& password,
+    LaunchSharedManagedGuestSessionCallback callback) {
+  ui::UserActivityDetector::Get()->HandleExternalUserActivity();
+
+  absl::optional<std::string> error =
+      chromeos::SharedSessionHandler::Get()->LaunchSharedManagedGuestSession(
+          password);
+  if (error) {
+    std::move(callback).Run(error);
+    return;
+  }
+
+  std::move(callback).Run(absl::nullopt);
+}
+
+void LoginAsh::EnterSharedSession(const std::string& password,
+                                  EnterSharedSessionCallback callback) {
+  ui::UserActivityDetector::Get()->HandleExternalUserActivity();
+
+  chromeos::SharedSessionHandler::Get()->EnterSharedSession(
+      password,
+      base::BindOnce(&LoginAsh::OnOptionalErrorCallbackComplete,
+                     weak_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void LoginAsh::UnlockSharedSession(const std::string& password,
+                                   UnlockSharedSessionCallback callback) {
+  ui::UserActivityDetector::Get()->HandleExternalUserActivity();
+
+  const user_manager::UserManager* user_manager =
+      user_manager::UserManager::Get();
+  const user_manager::User* active_user = user_manager->GetActiveUser();
+  if (!active_user ||
+      active_user->GetType() != user_manager::USER_TYPE_PUBLIC_ACCOUNT ||
+      !user_manager->CanCurrentUserLock()) {
+    std::move(callback).Run(
+        extensions::login_api_errors::kNoUnlockableManagedGuestSession);
+    return;
+  }
+
+  chromeos::SharedSessionHandler::Get()->UnlockSharedSession(
+      password,
+      base::BindOnce(&LoginAsh::OnOptionalErrorCallbackComplete,
+                     weak_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void LoginAsh::EndSharedSession(EndSharedSessionCallback callback) {
+  chromeos::SharedSessionHandler::Get()->EndSharedSession(
+      base::BindOnce(&LoginAsh::OnOptionalErrorCallbackComplete,
+                     weak_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void LoginAsh::SetDataForNextLoginAttempt(
+    const std::string& data_for_next_login_attempt,
+    SetDataForNextLoginAttemptCallback callback) {
+  PrefService* local_state = g_browser_process->local_state();
+  DCHECK(local_state);
+  local_state->SetString(prefs::kLoginExtensionApiDataForNextLoginAttempt,
+                         data_for_next_login_attempt);
+
+  std::move(callback).Run();
+}
+
+void LoginAsh::OnScreenLockerAuthenticate(
+    base::OnceCallback<void(const absl::optional<std::string>&)> callback,
+    bool success) {
+  if (!success) {
+    std::move(callback).Run(
+        extensions::login_api_errors::kAuthenticationFailed);
+    return;
+  }
+
+  std::move(callback).Run(absl::nullopt);
+}
+
+void LoginAsh::OnOptionalErrorCallbackComplete(
+    base::OnceCallback<void(const absl::optional<std::string>&)> callback,
+    absl::optional<std::string> error) {
+  std::move(callback).Run(error);
+}
+
+}  // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/login_ash.h b/chrome/browser/ash/crosapi/login_ash.h
new file mode 100644
index 0000000..add7289
--- /dev/null
+++ b/chrome/browser/ash/crosapi/login_ash.h
@@ -0,0 +1,66 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ASH_CROSAPI_LOGIN_ASH_H_
+#define CHROME_BROWSER_ASH_CROSAPI_LOGIN_ASH_H_
+
+#include "base/memory/weak_ptr.h"
+#include "base/scoped_observation.h"
+#include "chromeos/crosapi/mojom/login.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+
+namespace crosapi {
+
+// The ash-chrome implementation of the Login crosapi interface.
+class LoginAsh : public mojom::Login {
+ public:
+  LoginAsh();
+  LoginAsh(const LoginAsh&) = delete;
+  LoginAsh& operator=(const LoginAsh&) = delete;
+  ~LoginAsh() override;
+
+  void BindReceiver(mojo::PendingReceiver<mojom::Login> receiver);
+
+  // crosapi::mojom::Login:
+  void LaunchManagedGuestSession(
+      const absl::optional<std::string>& password,
+      LaunchManagedGuestSessionCallback callback) override;
+  void ExitCurrentSession(
+      const absl::optional<std::string>& data_for_next_login_attempt,
+      ExitCurrentSessionCallback callback) override;
+  void FetchDataForNextLoginAttempt(
+      FetchDataForNextLoginAttemptCallback callback) override;
+  void LockManagedGuestSession(
+      LockManagedGuestSessionCallback callback) override;
+  void UnlockManagedGuestSession(
+      const std::string& password,
+      UnlockManagedGuestSessionCallback callback) override;
+  void LaunchSharedManagedGuestSession(
+      const std::string& password,
+      LaunchSharedManagedGuestSessionCallback callback) override;
+  void EnterSharedSession(const std::string& password,
+                          EnterSharedSessionCallback callback) override;
+  void UnlockSharedSession(const std::string& password,
+                           UnlockSharedSessionCallback callback) override;
+  void EndSharedSession(EndSharedSessionCallback callback) override;
+  void SetDataForNextLoginAttempt(
+      const std::string& data_for_next_login_attempt,
+      SetDataForNextLoginAttemptCallback callback) override;
+
+ private:
+  void OnScreenLockerAuthenticate(
+      base::OnceCallback<void(const absl::optional<std::string>&)> callback,
+      bool success);
+  void OnOptionalErrorCallbackComplete(
+      base::OnceCallback<void(const absl::optional<std::string>&)> callback,
+      absl::optional<std::string> error);
+
+  mojo::ReceiverSet<mojom::Login> receivers_;
+  base::WeakPtrFactory<LoginAsh> weak_factory_{this};
+};
+
+}  // namespace crosapi
+
+#endif  // CHROME_BROWSER_ASH_CROSAPI_LOGIN_ASH_H_
diff --git a/chrome/browser/ash/login/challenge_response_auth_keys_loader.cc b/chrome/browser/ash/login/challenge_response_auth_keys_loader.cc
index 9515f6d..8909ab6 100644
--- a/chrome/browser/ash/login/challenge_response_auth_keys_loader.cc
+++ b/chrome/browser/ash/login/challenge_response_auth_keys_loader.cc
@@ -23,6 +23,7 @@
 #include "chrome/browser/ash/certificate_provider/certificate_provider_service.h"
 #include "chrome/browser/ash/certificate_provider/certificate_provider_service_factory.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/account_id/account_id.h"
 #include "components/prefs/pref_service.h"
@@ -84,7 +85,8 @@
     std::vector<std::string>* spki_items,
     base::flat_set<std::string>* extension_ids) {
   const base::Value known_user_value =
-      user_manager::known_user::GetChallengeResponseKeys(account_id);
+      user_manager::KnownUser(g_browser_process->local_state())
+          .GetChallengeResponseKeys(account_id);
   std::vector<DeserializedChallengeResponseKey>
       deserialized_challenge_response_keys;
   DeserializeChallengeResponseKeyFromKnownUser(
diff --git a/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc b/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc
index 7145c94c..e66de3f 100644
--- a/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc
+++ b/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/ash/login/test/device_state_mixin.h"
 #include "chrome/browser/ash/login/test/oobe_base_test.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/policy/extension_force_install_mixin.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/account_id/account_id.h"
@@ -66,7 +67,8 @@
         GetProfile(), &device_state_mixin_);
 
     // Register the ChallengeResponseKey for the user.
-    user_manager::known_user::SaveKnownUser(account_id_);
+    user_manager::KnownUser(g_browser_process->local_state())
+        .SaveKnownUser(account_id_);
   }
 
   void TearDownOnMainThread() override {
@@ -85,8 +87,9 @@
     challenge_response_keys.push_back(challenge_response_key);
     base::Value challenge_response_keys_value =
         SerializeChallengeResponseKeysForKnownUser(challenge_response_keys);
-    user_manager::known_user::SetChallengeResponseKeys(
-        account_id_, std::move(challenge_response_keys_value));
+    user_manager::KnownUser(g_browser_process->local_state())
+        .SetChallengeResponseKeys(account_id_,
+                                  std::move(challenge_response_keys_value));
   }
 
   void OnAvailableKeysLoaded(
diff --git a/chrome/browser/ash/login/login_manager_test.cc b/chrome/browser/ash/login/login_manager_test.cc
index b2ef8043..13fe741 100644
--- a/chrome/browser/ash/login/login_manager_test.cc
+++ b/chrome/browser/ash/login/login_manager_test.cc
@@ -68,7 +68,8 @@
   if (!base::Contains(users_pref->GetList(), email_value))
     users_pref->Append(std::move(email_value));
   if (user_manager::UserManager::IsInitialized()) {
-    user_manager::known_user::SaveKnownUser(account_id);
+    user_manager::KnownUser(g_browser_process->local_state())
+        .SaveKnownUser(account_id);
     user_manager::UserManager::Get()->SaveUserOAuthStatus(
         account_id, user_manager::User::OAUTH2_TOKEN_STATUS_VALID);
   }
diff --git a/chrome/browser/ash/login/security_token_login_browsertest.cc b/chrome/browser/ash/login/security_token_login_browsertest.cc
index c95bdd13..d8dfec7d 100644
--- a/chrome/browser/ash/login/security_token_login_browsertest.cc
+++ b/chrome/browser/ash/login/security_token_login_browsertest.cc
@@ -52,9 +52,7 @@
 #include "components/policy/core/browser/browser_policy_connector.h"
 #include "components/policy/core/common/mock_configuration_policy_provider.h"
 #include "components/session_manager/session_manager_types.h"
-#include "components/user_manager/fake_user_manager.h"
 #include "components/user_manager/known_user.h"
-#include "components/user_manager/scoped_user_manager.h"
 #include "components/user_manager/user_manager.h"
 #include "content/public/test/browser_test.h"
 #include "extensions/common/features/simple_feature.h"
@@ -331,13 +329,6 @@
 
  private:
   void RegisterChallengeResponseKey() {
-    // The global user manager is not created until after the Local State is
-    // initialized, but in order for the user_manager::known_user:: methods to
-    // work we create a temporary instance of the user manager here.
-    auto user_manager = std::make_unique<user_manager::FakeUserManager>();
-    user_manager->set_local_state(g_browser_process->local_state());
-    user_manager::ScopedUserManager scoper(std::move(user_manager));
-
     ChallengeResponseKey challenge_response_key;
     challenge_response_key.set_public_key_spki_der(
         TestCertificateProviderExtension::GetCertificateSpki());
@@ -346,9 +337,9 @@
 
     base::Value challenge_response_keys_value =
         SerializeChallengeResponseKeysForKnownUser({challenge_response_key});
-    user_manager::known_user::SetChallengeResponseKeys(
-        GetChallengeResponseAccountId(),
-        std::move(challenge_response_keys_value));
+    user_manager::KnownUser(g_browser_process->local_state())
+        .SetChallengeResponseKeys(GetChallengeResponseAccountId(),
+                                  std::move(challenge_response_keys_value));
   }
 
   // Bypass "signin_screen" feature only enabled for allowlisted extensions.
diff --git a/chrome/browser/ash/login/security_token_session_controller.cc b/chrome/browser/ash/login/security_token_session_controller.cc
index 3510d59..dfa02fc 100644
--- a/chrome/browser/ash/login/security_token_session_controller.cc
+++ b/chrome/browser/ash/login/security_token_session_controller.cc
@@ -117,13 +117,14 @@
 // Loads the persistently stored information about the challenge-response keys
 // that can be used for authenticating the user.
 void LoadStoredChallengeResponseSpkiKeysForUser(
+    PrefService* local_state,
     const AccountId& account_id,
     base::flat_map<std::string, std::vector<std::string>>* extension_to_spkis,
     base::flat_set<std::string>* extension_ids) {
   // TODO(crbug.com/1164373) This approach does not work for ephemeral users.
   // Instead, only get the certificate that was actually used on the last login.
   const base::Value known_user_value =
-      user_manager::known_user::GetChallengeResponseKeys(account_id);
+      user_manager::KnownUser(local_state).GetChallengeResponseKeys(account_id);
   std::vector<DeserializedChallengeResponseKey>
       deserialized_challenge_response_keys;
   DeserializeChallengeResponseKeyFromKnownUser(
@@ -172,7 +173,8 @@
   certificate_provider_ =
       certificate_provider_service_->CreateCertificateProvider();
   LoadStoredChallengeResponseSpkiKeysForUser(
-      user_->GetAccountId(), &extension_to_spkis_, &observed_extensions_);
+      local_state_, user_->GetAccountId(), &extension_to_spkis_,
+      &observed_extensions_);
   UpdateNotificationPref();
   behavior_ = GetBehaviorFromPref();
   pref_change_registrar_.Init(profile_prefs_);
@@ -202,7 +204,8 @@
   extension_to_spkis_.clear();
   observed_extensions_.clear();
   LoadStoredChallengeResponseSpkiKeysForUser(
-      user_->GetAccountId(), &extension_to_spkis_, &observed_extensions_);
+      local_state_, user_->GetAccountId(), &extension_to_spkis_,
+      &observed_extensions_);
 }
 
 void SecurityTokenSessionController::OnCertificatesUpdated(
diff --git a/chrome/browser/ash/login/session/user_session_manager.cc b/chrome/browser/ash/login/session/user_session_manager.cc
index 46cf7d6..cd98d96 100644
--- a/chrome/browser/ash/login/session/user_session_manager.cc
+++ b/chrome/browser/ash/login/session/user_session_manager.cc
@@ -395,10 +395,10 @@
 // authentication, persistently in the known_user database for future
 // authentication attempts.
 void PersistChallengeResponseKeys(const UserContext& user_context) {
-  user_manager::known_user::SetChallengeResponseKeys(
-      user_context.GetAccountId(),
-      SerializeChallengeResponseKeysForKnownUser(
-          user_context.GetChallengeResponseKeys()));
+  user_manager::KnownUser(g_browser_process->local_state())
+      .SetChallengeResponseKeys(user_context.GetAccountId(),
+                                SerializeChallengeResponseKeysForKnownUser(
+                                    user_context.GetChallengeResponseKeys()));
 }
 
 // Returns true if the user is new, or if the user was already present on the
diff --git a/chrome/browser/ash/login/ui/login_display_host_webui.cc b/chrome/browser/ash/login/ui/login_display_host_webui.cc
index a52121ff..b3a1008a 100644
--- a/chrome/browser/ash/login/ui/login_display_host_webui.cc
+++ b/chrome/browser/ash/login/ui/login_display_host_webui.cc
@@ -98,8 +98,6 @@
 #include "ui/base/ime/ash/input_method_manager.h"
 #include "ui/base/ime/ash/input_method_util.h"
 #include "ui/base/resource/resource_bundle.h"
-#include "ui/compositor/compositor.h"
-#include "ui/compositor/compositor_observer.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
@@ -365,44 +363,6 @@
   client->SetKeyboardConfig(config);
 }
 
-// Workaround for graphical glitches with animated user avatars due to a race
-// between GPU process cleanup for the closing WebContents versus compositor
-// draw of new animation frames. https://crbug.com/759148
-class CloseAfterCommit : public ui::CompositorObserver,
-                         public views::WidgetObserver {
- public:
-  explicit CloseAfterCommit(views::Widget* widget) : widget_(widget) {
-    widget->GetCompositor()->AddObserver(this);
-    widget_->AddObserver(this);
-  }
-
-  CloseAfterCommit(const CloseAfterCommit&) = delete;
-  CloseAfterCommit& operator=(const CloseAfterCommit&) = delete;
-
-  ~CloseAfterCommit() override {
-    widget_->RemoveObserver(this);
-    widget_->GetCompositor()->RemoveObserver(this);
-    CHECK(!IsInObserverList());
-  }
-
-  // ui::CompositorObserver:
-  void OnCompositingDidCommit(ui::Compositor* compositor) override {
-    DCHECK_EQ(widget_->GetCompositor(), compositor);
-    LOG(WARNING) << "Close login widget";
-    widget_->Close();
-  }
-
-  // views::WidgetObserver:
-  void OnWidgetDestroying(views::Widget* widget) override {
-    DCHECK_EQ(widget, widget_);
-    LOG(WARNING) << "Login widget destroying";
-    delete this;
-  }
-
- private:
-  views::Widget* const widget_;
-};
-
 // Returns true if we have default audio device.
 bool CanPlayStartupSound() {
   AudioDevice device;
@@ -959,10 +919,7 @@
   }
 
   if (login_window_) {
-    login_window_->Hide();
-    // This CompositorObserver becomes "owned" by login_window_ after
-    // construction and will delete itself once login_window_ is destroyed.
-    new CloseAfterCommit(login_window_);
+    login_window_->CloseWithReason(views::Widget::ClosedReason::kUnspecified);
     login_window_->RemoveRemovalsObserver(this);
     login_window_->RemoveObserver(this);
     login_window_ = nullptr;
diff --git a/chrome/browser/ash/policy/affiliation/affiliation_test_helper.cc b/chrome/browser/ash/policy/affiliation/affiliation_test_helper.cc
index 7757f8b4..c8921a4c 100644
--- a/chrome/browser/ash/policy/affiliation/affiliation_test_helper.cc
+++ b/chrome/browser/ash/policy/affiliation/affiliation_test_helper.cc
@@ -173,8 +173,8 @@
   if (!base::Contains(users_pref->GetList(), email_value))
     users_pref->Append(std::move(email_value));
 
-  if (user_manager::UserManager::IsInitialized())
-    user_manager::known_user::SaveKnownUser(account_id);
+  user_manager::KnownUser(g_browser_process->local_state())
+      .SaveKnownUser(account_id);
 
   ash::StartupUtils::MarkOobeCompleted();
 }
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.cc
index 33cda648..52e9301 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.cc
@@ -74,7 +74,7 @@
 
 // static
 const base::Feature MetricReportingManager::kEnableNetworkTelemetryReporting{
-    "EnableNetworkTelemetryReporting", base::FEATURE_DISABLED_BY_DEFAULT};
+    "EnableNetworkTelemetryReporting", base::FEATURE_ENABLED_BY_DEFAULT};
 
 bool MetricReportingManager::Delegate::IsAffiliated(Profile* profile) {
   const user_manager::User* const user =
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index f7091e85..4f75ce80 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -33,8 +33,6 @@
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/crash_upload_list/crash_upload_list.h"
 #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
 #include "chrome/browser/domain_reliability/service_factory.h"
 #include "chrome/browser/downgrade/user_data_downgrade.h"
 #include "chrome/browser/download/download_prefs.h"
@@ -92,8 +90,6 @@
 #include "components/content_settings/core/common/content_settings_pattern.h"
 #include "components/crash/core/app/crashpad.h"
 #include "components/custom_handlers/protocol_handler_registry.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
 #include "components/device_event_log/device_event_log.h"
 #include "components/heavy_ad_intervention/heavy_ad_blocklist.h"
 #include "components/heavy_ad_intervention/heavy_ad_service.h"
diff --git a/chrome/browser/cart/cart_discount_fetcher.cc b/chrome/browser/cart/cart_discount_fetcher.cc
index 2e3a51a..505b5322 100644
--- a/chrome/browser/cart/cart_discount_fetcher.cc
+++ b/chrome/browser/cart/cart_discount_fetcher.cc
@@ -13,11 +13,11 @@
 #include "chrome/browser/cart/cart_db.h"
 #include "chrome/browser/cart/cart_db_content.pb.h"
 #include "chrome/browser/cart/cart_discount_metric_collector.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/commerce/coupons/coupon_db_content.pb.h"
 #include "chrome/browser/endpoint_fetcher/endpoint_fetcher.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/search/ntp_features.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "services/network/public/cpp/cross_thread_pending_shared_url_loader_factory.h"
diff --git a/chrome/browser/cart/cart_features.cc b/chrome/browser/cart/cart_features.cc
index 067785b..fd40c95 100644
--- a/chrome/browser/cart/cart_features.cc
+++ b/chrome/browser/cart/cart_features.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/cart/cart_features.h"
 
 #include "base/no_destructor.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "third_party/re2/src/re2/re2.h"
 
 namespace cart_features {
diff --git a/chrome/browser/cart/cart_service.cc b/chrome/browser/cart/cart_service.cc
index 4c74929..d4c559a 100644
--- a/chrome/browser/cart/cart_service.cc
+++ b/chrome/browser/cart/cart_service.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/cart/cart_db_content.pb.h"
 #include "chrome/browser/cart/cart_discount_metric_collector.h"
 #include "chrome/browser/cart/cart_features.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/commerce/coupons/coupon_service_factory.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
@@ -23,6 +22,7 @@
 #include "chrome/grit/browser_resources.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/autofill/core/browser/data_model/autofill_offer_data.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/optimization_guide/proto/hints.pb.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
diff --git a/chrome/browser/cart/cart_service_unittest.cc b/chrome/browser/cart/cart_service_unittest.cc
index 825d973..9eb3ffb8 100644
--- a/chrome/browser/cart/cart_service_unittest.cc
+++ b/chrome/browser/cart/cart_service_unittest.cc
@@ -10,7 +10,6 @@
 #include "chrome/browser/cart/cart_discount_metric_collector.h"
 #include "chrome/browser/cart/cart_service_factory.h"
 #include "chrome/browser/cart/fetch_discount_worker.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/commerce/coupons/coupon_service.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/persisted_state_db/profile_proto_db.h"
@@ -18,6 +17,7 @@
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "components/search/ntp_features.h"
diff --git a/chrome/browser/cart/discount_url_loader.cc b/chrome/browser/cart/discount_url_loader.cc
index e331331a..1b267ff 100644
--- a/chrome/browser/cart/discount_url_loader.cc
+++ b/chrome/browser/cart/discount_url_loader.cc
@@ -38,7 +38,8 @@
       cart_service_->GetDiscountURL(
           contents->GetVisibleURL(),
           base::BindOnce(&DiscountURLLoader::NavigateToDiscountURL,
-                         weak_ptr_factory_.GetWeakPtr(), contents));
+                         weak_ptr_factory_.GetWeakPtr(),
+                         contents->GetWeakPtr()));
     }
     last_interacted_url_.reset();
   }
@@ -52,8 +53,12 @@
   browser->tab_strip_model()->RemoveObserver(this);
 }
 
-void DiscountURLLoader::NavigateToDiscountURL(content::WebContents* contents,
-                                              const GURL& discount_url) {
+void DiscountURLLoader::NavigateToDiscountURL(
+    base::WeakPtr<content::WebContents> contents,
+    const GURL& discount_url) {
+  if (!contents) {
+    return;
+  }
   contents->GetController().LoadURL(discount_url, content::Referrer(),
                                     ui::PAGE_TRANSITION_FIRST, std::string());
 }
diff --git a/chrome/browser/cart/discount_url_loader.h b/chrome/browser/cart/discount_url_loader.h
index 2ae2a01d..1f8c488 100644
--- a/chrome/browser/cart/discount_url_loader.h
+++ b/chrome/browser/cart/discount_url_loader.h
@@ -39,7 +39,7 @@
   void OnBrowserRemoved(Browser* browser) override;
 
  private:
-  void NavigateToDiscountURL(content::WebContents* contents,
+  void NavigateToDiscountURL(base::WeakPtr<content::WebContents> contents,
                              const GURL& discount_url);
   absl::optional<GURL> last_interacted_url_;
   raw_ptr<CartService> cart_service_;
diff --git a/chrome/browser/cart/fetch_discount_worker.cc b/chrome/browser/cart/fetch_discount_worker.cc
index 30bde5f..e5f6bc89 100644
--- a/chrome/browser/cart/fetch_discount_worker.cc
+++ b/chrome/browser/cart/fetch_discount_worker.cc
@@ -10,8 +10,8 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/cart/cart_discount_fetcher.h"
 #include "chrome/browser/cart/cart_features.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/commerce/coupons/coupon_db_content.pb.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/search/ntp_features.h"
 #include "components/signin/public/identity_manager/access_token_info.h"
 #include "components/variations/variations.mojom.h"
diff --git a/chrome/browser/cart/fetch_discount_worker_browsertest.cc b/chrome/browser/cart/fetch_discount_worker_browsertest.cc
index 4002cf4..b3d8653 100644
--- a/chrome/browser/cart/fetch_discount_worker_browsertest.cc
+++ b/chrome/browser/cart/fetch_discount_worker_browsertest.cc
@@ -10,10 +10,10 @@
 #include "base/test/test_timeouts.h"
 #include "chrome/browser/cart/cart_db_content.pb.h"
 #include "chrome/browser/cart/cart_service.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/persisted_state_db/profile_proto_db.h"
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
 #include "chrome/common/pref_names.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/optimization_guide/core/optimization_guide_features.h"
 #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/cart/fetch_discount_worker_unittest.cc b/chrome/browser/cart/fetch_discount_worker_unittest.cc
index fa00b26..8dfc9f0 100644
--- a/chrome/browser/cart/fetch_discount_worker_unittest.cc
+++ b/chrome/browser/cart/fetch_discount_worker_unittest.cc
@@ -8,7 +8,6 @@
 #include "base/test/task_environment.h"
 #include "chrome/browser/cart/cart_discount_fetcher.h"
 #include "chrome/browser/cart/cart_service_factory.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/commerce/coupons/coupon_service.h"
 #include "chrome/browser/commerce/coupons/coupon_service_factory.h"
 #include "chrome/browser/endpoint_fetcher/endpoint_fetcher.h"
@@ -16,6 +15,7 @@
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/autofill/core/browser/data_model/autofill_offer_data.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/prefs/pref_service.h"
 #include "components/search/ntp_features.h"
 #include "components/signin/public/identity_manager/identity_test_environment.h"
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 2f2a897..7e6ca1cb 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -474,28 +474,6 @@
     GoogleUpdateSettings::SetLastRunTime();
 }
 
-bool ProcessSingletonNotificationCallback(
-    const base::CommandLine& command_line,
-    const base::FilePath& current_directory) {
-  // Drop the request if the browser process is already shutting down.
-  // Note that we're going to post an async task below. Even if the browser
-  // process isn't shutting down right now, it could be by the time the task
-  // starts running. So, an additional check needs to happen when it starts.
-  // But regardless of any future check, there is no reason to post the task
-  // now if we know we're already shutting down.
-  if (!g_browser_process || g_browser_process->IsShuttingDown())
-    return false;
-
-  // In order to handle this request on Windows, there is platform specific
-  // code in browser_finder.cc that requires making outbound COM calls to
-  // cross-apartment shell objects (via IVirtualDesktopManager). That is not
-  // allowed within a SendMessage handler, which this function is a part of.
-  // So, we post a task to asynchronously finish the command line processing.
-  return base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&ProcessSingletonNotificationCallbackImpl,
-                                command_line, current_directory));
-}
-
 bool ShouldInstallSodaDuringPostProfileInit(
     const base::CommandLine& command_line) {
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -966,7 +944,8 @@
 #if !BUILDFLAG(IS_ANDROID)
   process_singleton_ = std::make_unique<ChromeProcessSingleton>(
       user_data_dir_,
-      base::BindRepeating(&ProcessSingletonNotificationCallback));
+      base::BindRepeating(
+          &ChromeBrowserMainParts::ProcessSingletonNotificationCallback));
 
   // Cache first run state early.
   first_run::IsChromeFirstRun();
@@ -1990,4 +1969,28 @@
   DCHECK(GetMainRunLoopInstance());
   return std::move(GetMainRunLoopInstance());
 }
+
+// static
+bool ChromeBrowserMainParts::ProcessSingletonNotificationCallback(
+    const base::CommandLine& command_line,
+    const base::FilePath& current_directory) {
+  // Drop the request if the browser process is already shutting down.
+  // Note that we're going to post an async task below. Even if the browser
+  // process isn't shutting down right now, it could be by the time the task
+  // starts running. So, an additional check needs to happen when it starts.
+  // But regardless of any future check, there is no reason to post the task
+  // now if we know we're already shutting down.
+  if (!g_browser_process || g_browser_process->IsShuttingDown())
+    return false;
+
+  // In order to handle this request on Windows, there is platform specific
+  // code in browser_finder.cc that requires making outbound COM calls to
+  // cross-apartment shell objects (via IVirtualDesktopManager). That is not
+  // allowed within a SendMessage handler, which this function is a part of.
+  // So, we post a task to asynchronously finish the command line processing.
+  return base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(&ProcessSingletonNotificationCallbackImpl,
+                                command_line, current_directory));
+}
+
 #endif
diff --git a/chrome/browser/chrome_browser_main.h b/chrome/browser/chrome_browser_main.h
index d7063be..bfb3509 100644
--- a/chrome/browser/chrome_browser_main.h
+++ b/chrome/browser/chrome_browser_main.h
@@ -57,6 +57,15 @@
   // by InProcessBrowserTests to allow them to run until the BrowserProcess is
   // ready for the browser to exit.
   static std::unique_ptr<base::RunLoop> TakeRunLoopForTest();
+
+  // Handles notifications from other processes. The function receives the
+  // command line and directory with which the other Chrome process was
+  // launched. Return true if the command line will be handled within the
+  // current browser instance or false if the remote process should handle it
+  // (i.e., because the current process is shutting down).
+  static bool ProcessSingletonNotificationCallback(
+      const base::CommandLine& command_line,
+      const base::FilePath& current_directory);
 #endif
 
  protected:
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index d38a68e..41a0659 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -1336,6 +1336,8 @@
   registry->RegisterIntegerPref(
       prefs::kForceMajorVersionToMinorPositionInUserAgent,
       embedder_support::ForceMajorVersionToMinorPosition::kDefault);
+  registry->RegisterBooleanPref(
+      policy::policy_prefs::kWindowPlacementAlwaysAllowed, false);
 }
 
 // static
@@ -2551,8 +2553,7 @@
 
   Profile* profile = Profile::FromBrowserContext(browser_context);
   return profile && data_reduction_proxy::DataReductionProxySettings::
-                        IsDataSaverEnabledByUser(profile->IsOffTheRecord(),
-                                                 profile->GetPrefs());
+                        IsDataSaverEnabledByUser(profile->IsOffTheRecord());
 }
 
 void ChromeContentBrowserClient::UpdateRendererPreferencesForWorker(
@@ -3637,6 +3638,9 @@
       prefs->GetBoolean(prefs::kWebXRImmersiveArEnabled);
 #endif
 
+  web_prefs->window_placement_always_allowed =
+      prefs->GetBoolean(policy::policy_prefs::kWindowPlacementAlwaysAllowed);
+
   for (ChromeContentBrowserClientParts* parts : extra_parts_)
     parts->OverrideWebkitPrefs(web_contents, web_prefs);
 }
diff --git a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
index 42b1f58..7c99f751 100644
--- a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
+++ b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
@@ -15,8 +15,6 @@
 #include "chrome/browser/chrome_browser_interface_binders.h"
 #include "chrome/browser/chrome_content_browser_client_parts.h"
 #include "chrome/browser/content_settings/content_settings_manager_delegate.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
 #include "chrome/browser/headless/headless_mode_util.h"
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "chrome/browser/net/net_error_tab_helper.h"
@@ -30,7 +28,6 @@
 #include "components/autofill_assistant/content/browser/content_autofill_assistant_driver.h"
 #include "components/autofill_assistant/content/common/autofill_assistant_driver.mojom.h"
 #include "components/content_capture/browser/onscreen_content_provider.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
 #include "components/metrics/call_stack_profile_collector.h"
 #include "components/offline_pages/buildflags/buildflags.h"
 #include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 06a505b6..f99f4a4 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -3503,10 +3503,12 @@
     "extensions/login_screen/login/cleanup/open_windows_cleanup_handler.h",
     "extensions/login_screen/login/cleanup/print_jobs_cleanup_handler.cc",
     "extensions/login_screen/login/cleanup/print_jobs_cleanup_handler.h",
-    "extensions/login_screen/login/login_api.cc",
-    "extensions/login_screen/login/login_api.h",
+    "extensions/login_screen/login/errors.cc",
+    "extensions/login_screen/login/errors.h",
     "extensions/login_screen/login/login_api_lock_handler.cc",
     "extensions/login_screen/login/login_api_lock_handler.h",
+    "extensions/login_screen/login/prefs.cc",
+    "extensions/login_screen/login/prefs.h",
     "extensions/login_screen/login/shared_session_handler.cc",
     "extensions/login_screen/login/shared_session_handler.h",
     "extensions/login_screen/login_screen_storage/login_screen_storage_api.cc",
diff --git a/chrome/browser/chromeos/extensions/login_screen/BUILD.gn b/chrome/browser/chromeos/extensions/login_screen/BUILD.gn
index b14a54c..1a5b485 100644
--- a/chrome/browser/chromeos/extensions/login_screen/BUILD.gn
+++ b/chrome/browser/chromeos/extensions/login_screen/BUILD.gn
@@ -10,6 +10,8 @@
 
 source_set("login_screen") {
   sources = [
+    "login/login_api.cc",
+    "login/login_api.h",
     "login_state/login_state_api.cc",
     "login_state/login_state_api.h",
     "login_state/session_state_changed_event_dispatcher.cc",
@@ -36,6 +38,7 @@
   }
 }
 
+# TODO(jityao, b/215502706): Move tests back into chrome/test/BUILD.gn.
 source_set("browser_tests") {
   testonly = true
   defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/errors.cc b/chrome/browser/chromeos/extensions/login_screen/login/errors.cc
new file mode 100644
index 0000000..5472ae70
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/login_screen/login/errors.cc
@@ -0,0 +1,41 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/extensions/login_screen/login/errors.h"
+
+namespace extensions {
+
+namespace login_api_errors {
+
+const char kAlreadyActiveSession[] = "There is already an active session";
+const char kLoginScreenIsNotActive[] = "Login screen is not active";
+const char kAnotherLoginAttemptInProgress[] =
+    "Another login attempt is in progress";
+const char kNoManagedGuestSessionAccounts[] =
+    "No managed guest session accounts";
+const char kNoLockableManagedGuestSession[] =
+    "There is no lockable Managed Guest Session";
+const char kSessionIsNotActive[] = "Session is not active";
+const char kNoUnlockableManagedGuestSession[] =
+    "There is no unlockable Managed Guest Session";
+const char kSessionIsNotLocked[] = "Session is not locked";
+const char kAnotherUnlockAttemptInProgress[] =
+    "Another unlock attempt is in progress";
+const char kSharedMGSAlreadyLaunched[] =
+    "Shared Managed Guest Session has already been launched";
+const char kAuthenticationFailed[] = "Authentication failed";
+const char kNoSharedMGSFound[] = "No shared Managed Guest Session found";
+const char kSharedSessionIsNotActive[] = "Shared session is not active";
+const char kSharedSessionAlreadyLaunched[] =
+    "Another shared session has already been launched";
+const char kScryptFailure[] = "Scrypt failed";
+const char kCleanupInProgress[] = "Cleanup is already in progress";
+const char kUnlockFailure[] = "Managed Guest Session unlock failed";
+const char kDeviceRestrictedManagedGuestSessionNotEnabled[] =
+    "DeviceRestrictedManagedGuestSessionEnabled policy is not enabled for "
+    "shared kiosk mode";
+
+}  // namespace login_api_errors
+
+}  // namespace extensions
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/errors.h b/chrome/browser/chromeos/extensions/login_screen/login/errors.h
new file mode 100644
index 0000000..dfc92f8
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/login_screen/login/errors.h
@@ -0,0 +1,35 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_ERRORS_H_
+#define CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_ERRORS_H_
+
+namespace extensions {
+
+namespace login_api_errors {
+
+extern const char kAlreadyActiveSession[];
+extern const char kLoginScreenIsNotActive[];
+extern const char kAnotherLoginAttemptInProgress[];
+extern const char kNoManagedGuestSessionAccounts[];
+extern const char kNoLockableManagedGuestSession[];
+extern const char kSessionIsNotActive[];
+extern const char kNoUnlockableManagedGuestSession[];
+extern const char kSessionIsNotLocked[];
+extern const char kAnotherUnlockAttemptInProgress[];
+extern const char kAuthenticationFailed[];
+extern const char kSharedMGSAlreadyLaunched[];
+extern const char kNoSharedMGSFound[];
+extern const char kSharedSessionIsNotActive[];
+extern const char kSharedSessionAlreadyLaunched[];
+extern const char kScryptFailure[];
+extern const char kCleanupInProgress[];
+extern const char kUnlockFailure[];
+extern const char kDeviceRestrictedManagedGuestSessionNotEnabled[];
+
+}  // namespace login_api_errors
+
+}  // namespace extensions
+
+#endif  // CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_ERRORS_H_
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/login_api.cc b/chrome/browser/chromeos/extensions/login_screen/login/login_api.cc
index aa4017f..dc4e359c 100644
--- a/chrome/browser/chromeos/extensions/login_screen/login/login_api.cc
+++ b/chrome/browser/chromeos/extensions/login_screen/login/login_api.cc
@@ -6,70 +6,78 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 
-#include "ash/components/login/auth/key.h"
-#include "ash/components/login/auth/user_context.h"
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/values.h"
-#include "chrome/browser/ash/login/existing_user_controller.h"
-#include "chrome/browser/ash/login/signin_specifics.h"
-#include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/extensions/login_screen/login/login_api_lock_handler.h"
-#include "chrome/browser/chromeos/extensions/login_screen/login/shared_session_handler.h"
-#include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/common/extensions/api/login.h"
-#include "chrome/common/pref_names.h"
-#include "components/prefs/pref_service.h"
-#include "components/session_manager/core/session_manager.h"
-#include "components/user_manager/user.h"
-#include "components/user_manager/user_manager.h"
-#include "components/user_manager/user_type.h"
-#include "ui/base/user_activity/user_activity_detector.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "chromeos/lacros/lacros_service.h"
+#else
+#include "chrome/browser/ash/crosapi/crosapi_ash.h"
+#include "chrome/browser/ash/crosapi/crosapi_manager.h"
+#include "chrome/browser/ash/crosapi/login_ash.h"
+#endif
 
 namespace extensions {
 
-namespace login_api {
+namespace {
 
-void RegisterLocalStatePrefs(PrefRegistrySimple* registry) {
-  registry->RegisterStringPref(prefs::kLoginExtensionApiDataForNextLoginAttempt,
-                               "");
+crosapi::mojom::Login* GetLoginApi() {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  return chromeos::LacrosService::Get()
+      ->GetRemote<crosapi::mojom::Login>()
+      .get();
+#else
+  return crosapi::CrosapiManager::Get()->crosapi_ash()->login_ash();
+#endif
 }
 
-}  // namespace login_api
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+// Performs common crosapi validation. These errors are not caused by the
+// extension so they are considered recoverable. Returns an error message on
+// error, or nullopt on success.
+absl::optional<std::string> ValidateCrosapi() {
+  if (!chromeos::LacrosService::Get()->IsAvailable<crosapi::mojom::Login>()) {
+    return "Unsupported by ash";
+  }
+  return absl::nullopt;
+}
 
-namespace login_api_errors {
+const char kCannotBeCalledFromLacros[] = "API cannot be called from Lacros";
 
-const char kAlreadyActiveSession[] = "There is already an active session";
-const char kLoginScreenIsNotActive[] = "Login screen is not active";
-const char kAnotherLoginAttemptInProgress[] =
-    "Another login attempt is in progress";
-const char kNoManagedGuestSessionAccounts[] =
-    "No managed guest session accounts";
-const char kNoLockableManagedGuestSession[] =
-    "There is no lockable Managed Guest Session";
-const char kSessionIsNotActive[] = "Session is not active";
-const char kNoUnlockableManagedGuestSession[] =
-    "There is no unlockable Managed Guest Session";
-const char kSessionIsNotLocked[] = "Session is not locked";
-const char kAnotherUnlockAttemptInProgress[] =
-    "Another unlock attempt is in progress";
-const char kSharedMGSAlreadyLaunched[] =
-    "Shared Managed Guest Session has already been launched";
-const char kAuthenticationFailed[] = "Authentication failed";
-const char kNoSharedMGSFound[] = "No shared Managed Guest Session found";
-const char kSharedSessionIsNotActive[] = "Shared session is not active";
-const char kSharedSessionAlreadyLaunched[] =
-    "Another shared session has already been launched";
-const char kScryptFailure[] = "Scrypt failed";
-const char kCleanupInProgress[] = "Cleanup is already in progress";
-const char kUnlockFailure[] = "Managed Guest Session unlock failed";
-const char kDeviceRestrictedManagedGuestSessionNotEnabled[] =
-    "DeviceRestrictedManagedGuestSessionEnabled policy is not enabled for "
-    "shared kiosk mode";
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 
-}  // namespace login_api_errors
+}  // namespace
+
+ExtensionFunctionWithOptionalErrorResult::
+    ~ExtensionFunctionWithOptionalErrorResult() = default;
+
+void ExtensionFunctionWithOptionalErrorResult::OnResult(
+    const absl::optional<std::string>& error) {
+  if (error) {
+    Respond(Error(*error));
+    return;
+  }
+
+  return Respond(NoArguments());
+}
+
+ExtensionFunctionWithStringResult::~ExtensionFunctionWithStringResult() =
+    default;
+
+void ExtensionFunctionWithStringResult::OnResult(const std::string& result) {
+  Respond(OneArgument(base::Value(result)));
+}
+
+ExtensionFunctionWithVoidResult::~ExtensionFunctionWithVoidResult() = default;
+
+void ExtensionFunctionWithVoidResult::OnResult() {
+  Respond(NoArguments());
+}
 
 LoginLaunchManagedGuestSessionFunction::
     LoginLaunchManagedGuestSessionFunction() = default;
@@ -78,59 +86,50 @@
 
 ExtensionFunction::ResponseAction
 LoginLaunchManagedGuestSessionFunction::Run() {
-  ui::UserActivityDetector::Get()->HandleExternalUserActivity();
-
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  return RespondNow(Error(kCannotBeCalledFromLacros));
+#else
   auto parameters =
       api::login::LaunchManagedGuestSession::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(parameters);
 
-  if (session_manager::SessionManager::Get()->session_state() !=
-      session_manager::SessionState::LOGIN_PRIMARY) {
-    return RespondNow(Error(login_api_errors::kAlreadyActiveSession));
-  }
+  auto callback =
+      base::BindOnce(&LoginLaunchManagedGuestSessionFunction::OnResult, this);
 
-  auto* existing_user_controller =
-      ash::ExistingUserController::current_controller();
-  if (existing_user_controller->IsSigninInProgress()) {
-    return RespondNow(Error(login_api_errors::kAnotherLoginAttemptInProgress));
+  absl::optional<std::string> password;
+  if (parameters->password) {
+    password = std::move(*parameters->password);
   }
-
-  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
-  for (const user_manager::User* user : user_manager->GetUsers()) {
-    if (!user || user->GetType() != user_manager::USER_TYPE_PUBLIC_ACCOUNT)
-      continue;
-    ash::UserContext context(user_manager::USER_TYPE_PUBLIC_ACCOUNT,
-                             user->GetAccountId());
-    if (parameters->password) {
-      context.SetKey(ash::Key(*parameters->password));
-      context.SetCanLockManagedGuestSession(true);
-    }
-
-    existing_user_controller->Login(context, ash::SigninSpecifics());
-    return RespondNow(NoArguments());
-  }
-  return RespondNow(Error(login_api_errors::kNoManagedGuestSessionAccounts));
+  GetLoginApi()->LaunchManagedGuestSession(password, std::move(callback));
+  return did_respond() ? AlreadyResponded() : RespondLater();
+#endif
 }
 
 LoginExitCurrentSessionFunction::LoginExitCurrentSessionFunction() = default;
 LoginExitCurrentSessionFunction::~LoginExitCurrentSessionFunction() = default;
 
 ExtensionFunction::ResponseAction LoginExitCurrentSessionFunction::Run() {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  absl::optional<std::string> error = ValidateCrosapi();
+  if (error.has_value()) {
+    return RespondNow(Error(error.value()));
+  }
+#endif
+
   auto parameters = api::login::ExitCurrentSession::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(parameters);
 
-  PrefService* local_state = g_browser_process->local_state();
-  DCHECK(local_state);
+  auto callback =
+      base::BindOnce(&LoginExitCurrentSessionFunction::OnResult, this);
 
+  absl::optional<std::string> data_for_next_login_attempt;
   if (parameters->data_for_next_login_attempt) {
-    local_state->SetString(prefs::kLoginExtensionApiDataForNextLoginAttempt,
-                           *parameters->data_for_next_login_attempt);
-  } else {
-    local_state->ClearPref(prefs::kLoginExtensionApiDataForNextLoginAttempt);
+    data_for_next_login_attempt =
+        std::move(*parameters->data_for_next_login_attempt);
   }
-
-  chrome::AttemptUserExit();
-  return RespondNow(NoArguments());
+  GetLoginApi()->ExitCurrentSession(data_for_next_login_attempt,
+                                    std::move(callback));
+  return did_respond() ? AlreadyResponded() : RespondLater();
 }
 
 LoginFetchDataForNextLoginAttemptFunction::
@@ -140,13 +139,18 @@
 
 ExtensionFunction::ResponseAction
 LoginFetchDataForNextLoginAttemptFunction::Run() {
-  PrefService* local_state = g_browser_process->local_state();
-  DCHECK(local_state);
-  std::string data_for_next_login_attempt =
-      local_state->GetString(prefs::kLoginExtensionApiDataForNextLoginAttempt);
-  local_state->ClearPref(prefs::kLoginExtensionApiDataForNextLoginAttempt);
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  absl::optional<std::string> error = ValidateCrosapi();
+  if (error.has_value()) {
+    return RespondNow(Error(error.value()));
+  }
+#endif
 
-  return RespondNow(OneArgument(base::Value(data_for_next_login_attempt)));
+  auto callback = base::BindOnce(
+      &LoginFetchDataForNextLoginAttemptFunction::OnResult, this);
+
+  GetLoginApi()->FetchDataForNextLoginAttempt(std::move(callback));
+  return did_respond() ? AlreadyResponded() : RespondLater();
 }
 
 LoginLockManagedGuestSessionFunction::LoginLockManagedGuestSessionFunction() =
@@ -155,24 +159,18 @@
     default;
 
 ExtensionFunction::ResponseAction LoginLockManagedGuestSessionFunction::Run() {
-  ui::UserActivityDetector::Get()->HandleExternalUserActivity();
-
-  const user_manager::UserManager* user_manager =
-      user_manager::UserManager::Get();
-  const user_manager::User* active_user = user_manager->GetActiveUser();
-  if (!active_user ||
-      active_user->GetType() != user_manager::USER_TYPE_PUBLIC_ACCOUNT ||
-      !user_manager->CanCurrentUserLock()) {
-    return RespondNow(Error(login_api_errors::kNoLockableManagedGuestSession));
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  absl::optional<std::string> error = ValidateCrosapi();
+  if (error.has_value()) {
+    return RespondNow(Error(error.value()));
   }
+#endif
 
-  if (session_manager::SessionManager::Get()->session_state() !=
-      session_manager::SessionState::ACTIVE) {
-    return RespondNow(Error(login_api_errors::kSessionIsNotActive));
-  }
+  auto callback =
+      base::BindOnce(&LoginLockManagedGuestSessionFunction::OnResult, this);
 
-  chromeos::LoginApiLockHandler::Get()->RequestLockScreen();
-  return RespondNow(NoArguments());
+  GetLoginApi()->LockManagedGuestSession(std::move(callback));
+  return did_respond() ? AlreadyResponded() : RespondLater();
 }
 
 LoginUnlockManagedGuestSessionFunction::
@@ -182,51 +180,20 @@
 
 ExtensionFunction::ResponseAction
 LoginUnlockManagedGuestSessionFunction::Run() {
-  ui::UserActivityDetector::Get()->HandleExternalUserActivity();
-
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  return RespondNow(Error(kCannotBeCalledFromLacros));
+#else
   auto parameters =
       api::login::UnlockManagedGuestSession::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(parameters);
 
-  const user_manager::UserManager* user_manager =
-      user_manager::UserManager::Get();
-  const user_manager::User* active_user = user_manager->GetActiveUser();
-  if (!active_user ||
-      active_user->GetType() != user_manager::USER_TYPE_PUBLIC_ACCOUNT ||
-      !user_manager->CanCurrentUserLock()) {
-    return RespondNow(
-        Error(login_api_errors::kNoUnlockableManagedGuestSession));
-  }
+  auto callback =
+      base::BindOnce(&LoginUnlockManagedGuestSessionFunction::OnResult, this);
 
-  if (session_manager::SessionManager::Get()->session_state() !=
-      session_manager::SessionState::LOCKED) {
-    return RespondNow(Error(login_api_errors::kSessionIsNotLocked));
-  }
-
-  chromeos::LoginApiLockHandler* handler = chromeos::LoginApiLockHandler::Get();
-  if (handler->IsUnlockInProgress()) {
-    return RespondNow(Error(login_api_errors::kAnotherUnlockAttemptInProgress));
-  }
-
-  ash::UserContext context(user_manager::USER_TYPE_PUBLIC_ACCOUNT,
-                           active_user->GetAccountId());
-  context.SetKey(ash::Key(parameters->password));
-  handler->Authenticate(
-      context,
-      base::BindOnce(
-          &LoginUnlockManagedGuestSessionFunction::OnAuthenticationComplete,
-          this));
+  GetLoginApi()->UnlockManagedGuestSession(parameters->password,
+                                           std::move(callback));
   return did_respond() ? AlreadyResponded() : RespondLater();
-}
-
-void LoginUnlockManagedGuestSessionFunction::OnAuthenticationComplete(
-    bool success) {
-  if (!success) {
-    Respond(Error(login_api_errors::kAuthenticationFailed));
-    return;
-  }
-
-  Respond(NoArguments());
+#endif
 }
 
 LoginLaunchSharedManagedGuestSessionFunction::
@@ -236,104 +203,73 @@
 
 ExtensionFunction::ResponseAction
 LoginLaunchSharedManagedGuestSessionFunction::Run() {
-  ui::UserActivityDetector::Get()->HandleExternalUserActivity();
-
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  return RespondNow(Error(kCannotBeCalledFromLacros));
+#else
   auto parameters =
       api::login::LaunchSharedManagedGuestSession::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(parameters);
 
-  absl::optional<std::string> error =
-      chromeos::SharedSessionHandler::Get()->LaunchSharedManagedGuestSession(
-          parameters->password);
-  if (error) {
-    return RespondNow(Error(*error));
-  }
+  auto callback = base::BindOnce(
+      &LoginLaunchSharedManagedGuestSessionFunction::OnResult, this);
 
-  return RespondNow(NoArguments());
+  GetLoginApi()->LaunchSharedManagedGuestSession(parameters->password,
+                                                 std::move(callback));
+  return did_respond() ? AlreadyResponded() : RespondLater();
+#endif
 }
 
 LoginEnterSharedSessionFunction::LoginEnterSharedSessionFunction() = default;
 LoginEnterSharedSessionFunction::~LoginEnterSharedSessionFunction() = default;
 
 ExtensionFunction::ResponseAction LoginEnterSharedSessionFunction::Run() {
-  ui::UserActivityDetector::Get()->HandleExternalUserActivity();
-
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  return RespondNow(Error(kCannotBeCalledFromLacros));
+#else
   auto parameters = api::login::EnterSharedSession::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(parameters);
 
-  chromeos::SharedSessionHandler::Get()->EnterSharedSession(
-      parameters->password,
-      base::BindOnce(
-          &LoginEnterSharedSessionFunction::OnEnterSharedSessionComplete,
-          this));
+  auto callback =
+      base::BindOnce(&LoginEnterSharedSessionFunction::OnResult, this);
 
+  GetLoginApi()->EnterSharedSession(parameters->password, std::move(callback));
   return did_respond() ? AlreadyResponded() : RespondLater();
-}
-
-void LoginEnterSharedSessionFunction::OnEnterSharedSessionComplete(
-    absl::optional<std::string> error) {
-  if (error) {
-    Respond(Error(*error));
-    return;
-  }
-
-  Respond(NoArguments());
+#endif
 }
 
 LoginUnlockSharedSessionFunction::LoginUnlockSharedSessionFunction() = default;
 LoginUnlockSharedSessionFunction::~LoginUnlockSharedSessionFunction() = default;
 
 ExtensionFunction::ResponseAction LoginUnlockSharedSessionFunction::Run() {
-  ui::UserActivityDetector::Get()->HandleExternalUserActivity();
-
-  auto parameters = api::login::UnlockSharedSession::Params::Create(args());
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  return RespondNow(Error(kCannotBeCalledFromLacros));
+#else
+  auto parameters = api::login::EnterSharedSession::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(parameters);
 
-  const user_manager::UserManager* user_manager =
-      user_manager::UserManager::Get();
-  const user_manager::User* active_user = user_manager->GetActiveUser();
-  if (!active_user || !user_manager->CanCurrentUserLock()) {
-    return RespondNow(
-        Error(login_api_errors::kNoUnlockableManagedGuestSession));
-  }
+  auto callback =
+      base::BindOnce(&LoginUnlockSharedSessionFunction::OnResult, this);
 
-  chromeos::SharedSessionHandler::Get()->UnlockSharedSession(
-      parameters->password,
-      base::BindOnce(
-          &LoginUnlockSharedSessionFunction::OnUnlockSharedSessionComplete,
-          this));
-
+  GetLoginApi()->UnlockSharedSession(parameters->password, std::move(callback));
   return did_respond() ? AlreadyResponded() : RespondLater();
-}
-
-void LoginUnlockSharedSessionFunction::OnUnlockSharedSessionComplete(
-    absl::optional<std::string> error) {
-  if (error) {
-    Respond(Error(*error));
-    return;
-  }
-
-  Respond(NoArguments());
+#endif
 }
 
 LoginEndSharedSessionFunction::LoginEndSharedSessionFunction() = default;
 LoginEndSharedSessionFunction::~LoginEndSharedSessionFunction() = default;
 
 ExtensionFunction::ResponseAction LoginEndSharedSessionFunction::Run() {
-  chromeos::SharedSessionHandler::Get()->EndSharedSession(base::BindOnce(
-      &LoginEndSharedSessionFunction::OnEndSharedSessionComplete, this));
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // TODO(jityao, b:217155485): Enable for Lacros after cleanup handlers are
+  // added.
+  return RespondNow(Error(kCannotBeCalledFromLacros));
+#else
+  auto callback =
+      base::BindOnce(&LoginEndSharedSessionFunction::OnResult, this);
 
+  GetLoginApi()->EndSharedSession(std::move(callback));
   return did_respond() ? AlreadyResponded() : RespondLater();
-}
-
-void LoginEndSharedSessionFunction::OnEndSharedSessionComplete(
-    absl::optional<std::string> error) {
-  if (error) {
-    Respond(Error(*error));
-    return;
-  }
-
-  Respond(NoArguments());
+#endif
 }
 
 LoginSetDataForNextLoginAttemptFunction::
@@ -343,16 +279,23 @@
 
 ExtensionFunction::ResponseAction
 LoginSetDataForNextLoginAttemptFunction::Run() {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  absl::optional<std::string> error = ValidateCrosapi();
+  if (error.has_value()) {
+    return RespondNow(Error(error.value()));
+  }
+#endif
+
   auto parameters =
       api::login::SetDataForNextLoginAttempt::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(parameters);
 
-  PrefService* local_state = g_browser_process->local_state();
-  DCHECK(local_state);
-  local_state->SetString(prefs::kLoginExtensionApiDataForNextLoginAttempt,
-                         parameters->data_for_next_login_attempt);
+  auto callback =
+      base::BindOnce(&LoginSetDataForNextLoginAttemptFunction::OnResult, this);
 
-  return RespondNow(NoArguments());
+  GetLoginApi()->SetDataForNextLoginAttempt(
+      parameters->data_for_next_login_attempt, std::move(callback));
+  return did_respond() ? AlreadyResponded() : RespondLater();
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/login_api.h b/chrome/browser/chromeos/extensions/login_screen/login/login_api.h
index 9263ac30..7e8e31b 100644
--- a/chrome/browser/chromeos/extensions/login_screen/login/login_api.h
+++ b/chrome/browser/chromeos/extensions/login_screen/login/login_api.h
@@ -5,41 +5,35 @@
 #ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_LOGIN_API_H_
 #define CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_LOGIN_API_H_
 
-#include "components/prefs/pref_registry_simple.h"
+#include "chromeos/crosapi/mojom/login.mojom.h"
 #include "extensions/browser/extension_function.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace extensions {
 
-namespace login_api {
+class ExtensionFunctionWithOptionalErrorResult : public ExtensionFunction {
+ protected:
+  ~ExtensionFunctionWithOptionalErrorResult() override;
 
-void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
+  void OnResult(const absl::optional<std::string>& error);
+};
 
-}  // namespace login_api
+class ExtensionFunctionWithStringResult : public ExtensionFunction {
+ protected:
+  ~ExtensionFunctionWithStringResult() override;
 
-namespace login_api_errors {
+  void OnResult(const std::string& result);
+};
 
-extern const char kAlreadyActiveSession[];
-extern const char kLoginScreenIsNotActive[];
-extern const char kAnotherLoginAttemptInProgress[];
-extern const char kNoManagedGuestSessionAccounts[];
-extern const char kNoLockableManagedGuestSession[];
-extern const char kSessionIsNotActive[];
-extern const char kNoUnlockableManagedGuestSession[];
-extern const char kSessionIsNotLocked[];
-extern const char kAnotherUnlockAttemptInProgress[];
-extern const char kAuthenticationFailed[];
-extern const char kSharedMGSAlreadyLaunched[];
-extern const char kNoSharedMGSFound[];
-extern const char kSharedSessionIsNotActive[];
-extern const char kSharedSessionAlreadyLaunched[];
-extern const char kScryptFailure[];
-extern const char kCleanupInProgress[];
-extern const char kUnlockFailure[];
-extern const char kDeviceRestrictedManagedGuestSessionNotEnabled[];
+class ExtensionFunctionWithVoidResult : public ExtensionFunction {
+ protected:
+  ~ExtensionFunctionWithVoidResult() override;
 
-}  // namespace login_api_errors
+  void OnResult();
+};
 
-class LoginLaunchManagedGuestSessionFunction : public ExtensionFunction {
+class LoginLaunchManagedGuestSessionFunction
+    : public ExtensionFunctionWithOptionalErrorResult {
  public:
   LoginLaunchManagedGuestSessionFunction();
 
@@ -59,7 +53,8 @@
   ResponseAction Run() override;
 };
 
-class LoginExitCurrentSessionFunction : public ExtensionFunction {
+class LoginExitCurrentSessionFunction
+    : public ExtensionFunctionWithOptionalErrorResult {
  public:
   LoginExitCurrentSessionFunction();
 
@@ -79,7 +74,8 @@
   ResponseAction Run() override;
 };
 
-class LoginFetchDataForNextLoginAttemptFunction : public ExtensionFunction {
+class LoginFetchDataForNextLoginAttemptFunction
+    : public ExtensionFunctionWithStringResult {
  public:
   LoginFetchDataForNextLoginAttemptFunction();
 
@@ -99,7 +95,8 @@
   ResponseAction Run() override;
 };
 
-class LoginLockManagedGuestSessionFunction : public ExtensionFunction {
+class LoginLockManagedGuestSessionFunction
+    : public ExtensionFunctionWithOptionalErrorResult {
  public:
   LoginLockManagedGuestSessionFunction();
 
@@ -119,7 +116,8 @@
   ResponseAction Run() override;
 };
 
-class LoginUnlockManagedGuestSessionFunction : public ExtensionFunction {
+class LoginUnlockManagedGuestSessionFunction
+    : public ExtensionFunctionWithOptionalErrorResult {
  public:
   LoginUnlockManagedGuestSessionFunction();
 
@@ -137,12 +135,10 @@
 
   // ExtensionFunction:
   ResponseAction Run() override;
-
- private:
-  void OnAuthenticationComplete(bool success);
 };
 
-class LoginLaunchSharedManagedGuestSessionFunction : public ExtensionFunction {
+class LoginLaunchSharedManagedGuestSessionFunction
+    : public ExtensionFunctionWithOptionalErrorResult {
  public:
   LoginLaunchSharedManagedGuestSessionFunction();
 
@@ -162,7 +158,8 @@
   ResponseAction Run() override;
 };
 
-class LoginEnterSharedSessionFunction : public ExtensionFunction {
+class LoginEnterSharedSessionFunction
+    : public ExtensionFunctionWithOptionalErrorResult {
  public:
   LoginEnterSharedSessionFunction();
 
@@ -180,12 +177,10 @@
 
   // ExtensionFunction:
   ResponseAction Run() override;
-
- private:
-  void OnEnterSharedSessionComplete(absl::optional<std::string> error);
 };
 
-class LoginUnlockSharedSessionFunction : public ExtensionFunction {
+class LoginUnlockSharedSessionFunction
+    : public ExtensionFunctionWithOptionalErrorResult {
  public:
   LoginUnlockSharedSessionFunction();
 
@@ -203,12 +198,10 @@
 
   // ExtensionFunction:
   ResponseAction Run() override;
-
- private:
-  void OnUnlockSharedSessionComplete(absl::optional<std::string> error);
 };
 
-class LoginEndSharedSessionFunction : public ExtensionFunction {
+class LoginEndSharedSessionFunction
+    : public ExtensionFunctionWithOptionalErrorResult {
  public:
   LoginEndSharedSessionFunction();
 
@@ -224,12 +217,10 @@
 
   // ExtensionFunction:
   ResponseAction Run() override;
-
- private:
-  void OnEndSharedSessionComplete(absl::optional<std::string> error);
 };
 
-class LoginSetDataForNextLoginAttemptFunction : public ExtensionFunction {
+class LoginSetDataForNextLoginAttemptFunction
+    : public ExtensionFunctionWithVoidResult {
  public:
   LoginSetDataForNextLoginAttemptFunction();
 
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/login_api_unittest.cc b/chrome/browser/chromeos/extensions/login_screen/login/login_api_unittest.cc
index a2302bc..313e477 100644
--- a/chrome/browser/chromeos/extensions/login_screen/login/login_api_unittest.cc
+++ b/chrome/browser/chromeos/extensions/login_screen/login/login_api_unittest.cc
@@ -26,6 +26,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/cleanup_manager.h"
 #include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/mock_cleanup_handler.h"
+#include "chrome/browser/chromeos/extensions/login_screen/login/errors.h"
 #include "chrome/browser/chromeos/extensions/login_screen/login/login_api_lock_handler.h"
 #include "chrome/browser/chromeos/extensions/login_screen/login/shared_session_handler.h"
 #include "chrome/browser/extensions/extension_api_unittest.h"
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/prefs.cc b/chrome/browser/chromeos/extensions/login_screen/login/prefs.cc
new file mode 100644
index 0000000..ed52585
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/login_screen/login/prefs.cc
@@ -0,0 +1,22 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/extensions/login_screen/login/errors.h"
+
+#include "chrome/common/pref_names.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/pref_service.h"
+
+namespace extensions {
+
+namespace login_api {
+
+void RegisterLocalStatePrefs(PrefRegistrySimple* registry) {
+  registry->RegisterStringPref(prefs::kLoginExtensionApiDataForNextLoginAttempt,
+                               "");
+}
+
+}  // namespace login_api
+
+}  // namespace extensions
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/prefs.h b/chrome/browser/chromeos/extensions/login_screen/login/prefs.h
new file mode 100644
index 0000000..04bf25d3e
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/login_screen/login/prefs.h
@@ -0,0 +1,20 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_PREFS_H_
+#define CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_PREFS_H_
+
+class PrefRegistrySimple;
+
+namespace extensions {
+
+namespace login_api {
+
+void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
+
+}  // namespace login_api
+
+}  // namespace extensions
+
+#endif  // CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_PREFS_H_
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/shared_session_handler.cc b/chrome/browser/chromeos/extensions/login_screen/login/shared_session_handler.cc
index e7375e6e..1333e882 100644
--- a/chrome/browser/chromeos/extensions/login_screen/login/shared_session_handler.cc
+++ b/chrome/browser/chromeos/extensions/login_screen/login/shared_session_handler.cc
@@ -10,10 +10,11 @@
 #include "ash/components/settings/cros_settings_names.h"
 #include "base/bind.h"
 #include "base/no_destructor.h"
+#include "base/strings/string_number_conversions.h"
 #include "chrome/browser/ash/login/existing_user_controller.h"
 #include "chrome/browser/ash/settings/cros_settings.h"
 #include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/cleanup_manager.h"
-#include "chrome/browser/chromeos/extensions/login_screen/login/login_api.h"
+#include "chrome/browser/chromeos/extensions/login_screen/login/errors.h"
 #include "chrome/browser/chromeos/extensions/login_screen/login/login_api_lock_handler.h"
 #include "chrome/browser/ui/ash/session_controller_client_impl.h"
 #include "components/session_manager/core/session_manager.h"
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager_lacros.cc b/chrome/browser/chromeos/policy/dlp/dlp_content_manager_lacros.cc
index e3cbf2be..d843c85 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager_lacros.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager_lacros.cc
@@ -67,6 +67,11 @@
   }
   DCHECK_EQ(media_id.type, content::DesktopMediaID::Type::TYPE_WINDOW);
   aura::Window* window = content::DesktopMediaID::GetNativeWindowById(media_id);
+  // TODO(crbug.com/1293023): Should not normally happen when |window_id| will
+  // be correctly set.
+  if (media_id.window_id == 0 || !window) {
+    return nullptr;
+  }
   result->window_id = lacros_window_utility::GetRootWindowUniqueId(window);
   return result;
 }
@@ -107,9 +112,15 @@
     return;
   }
 
+  crosapi::mojom::ScreenShareAreaPtr area = ConvertToScreenShareArea(media_id);
+  if (!area) {
+    LOG(WARNING) << "DLP can't identify screen shared area";
+    std::move(callback).Run(true);
+    return;
+  }
+
   lacros_service->GetRemote<crosapi::mojom::Dlp>()->CheckScreenShareRestriction(
-      ConvertToScreenShareArea(media_id), application_title,
-      std::move(callback));
+      std::move(area), application_title, std::move(callback));
 }
 
 void DlpContentManagerLacros::OnScreenCaptureStarted(
@@ -123,12 +134,19 @@
       AddScreenShare(label, media_id, application_title, stop_callback,
                      state_change_callback);
     } else {
+      crosapi::mojom::ScreenShareAreaPtr area =
+          ConvertToScreenShareArea(media_id);
+      if (!area) {
+        LOG(WARNING) << "DLP can't identify screen shared area";
+        continue;
+      }
+
       chromeos::LacrosService* lacros_service = chromeos::LacrosService::Get();
       auto delegate = std::make_unique<ScreenShareStateChangeDelegate>(
           label, media_id, state_change_callback, stop_callback);
       if (lacros_service->IsAvailable<crosapi::mojom::Dlp>()) {
         lacros_service->GetRemote<crosapi::mojom::Dlp>()->OnScreenShareStarted(
-            label, ConvertToScreenShareArea(media_id), application_title,
+            label, std::move(area), application_title,
             delegate->BindDelegate());
         running_remote_screen_shares_.push_back(std::move(delegate));
       }
@@ -143,10 +161,17 @@
   if (media_id.type == content::DesktopMediaID::Type::TYPE_WEB_CONTENTS) {
     RemoveScreenShare(label, media_id);
   } else {
+    crosapi::mojom::ScreenShareAreaPtr area =
+        ConvertToScreenShareArea(media_id);
+    if (!area) {
+      LOG(WARNING) << "DLP can't identify screen shared area";
+      return;
+    }
     chromeos::LacrosService* lacros_service = chromeos::LacrosService::Get();
+
     if (lacros_service->IsAvailable<crosapi::mojom::Dlp>()) {
       lacros_service->GetRemote<crosapi::mojom::Dlp>()->OnScreenShareStopped(
-          label, ConvertToScreenShareArea(media_id));
+          label, std::move(area));
     }
     base::EraseIf(
         running_remote_screen_shares_,
diff --git a/chrome/browser/commerce/BUILD.gn b/chrome/browser/commerce/BUILD.gn
deleted file mode 100644
index 8912d4c..0000000
--- a/chrome/browser/commerce/BUILD.gn
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2021 The Chromium Authors.All rights reserved.
-# Use of this source code is governed by a BSD - style license that can be
-# found in the LICENSE file.
-
-if (is_android) {
-  import("//build/config/android/rules.gni")
-}
-
-source_set("feature_list") {
-  sources = [
-    "commerce_feature_list.cc",
-    "commerce_feature_list.h",
-  ]
-
-  deps = [
-    "//base",
-    "//third_party/re2:re2",
-    "//url:url",
-  ]
-}
diff --git a/chrome/browser/commerce/coupons/coupon_service.cc b/chrome/browser/commerce/coupons/coupon_service.cc
index 99dd3981..e384d57f 100644
--- a/chrome/browser/commerce/coupons/coupon_service.cc
+++ b/chrome/browser/commerce/coupons/coupon_service.cc
@@ -4,8 +4,8 @@
 
 #include "chrome/browser/commerce/coupons/coupon_service.h"
 #include "chrome/browser/cart/cart_features.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/commerce/coupons/coupon_db_content.pb.h"
+#include "components/commerce/core/commerce_feature_list.h"
 
 namespace {
 
diff --git a/chrome/browser/commerce/coupons/coupon_service_unittest.cc b/chrome/browser/commerce/coupons/coupon_service_unittest.cc
index 822480a..14523ab 100644
--- a/chrome/browser/commerce/coupons/coupon_service_unittest.cc
+++ b/chrome/browser/commerce/coupons/coupon_service_unittest.cc
@@ -5,12 +5,12 @@
 #include "chrome/browser/commerce/coupons/coupon_service.h"
 
 #include "base/memory/raw_ptr.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/commerce/coupons/coupon_db_content.pb.h"
 #include "chrome/browser/commerce/coupons/coupon_service_factory.h"
 #include "chrome/browser/persisted_state_db/profile_proto_db.h"
 #include "chrome/browser/persisted_state_db/profile_proto_db_factory.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/commerce/merchant_viewer/BUILD.gn b/chrome/browser/commerce/merchant_viewer/BUILD.gn
index a380808..1ad5c20a 100644
--- a/chrome/browser/commerce/merchant_viewer/BUILD.gn
+++ b/chrome/browser/commerce/merchant_viewer/BUILD.gn
@@ -41,10 +41,10 @@
     ":merchant_signal_db",
     ":merchant_signal_db_content_proto",
     "//base:base",
-    "//chrome/browser/commerce:feature_list",
     "//chrome/browser/persisted_state_db:persisted_state_db",
     "//chrome/browser/profiles",
     "//chrome/browser/profiles:profile",
+    "//components/commerce/core:feature_list",
     "//components/keyed_service/content",
     "//components/leveldb_proto",
     "//content/public/browser:browser",
diff --git a/chrome/browser/commerce/merchant_viewer/merchant_viewer_data_manager.cc b/chrome/browser/commerce/merchant_viewer/merchant_viewer_data_manager.cc
index bb39710..5290e29 100644
--- a/chrome/browser/commerce/merchant_viewer/merchant_viewer_data_manager.cc
+++ b/chrome/browser/commerce/merchant_viewer/merchant_viewer_data_manager.cc
@@ -9,9 +9,9 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/histogram_macros_local.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/persisted_state_db/profile_proto_db.h"
 #include "chrome/browser/persisted_state_db/profile_proto_db_factory.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "content/public/browser/android/browser_context_handle.h"
 
 MerchantViewerDataManager::MerchantViewerDataManager(
diff --git a/chrome/browser/commerce/merchant_viewer/merchant_viewer_data_manager_unittest.cc b/chrome/browser/commerce/merchant_viewer/merchant_viewer_data_manager_unittest.cc
index fac6d5e1..b49b337 100644
--- a/chrome/browser/commerce/merchant_viewer/merchant_viewer_data_manager_unittest.cc
+++ b/chrome/browser/commerce/merchant_viewer/merchant_viewer_data_manager_unittest.cc
@@ -9,11 +9,11 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/histogram_macros_local.h"
 #include "base/test/metrics/histogram_tester.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/commerce/merchant_viewer/merchant_viewer_data_manager_factory.h"
 #include "chrome/browser/persisted_state_db/profile_proto_db.h"
 #include "chrome/browser/persisted_state_db/profile_proto_db_factory.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "content/public/browser/android/browser_context_handle.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc
index 0ba1d3d4..2346cf83 100644
--- a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc
+++ b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc
@@ -27,8 +27,6 @@
 #include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/pref_names.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
 #include "components/embedder_support/user_agent_utils.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
@@ -75,155 +73,22 @@
   sql::Database::Delete(optout_database_file);
 }
 
-// Assume that any proxy host ending with this suffix is a Data Reduction Proxy.
-const char kDataReductionProxyDefaultHostSuffix[] = ".googlezip.net";
-
-// Searches |proxy_list| for any Data Reduction Proxies, even if they don't
-// match a currently configured Data Reduction Proxy.
-bool ContainsDataReductionProxyDefaultHostSuffix(
-    const net::ProxyList& proxy_list) {
-  for (const net::ProxyServer& proxy : proxy_list.GetAll()) {
-    if (proxy.is_valid() && !proxy.is_direct() &&
-        base::EndsWith(proxy.host_port_pair().host(),
-                       kDataReductionProxyDefaultHostSuffix,
-                       base::CompareCase::SENSITIVE)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// Searches |proxy_rules| for any Data Reduction Proxies, even if they don't
-// match a currently configured Data Reduction Proxy.
-bool ContainsDataReductionProxyDefaultHostSuffix(
-    const net::ProxyConfig::ProxyRules& proxy_rules) {
-  return ContainsDataReductionProxyDefaultHostSuffix(
-             proxy_rules.proxies_for_http) ||
-         ContainsDataReductionProxyDefaultHostSuffix(
-             proxy_rules.proxies_for_https);
-}
-
-// Extract the embedded PAC script from the given |pac_url|, and store the
-// extracted script in |pac_script|. Returns true if extraction was successful,
-// otherwise returns false. |pac_script| must not be NULL.
-bool GetEmbeddedPacScript(base::StringPiece pac_url, std::string* pac_script) {
-  DCHECK(pac_script);
-  static const char kPacURLPrefix[] =
-      "data:application/x-ns-proxy-autoconfig;base64,";
-  return base::StartsWith(pac_url, kPacURLPrefix,
-                          base::CompareCase::SENSITIVE) &&
-         base::Base64Decode(pac_url.substr(base::size(kPacURLPrefix) - 1),
-                            pac_script);
-}
-
 }  // namespace
 
-// The Data Reduction Proxy has been turned into a "best effort" proxy,
-// meaning it is used only if the effective proxy configuration resolves to
-// DIRECT for a URL. It no longer can be a ProxyConfig in the proxy preference
-// hierarchy. This method removes the Data Reduction Proxy configuration from
-// prefs, if present. |proxy_pref_name| is the name of the proxy pref.
-void DataReductionProxyChromeSettings::MigrateDataReductionProxyOffProxyPrefs(
-    PrefService* prefs) {
-  ProxyPrefMigrationResult proxy_pref_status =
-      MigrateDataReductionProxyOffProxyPrefsHelper(prefs);
-  UMA_HISTOGRAM_ENUMERATION("DataReductionProxy.ProxyPrefMigrationResult",
-                            proxy_pref_status,
-                            DataReductionProxyChromeSettings::PROXY_PREF_MAX);
-}
-
-DataReductionProxyChromeSettings::ProxyPrefMigrationResult
-DataReductionProxyChromeSettings::MigrateDataReductionProxyOffProxyPrefsHelper(
-    PrefService* prefs) {
-  base::DictionaryValue* dict = (base::DictionaryValue*)prefs->GetUserPrefValue(
-      proxy_config::prefs::kProxy);
-  if (!dict)
-    return PROXY_PREF_NOT_CLEARED;
-
-  // Clear empty "proxy" dictionary created by a bug. See http://crbug/448172.
-  if (dict->DictEmpty()) {
-    prefs->ClearPref(proxy_config::prefs::kProxy);
-    return PROXY_PREF_CLEARED_EMPTY;
-  }
-
-  std::string mode;
-  if (!dict->GetString("mode", &mode))
-    return PROXY_PREF_NOT_CLEARED;
-  // Clear "system" proxy entry since this is the default. This entry was
-  // created by bug (http://crbug/448172).
-  if (ProxyModeToString(ProxyPrefs::MODE_SYSTEM) == mode) {
-    prefs->ClearPref(proxy_config::prefs::kProxy);
-    return PROXY_PREF_CLEARED_MODE_SYSTEM;
-  }
-
-  // From M36 to M40, the DRP was configured using MODE_FIXED_SERVERS in the
-  // proxy pref.
-  if (ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS) == mode) {
-    std::string proxy_server;
-    if (!dict->GetString("server", &proxy_server))
-      return PROXY_PREF_NOT_CLEARED;
-    net::ProxyConfig::ProxyRules proxy_rules;
-    proxy_rules.ParseFromString(proxy_server);
-    // Clear the proxy pref if it matches a currently configured Data Reduction
-    // Proxy, or if the proxy host ends with ".googlezip.net", in order to
-    // ensure that any DRP in the pref is cleared even if the DRP configuration
-    // was changed. See http://crbug.com/476610.
-    ProxyPrefMigrationResult rv;
-    if (ContainsDataReductionProxyDefaultHostSuffix(proxy_rules))
-      rv = PROXY_PREF_CLEARED_GOOGLEZIP;
-    else
-      return PROXY_PREF_NOT_CLEARED;
-
-    prefs->ClearPref(proxy_config::prefs::kProxy);
-    return rv;
-  }
-
-  // Before M35, the DRP was configured using a PAC script base64 encoded into a
-  // PAC url.
-  if (ProxyModeToString(ProxyPrefs::MODE_PAC_SCRIPT) == mode) {
-    std::string pac_url;
-    std::string pac_script;
-    if (!dict->GetString("pac_url", &pac_url) ||
-        !GetEmbeddedPacScript(pac_url, &pac_script)) {
-      return PROXY_PREF_NOT_CLEARED;
-    }
-
-    // In M35 and earlier, the way of specifying the DRP in a PAC script would
-    // always include the port number after the host even if the port number
-    // could be implied, so searching for ".googlezip.net:" in the PAC script
-    // indicates whether there's a proxy in that PAC script with a host of the
-    // form "*.googlezip.net".
-    if (pac_script.find(".googlezip.net:") == std::string::npos)
-      return PROXY_PREF_NOT_CLEARED;
-
-    prefs->ClearPref(proxy_config::prefs::kProxy);
-    return PROXY_PREF_CLEARED_PAC_GOOGLEZIP;
-  }
-
-  return PROXY_PREF_NOT_CLEARED;
-}
-
 DataReductionProxyChromeSettings::DataReductionProxyChromeSettings(
     bool is_off_the_record_profile)
     : data_reduction_proxy::DataReductionProxySettings(
-          is_off_the_record_profile),
-      profile_(nullptr) {
+          is_off_the_record_profile) {
   DCHECK(!is_off_the_record_profile);
 }
 
 DataReductionProxyChromeSettings::~DataReductionProxyChromeSettings() {}
 
-void DataReductionProxyChromeSettings::Shutdown() {
-  data_reduction_proxy::DataReductionProxyService* service =
-      data_reduction_proxy_service();
-  if (service)
-    service->Shutdown();
-}
+void DataReductionProxyChromeSettings::Shutdown() {}
 
 void DataReductionProxyChromeSettings::InitDataReductionProxySettings(
     Profile* profile,
     const scoped_refptr<base::SequencedTaskRunner>& db_task_runner) {
-  profile_ = profile;
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   // Delete Previews OptOut database file.
@@ -244,28 +109,6 @@
       FROM_HERE, base::BindOnce(DeleteHostDataUseDatabaseOnDBThread,
                                 profile_path.Append(kHostDataUseDBName)));
 
-  PrefService* profile_prefs = profile->GetPrefs();
-  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory =
-      profile->GetDefaultStoragePartition()
-          ->GetURLLoaderFactoryForBrowserProcess();
-  std::unique_ptr<data_reduction_proxy::DataReductionProxyService> service =
-      std::make_unique<data_reduction_proxy::DataReductionProxyService>(
-          this, profile_prefs);
   data_reduction_proxy::DataReductionProxySettings::
-      InitDataReductionProxySettings(profile_prefs, std::move(service));
-
-  data_reduction_proxy::DataReductionProxySettings::
-      SetCallbackToRegisterSyntheticFieldTrial(base::BindRepeating(
-          [](base::StringPiece trial_name, base::StringPiece group_name) {
-            return ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial(
-                trial_name, group_name,
-                variations::SyntheticTrialAnnotationMode::kNextLog);
-          }));
-  // In M35 and earlier, the Data Reduction Proxy enabled/disabled setting was
-  // stored in prefs, so this setting needs to be migrated to the new way of
-  // storing the setting. Removing this migration code would cause users
-  // upgrading from M35 and earlier with the Data Reduction Proxy enabled to be
-  // unable to browse non-SSL sites for the most part (see
-  // http://crbug.com/476610).
-  MigrateDataReductionProxyOffProxyPrefs(profile_prefs);
+      InitDataReductionProxySettings();
 }
diff --git a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h
index 10d9e18..0f6a766 100644
--- a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h
+++ b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h
@@ -9,35 +9,18 @@
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
 #include "components/keyed_service/core/keyed_service.h"
 
-class PrefService;
 class Profile;
 
 namespace base {
 class SequencedTaskRunner;
 }  // namespace base
 
-class PrefService;
-
 // Data reduction proxy settings class suitable for use with a Chrome browser.
 // It is keyed to a browser context.
 class DataReductionProxyChromeSettings
     : public data_reduction_proxy::DataReductionProxySettings,
       public KeyedService {
  public:
-  // Enum values that can be reported for the
-  // DataReductionProxy.ProxyPrefMigrationResult histogram. These values must be
-  // kept in sync with their counterparts in histograms.xml. Visible here for
-  // testing purposes.
-  enum ProxyPrefMigrationResult {
-    PROXY_PREF_NOT_CLEARED = 0,
-    PROXY_PREF_CLEARED_EMPTY,
-    PROXY_PREF_CLEARED_MODE_SYSTEM,
-    PROXY_PREF_CLEARED_DRP,
-    PROXY_PREF_CLEARED_GOOGLEZIP,
-    PROXY_PREF_CLEARED_PAC_GOOGLEZIP,
-    PROXY_PREF_MAX
-  };
-
   // Constructs a settings object. Construction and destruction must happen on
   // the UI thread.
   explicit DataReductionProxyChromeSettings(bool is_off_the_record_profile);
@@ -57,19 +40,6 @@
   void InitDataReductionProxySettings(
       Profile* profile,
       const scoped_refptr<base::SequencedTaskRunner>& db_task_runner);
-
-  // Public for testing.
-  void MigrateDataReductionProxyOffProxyPrefs(PrefService* prefs);
-
- private:
-  // Helper method for migrating the Data Reduction Proxy away from using the
-  // proxy pref. Returns the ProxyPrefMigrationResult value indicating the
-  // migration action taken.
-  ProxyPrefMigrationResult MigrateDataReductionProxyOffProxyPrefsHelper(
-      PrefService* prefs);
-
-  // Null before InitDataReductionProxySettings is called.
-  raw_ptr<Profile> profile_;
 };
 
 #endif  // CHROME_BROWSER_DATA_REDUCTION_PROXY_DATA_REDUCTION_PROXY_CHROME_SETTINGS_H_
diff --git a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_unittest.cc b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_unittest.cc
deleted file mode 100644
index 8ad9ae7e..0000000
--- a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_unittest.cc
+++ /dev/null
@@ -1,326 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
-
-#include <memory>
-#include <string>
-
-#include "base/memory/raw_ptr.h"
-#include "base/test/metrics/histogram_tester.h"
-#include "chrome/test/base/chrome_render_view_host_test_harness.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h"
-#include "components/prefs/pref_registry_simple.h"
-#include "components/prefs/testing_pref_service.h"
-#include "components/proxy_config/proxy_config_pref_names.h"
-#include "content/public/test/mock_navigation_handle.h"
-#include "net/http/http_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-using testing::_;
-using testing::Return;
-
-constexpr char kProxyPac[] = "PROXY proxy.net";
-}  // namespace
-
-class DataReductionProxyChromeSettingsTest
-    : public ChromeRenderViewHostTestHarness {
- public:
-  void SetUp() override {
-    ChromeRenderViewHostTestHarness::SetUp();
-    auto settings = std::make_unique<DataReductionProxyChromeSettings>(false);
-    drp_chrome_settings_ = settings.get();
-    test_context_ =
-        data_reduction_proxy::DataReductionProxyTestContext::Builder()
-            .WithMockConfig()
-            .WithSettings(std::move(settings))
-            .Build();
-    net::ProxyList proxies;
-    proxies.SetFromPacString(kProxyPac);
-    dict_ = std::make_unique<base::DictionaryValue>();
-
-    PrefRegistrySimple* registry = test_context_->pref_service()->registry();
-    registry->RegisterDictionaryPref(proxy_config::prefs::kProxy);
-  }
-
-  void TearDown() override {
-    // Make sure |test_context_| is destroyed before message loop is destroyed.
-    test_context_.reset();
-    ChromeRenderViewHostTestHarness::TearDown();
-  }
-
-  raw_ptr<DataReductionProxyChromeSettings> drp_chrome_settings_;
-  std::unique_ptr<base::DictionaryValue> dict_;
-  std::unique_ptr<data_reduction_proxy::DataReductionProxyTestContext>
-      test_context_;
-};
-
-TEST_F(DataReductionProxyChromeSettingsTest, MigrateNonexistentProxyPref) {
-  base::HistogramTester histogram_tester;
-  drp_chrome_settings_->MigrateDataReductionProxyOffProxyPrefs(
-      test_context_->pref_service());
-
-  EXPECT_EQ(NULL, test_context_->pref_service()->GetUserPref(
-                      proxy_config::prefs::kProxy));
-  histogram_tester.ExpectUniqueSample(
-      "DataReductionProxy.ProxyPrefMigrationResult",
-      DataReductionProxyChromeSettings::PROXY_PREF_NOT_CLEARED, 1);
-}
-
-TEST_F(DataReductionProxyChromeSettingsTest, MigrateBadlyFormedProxyPref) {
-  const struct {
-    // NULL indicates that mode is unset.
-    const char* proxy_mode_string;
-    // NULL indicates that server is unset.
-    const char* proxy_server_string;
-  } test_cases[] = {
-      // The pref should not be cleared if mode is unset.
-      {nullptr, "http=compress.googlezip.net"},
-      // The pref should not be cleared for modes other than "fixed_servers" and
-      // "pac_script".
-      {"auto_detect", "http=compress.googlezip.net"},
-      // The pref should not be cleared when the server field is unset.
-      {"fixed_servers", nullptr},
-  };
-
-  for (const auto& test : test_cases) {
-    base::HistogramTester histogram_tester;
-    dict_ = std::make_unique<base::DictionaryValue>();
-    if (test.proxy_mode_string)
-      dict_->SetString("mode", test.proxy_mode_string);
-    if (test.proxy_server_string)
-      dict_->SetString("server", test.proxy_server_string);
-    test_context_->pref_service()->Set(proxy_config::prefs::kProxy,
-                                       *dict_.get());
-
-    drp_chrome_settings_->MigrateDataReductionProxyOffProxyPrefs(
-        test_context_->pref_service());
-
-    const base::DictionaryValue* final_value;
-    test_context_->pref_service()
-        ->GetUserPref(proxy_config::prefs::kProxy)
-        ->GetAsDictionary(&final_value);
-    EXPECT_NE(nullptr, final_value);
-    EXPECT_TRUE(dict_->Equals(final_value));
-
-    histogram_tester.ExpectUniqueSample(
-        "DataReductionProxy.ProxyPrefMigrationResult",
-        DataReductionProxyChromeSettings::PROXY_PREF_NOT_CLEARED, 1);
-  }
-}
-
-TEST_F(DataReductionProxyChromeSettingsTest, MigrateEmptyProxy) {
-  base::HistogramTester histogram_tester;
-  test_context_->pref_service()->Set(proxy_config::prefs::kProxy, *dict_.get());
-  drp_chrome_settings_->MigrateDataReductionProxyOffProxyPrefs(
-      test_context_->pref_service());
-
-  EXPECT_EQ(NULL, test_context_->pref_service()->GetUserPref(
-                      proxy_config::prefs::kProxy));
-  histogram_tester.ExpectUniqueSample(
-      "DataReductionProxy.ProxyPrefMigrationResult",
-      DataReductionProxyChromeSettings::PROXY_PREF_CLEARED_EMPTY, 1);
-}
-
-TEST_F(DataReductionProxyChromeSettingsTest, MigrateSystemProxy) {
-  base::HistogramTester histogram_tester;
-  dict_->SetString("mode", "system");
-  test_context_->pref_service()->Set(proxy_config::prefs::kProxy, *dict_.get());
-
-  drp_chrome_settings_->MigrateDataReductionProxyOffProxyPrefs(
-      test_context_->pref_service());
-
-  EXPECT_EQ(NULL, test_context_->pref_service()->GetUserPref(
-                      proxy_config::prefs::kProxy));
-  histogram_tester.ExpectUniqueSample(
-      "DataReductionProxy.ProxyPrefMigrationResult",
-      DataReductionProxyChromeSettings::PROXY_PREF_CLEARED_MODE_SYSTEM, 1);
-}
-
-TEST_F(DataReductionProxyChromeSettingsTest,
-       MigrateGooglezipDataReductionProxy) {
-  const std::string kTestServers[] = {
-      "http=http://proxy-dev.googlezip.net",
-      "http=https://arbitraryprefix.googlezip.net",
-      "https=https://tunnel.googlezip.net"};
-
-  for (const std::string& test_server : kTestServers) {
-    base::HistogramTester histogram_tester;
-    dict_ = std::make_unique<base::DictionaryValue>();
-    // The proxy pref is set to a Data Reduction Proxy that doesn't match the
-    // currently configured DRP, but the pref should still be cleared.
-    dict_->SetString("mode", "fixed_servers");
-    dict_->SetString("server", test_server);
-    test_context_->pref_service()->Set(proxy_config::prefs::kProxy,
-                                       *dict_.get());
-    drp_chrome_settings_->MigrateDataReductionProxyOffProxyPrefs(
-        test_context_->pref_service());
-
-    EXPECT_EQ(NULL, test_context_->pref_service()->GetUserPref(
-                        proxy_config::prefs::kProxy));
-    histogram_tester.ExpectUniqueSample(
-        "DataReductionProxy.ProxyPrefMigrationResult",
-        DataReductionProxyChromeSettings::PROXY_PREF_CLEARED_GOOGLEZIP, 1);
-  }
-}
-
-TEST_F(DataReductionProxyChromeSettingsTest,
-       MigratePacGooglezipDataReductionProxy) {
-  const struct {
-    const char* pac_url;
-    bool expect_pref_cleared;
-  } test_cases[] = {
-      // PAC with bypass rules that returns 'HTTPS proxy.googlezip.net:443;
-      // PROXY compress.googlezip.net:80; DIRECT'.
-      {"data:application/"
-       "x-ns-proxy-autoconfig;base64,"
-       "ZnVuY3Rpb24gRmluZFByb3h5Rm9yVVJMKHVybCwgaG9zdCkgeyAgaWYgKChzaEV4cE1hdGN"
-       "oKHVybCwgJ2h0dHA6Ly93d3cuZ29vZ2xlLmNvbS9wb2xpY2llcy9wcml2YWN5KicpKSkgey"
-       "AgICByZXR1cm4gJ0RJUkVDVCc7ICB9ICAgaWYgKHVybC5zdWJzdHJpbmcoMCwgNSkgPT0gJ"
-       "2h0dHA6JykgeyAgICByZXR1cm4gJ0hUVFBTIHByb3h5Lmdvb2dsZXppcC5uZXQ6NDQzOyBQ"
-       "Uk9YWSBjb21wcmVzcy5nb29nbGV6aXAubmV0OjgwOyBESVJFQ1QnOyAgfSAgcmV0dXJuICd"
-       "ESVJFQ1QnO30=",
-       true},
-      // PAC with bypass rules that returns 'PROXY compress.googlezip.net:80;
-      // DIRECT'.
-      {"data:application/"
-       "x-ns-proxy-autoconfig;base64,"
-       "ZnVuY3Rpb24gRmluZFByb3h5Rm9yVVJMKHVybCwgaG9zdCkgeyAgaWYgKChzaEV4cE1hdGN"
-       "oKHVybCwgJ2h0dHA6Ly93d3cuZ29vZ2xlLmNvbS9wb2xpY2llcy9wcml2YWN5KicpKSkgey"
-       "AgICByZXR1cm4gJ0RJUkVDVCc7ICB9ICAgaWYgKHVybC5zdWJzdHJpbmcoMCwgNSkgPT0gJ"
-       "2h0dHA6JykgeyAgICByZXR1cm4gJ1BST1hZIGNvbXByZXNzLmdvb2dsZXppcC5uZXQ6ODA7"
-       "IERJUkVDVCc7ICB9ICByZXR1cm4gJ0RJUkVDVCc7fQ==",
-       true},
-      // PAC with bypass rules that returns 'PROXY proxy-dev.googlezip.net:80;
-      // DIRECT'.
-      {"data:application/"
-       "x-ns-proxy-autoconfig;base64,"
-       "ZnVuY3Rpb24gRmluZFByb3h5Rm9yVVJMKHVybCwgaG9zdCkgeyAgaWYgKChzaEV4cE1hdGN"
-       "oKHVybCwgJ2h0dHA6Ly93d3cuZ29vZ2xlLmNvbS9wb2xpY2llcy9wcml2YWN5KicpKSkgey"
-       "AgICByZXR1cm4gJ0RJUkVDVCc7ICB9ICAgaWYgKHVybC5zdWJzdHJpbmcoMCwgNSkgPT0gJ"
-       "2h0dHA6JykgeyAgICByZXR1cm4gJ1BST1hZIHByb3h5LWRldi5nb29nbGV6aXAubmV0Ojgw"
-       "OyBESVJFQ1QnOyAgfSAgcmV0dXJuICdESVJFQ1QnO30=",
-       true},
-      // Simple PAC that returns 'PROXY compress.googlezip.net:80'.
-      {"data:application/"
-       "x-ns-proxy-autoconfig;base64,"
-       "ZnVuY3Rpb24gRmluZFByb3h5Rm9yVVJMKHVybCwgaG9zdCkge3JldHVybiAnUFJPWFkgY29"
-       "tcHJlc3MuZ29vZ2xlemlwLm5ldDo4MCc7fQo=",
-       true},
-      // Simple PAC that returns 'PROXY compress.googlezip.net'. Note that since
-      // the port is not specified, the pref will not be cleared.
-      {"data:application/"
-       "x-ns-proxy-autoconfig;base64,"
-       "ZnVuY3Rpb24gRmluZFByb3h5Rm9yVVJMKHVybCwgaG9zdCkge3JldHVybiAnUFJPWFkgY29"
-       "tcHJlc3MuZ29vZ2xlemlwLm5ldCc7fQ==",
-       false},
-      // Simple PAC that returns 'PROXY mycustomdrp.net:80'.
-      {"data:application/"
-       "x-ns-proxy-autoconfig;base64,"
-       "ZnVuY3Rpb24gRmluZFByb3h5Rm9yVVJMKHVybCwgaG9zdCkge3JldHVybiAnUFJPWFkgb3J"
-       "pZ2luLm5ldDo4MCc7fQo=",
-       false},
-      // Simple PAC that returns 'PROXY myprefixgooglezip.net:80'.
-      {"data:application/"
-       "x-ns-proxy-autoconfig;base64,"
-       "ZnVuY3Rpb24gRmluZFByb3h5Rm9yVVJMKHVybCwgaG9zdCkge3JldHVybiAnUFJPWFkgbXl"
-       "wcmVmaXhnb29nbGV6aXAubmV0OjgwJzt9Cg==",
-       false},
-      // Simple PAC that returns 'PROXY compress.googlezip.net.mydomain.com:80'.
-      {"data:application/"
-       "x-ns-proxy-autoconfig;base64,"
-       "ZnVuY3Rpb24gRmluZFByb3h5Rm9yVVJMKHVybCwgaG9zdCkge3JldHVybiAnUFJPWFkgY29"
-       "tcHJlc3MuZ29vZ2xlemlwLm5ldC5teWRvbWFpbi5jb206ODAnO30K",
-       false},
-      // PAC URL that doesn't embed a script.
-      {"http://compress.googlezip.net/pac", false},
-      // Complicated PAC that returns a JavaScript function that can evaluate to
-      // proxy.googlezip.net:443 and compress.googlezip.net:80.
-      {"data:application/"
-       "x-ns-proxy-autoconfig;base64,"
-       "ZnVuY3Rpb24gRmluZFByb3h5Rm9yVVJMKHVybCwgaG9zdCkgewogIGlmICh1cmwuc3Vic3R"
-       "yaW5nKDAsNSkgPT0gJ2h0dHA6JyAmJiAKICAgICAgIWlzUGxhaW5Ib3N0TmFtZShob3N0KS"
-       "AmJiAKICAgICAgIXNoRXhwTWF0Y2goaG9zdCwgJyoubG9jYWwnKSAmJiAKICAgICAgIWlzS"
-       "W5OZXQoZG5zUmVzb2x2ZShob3N0KSwgJzEwLjAuMC4wJywgJzI1NS4wLjAuMCcpICYmIAog"
-       "ICAgICAhaXNJbk5ldChkbnNSZXNvbHZlKGhvc3QpLCAnMTcyLjE2LjAuMCcsICAnMjU1LjI"
-       "0MC4wLjAnKSAmJiAKICAgICAgIWlzSW5OZXQoZG5zUmVzb2x2ZShob3N0KSwgJzE5Mi4xNj"
-       "guMC4wJywgICcyNTUuMjU1LjAuMCcpICYmIAogICAgICAhaXNJbk5ldChkbnNSZXNvbHZlK"
-       "Ghvc3QpLCAnMTI3LjAuMC4wJywgJzI1NS4yNTUuMjU1LjAnKSAmJiAKICAgICAgIXNoRXhw"
-       "TWF0Y2goaG9zdCwgJygqLm1ldHJpYy5nc3RhdGljLmNvbSknKSkKICAgIHJldHVybiAnSFR"
-       "UUFMgcHJveHkuZ29vZ2xlemlwLm5ldDo0NDM7IFBST1hZIGNvbXByZXNzLmdvb2dsZXppcC"
-       "5uZXQ6ODA7IFBST1hZIDc0LjEyNS4yMDUuMjExOjgwOyBESVJFQ1QnOwogIHJldHVybiAnR"
-       "ElSRUNUJzsKfQ==",
-       true},
-  };
-
-  for (const auto& test : test_cases) {
-    base::HistogramTester histogram_tester;
-    dict_ = std::make_unique<base::DictionaryValue>();
-    dict_->SetString("mode", "pac_script");
-    dict_->SetString("pac_url", test.pac_url);
-    test_context_->pref_service()->Set(proxy_config::prefs::kProxy,
-                                       *dict_.get());
-
-    drp_chrome_settings_->MigrateDataReductionProxyOffProxyPrefs(
-        test_context_->pref_service());
-
-    if (test.expect_pref_cleared) {
-      EXPECT_EQ(NULL, test_context_->pref_service()->GetUserPref(
-                          proxy_config::prefs::kProxy));
-      histogram_tester.ExpectUniqueSample(
-          "DataReductionProxy.ProxyPrefMigrationResult",
-          DataReductionProxyChromeSettings::PROXY_PREF_CLEARED_PAC_GOOGLEZIP,
-          1);
-    } else {
-      const base::DictionaryValue* value;
-      EXPECT_TRUE(test_context_->pref_service()
-                      ->GetUserPref(proxy_config::prefs::kProxy)
-                      ->GetAsDictionary(&value));
-      std::string mode;
-      EXPECT_TRUE(value->GetString("mode", &mode));
-      EXPECT_EQ("pac_script", mode);
-      std::string pac_url;
-      EXPECT_TRUE(value->GetString("pac_url", &pac_url));
-      EXPECT_EQ(test.pac_url, pac_url);
-
-      histogram_tester.ExpectUniqueSample(
-          "DataReductionProxy.ProxyPrefMigrationResult",
-          DataReductionProxyChromeSettings::PROXY_PREF_NOT_CLEARED, 1);
-    }
-  }
-}
-
-TEST_F(DataReductionProxyChromeSettingsTest, MigrateIgnoreOtherProxy) {
-  const std::string kTestServers[] = {
-      "http=https://youtube.com", "http=http://googlezip.net",
-      "http=http://thisismyproxynotgooglezip.net",
-      "https=http://arbitraryprefixgooglezip.net"};
-
-  for (const std::string& test_server : kTestServers) {
-    base::HistogramTester histogram_tester;
-    dict_ = std::make_unique<base::DictionaryValue>();
-    dict_->SetString("mode", "fixed_servers");
-    dict_->SetString("server", test_server);
-    test_context_->pref_service()->Set(proxy_config::prefs::kProxy,
-                                       *dict_.get());
-
-    drp_chrome_settings_->MigrateDataReductionProxyOffProxyPrefs(
-        test_context_->pref_service());
-
-    base::DictionaryValue* value =
-        (base::DictionaryValue*)test_context_->pref_service()->GetUserPref(
-            proxy_config::prefs::kProxy);
-    std::string mode;
-    EXPECT_TRUE(value->GetString("mode", &mode));
-    EXPECT_EQ("fixed_servers", mode);
-    std::string server;
-    EXPECT_TRUE(value->GetString("server", &server));
-    EXPECT_EQ(test_server, server);
-
-    histogram_tester.ExpectUniqueSample(
-        "DataReductionProxy.ProxyPrefMigrationResult",
-        DataReductionProxyChromeSettings::PROXY_PREF_NOT_CLEARED, 1);
-  }
-}
diff --git a/chrome/browser/data_saver/DIR_METADATA b/chrome/browser/data_saver/DIR_METADATA
deleted file mode 100644
index ce14958..0000000
--- a/chrome/browser/data_saver/DIR_METADATA
+++ /dev/null
@@ -1,3 +0,0 @@
-monorail: {
-  component: "Internals>Network>DataProxy"
-}
diff --git a/chrome/browser/data_saver/OWNERS b/chrome/browser/data_saver/OWNERS
deleted file mode 100644
index 2783dea..0000000
--- a/chrome/browser/data_saver/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://components/data_reduction_proxy/OWNERS
diff --git a/chrome/browser/data_saver/data_saver_browsertest.cc b/chrome/browser/data_saver/data_saver_browsertest.cc
deleted file mode 100644
index 9bfd021..0000000
--- a/chrome/browser/data_saver/data_saver_browsertest.cc
+++ /dev/null
@@ -1,617 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <string>
-
-#include "base/barrier_closure.h"
-#include "base/bind.h"
-#include "base/containers/contains.h"
-#include "base/memory/raw_ptr.h"
-#include "base/test/metrics/histogram_tester.h"
-#include "build/build_config.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/base/ui_test_utils.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
-#include "components/prefs/pref_service.h"
-#include "content/public/test/browser_test.h"
-#include "content/public/test/browser_test_base.h"
-#include "content/public/test/browser_test_utils.h"
-#include "net/test/embedded_test_server/embedded_test_server.h"
-#include "net/test/embedded_test_server/http_request.h"
-#include "net/test/embedded_test_server/http_response.h"
-#include "services/network/public/cpp/network_quality_tracker.h"
-#include "third_party/blink/public/common/features.h"
-
-namespace {
-
-void SetDataSaverEnabled(content::BrowserContext* browser_context,
-                         bool enabled) {
-  Profile* profile = Profile::FromBrowserContext(browser_context);
-
-  data_reduction_proxy::DataReductionProxySettings::
-      SetDataSaverEnabledForTesting(profile->GetPrefs(), enabled);
-  base::RunLoop().RunUntilIdle();
-}
-
-std::unique_ptr<net::test_server::HttpResponse> CaptureHeaderHandlerWithContent(
-    const std::string& path,
-    net::test_server::HttpRequest::HeaderMap* header_map,
-    const std::string& mime_type,
-    const std::string& content,
-    base::OnceClosure done_callback,
-    const net::test_server::HttpRequest& request) {
-  GURL request_url = request.GetURL();
-  if (request_url.path() != path)
-    return nullptr;
-
-  *header_map = request.headers;
-  auto response = std::make_unique<net::test_server::BasicHttpResponse>();
-  if (!mime_type.empty()) {
-    response->set_content_type(mime_type);
-  }
-  response->set_content(content);
-  std::move(done_callback).Run();
-  return response;
-}
-
-// Test version of the observer. Used to wait for the event when the network
-// quality tracker sends the network quality change notification.
-class TestEffectiveConnectionTypeObserver
-    : public network::NetworkQualityTracker::EffectiveConnectionTypeObserver {
- public:
-  explicit TestEffectiveConnectionTypeObserver(
-      network::NetworkQualityTracker* tracker)
-      : run_loop_wait_effective_connection_type_(
-            net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN),
-        run_loop_(std::make_unique<base::RunLoop>()),
-        tracker_(tracker),
-        effective_connection_type_(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN) {
-    tracker_->AddEffectiveConnectionTypeObserver(this);
-  }
-
-  TestEffectiveConnectionTypeObserver(
-      const TestEffectiveConnectionTypeObserver&) = delete;
-  TestEffectiveConnectionTypeObserver& operator=(
-      const TestEffectiveConnectionTypeObserver&) = delete;
-
-  ~TestEffectiveConnectionTypeObserver() override {
-    tracker_->RemoveEffectiveConnectionTypeObserver(this);
-  }
-
-  void WaitForNotification(
-      net::EffectiveConnectionType run_loop_wait_effective_connection_type) {
-    if (effective_connection_type_ == run_loop_wait_effective_connection_type)
-      return;
-    ASSERT_NE(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN,
-              run_loop_wait_effective_connection_type);
-    run_loop_wait_effective_connection_type_ =
-        run_loop_wait_effective_connection_type;
-    run_loop_->Run();
-    run_loop_ = std::make_unique<base::RunLoop>();
-  }
-
- private:
-  // NetworkQualityTracker::EffectiveConnectionTypeObserver implementation:
-  void OnEffectiveConnectionTypeChanged(
-      net::EffectiveConnectionType type) override {
-    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-    net::EffectiveConnectionType queried_type =
-        tracker_->GetEffectiveConnectionType();
-    EXPECT_EQ(type, queried_type);
-
-    effective_connection_type_ = type;
-    if (effective_connection_type_ != run_loop_wait_effective_connection_type_)
-      return;
-    run_loop_->Quit();
-  }
-
-  net::EffectiveConnectionType run_loop_wait_effective_connection_type_;
-  std::unique_ptr<base::RunLoop> run_loop_;
-  raw_ptr<network::NetworkQualityTracker> tracker_;
-  net::EffectiveConnectionType effective_connection_type_;
-};
-
-// Test version of the observer. Used to wait for the event when the network
-// quality tracker sends the network quality change notification.
-class TestRTTAndThroughputEstimatesObserver
-    : public network::NetworkQualityTracker::RTTAndThroughputEstimatesObserver {
- public:
-  explicit TestRTTAndThroughputEstimatesObserver(
-      network::NetworkQualityTracker* tracker)
-      : tracker_(tracker),
-        downstream_throughput_kbps_(std::numeric_limits<int32_t>::max()) {
-    tracker_->AddRTTAndThroughputEstimatesObserver(this);
-  }
-
-  TestRTTAndThroughputEstimatesObserver(
-      const TestRTTAndThroughputEstimatesObserver&) = delete;
-  TestRTTAndThroughputEstimatesObserver& operator=(
-      const TestRTTAndThroughputEstimatesObserver&) = delete;
-
-  ~TestRTTAndThroughputEstimatesObserver() override {
-    tracker_->RemoveRTTAndThroughputEstimatesObserver(this);
-  }
-
-  void WaitForNotification(base::TimeDelta expected_http_rtt) {
-    // It's not meaningful to wait for notification with RTT set to
-    // base::TimeDelta() since that value implies that the network quality
-    // estimate was unavailable.
-    EXPECT_NE(base::TimeDelta(), expected_http_rtt);
-    http_rtt_notification_wait_ = expected_http_rtt;
-    if (http_rtt_notification_wait_ == http_rtt_)
-      return;
-
-    // WaitForNotification should not be called twice.
-    EXPECT_EQ(nullptr, run_loop_);
-    run_loop_ = std::make_unique<base::RunLoop>();
-    run_loop_->Run();
-    EXPECT_EQ(expected_http_rtt, http_rtt_);
-    run_loop_.reset();
-  }
-
- private:
-  // RTTAndThroughputEstimatesObserver implementation:
-  void OnRTTOrThroughputEstimatesComputed(
-      base::TimeDelta http_rtt,
-      base::TimeDelta transport_rtt,
-      int32_t downstream_throughput_kbps) override {
-    EXPECT_EQ(http_rtt, tracker_->GetHttpRTT());
-    EXPECT_EQ(downstream_throughput_kbps,
-              tracker_->GetDownstreamThroughputKbps());
-
-    http_rtt_ = http_rtt;
-    downstream_throughput_kbps_ = downstream_throughput_kbps;
-
-    if (run_loop_ && http_rtt == http_rtt_notification_wait_)
-      run_loop_->Quit();
-  }
-
-  raw_ptr<network::NetworkQualityTracker> tracker_;
-  // May be null.
-  std::unique_ptr<base::RunLoop> run_loop_;
-  base::TimeDelta http_rtt_;
-  int32_t downstream_throughput_kbps_;
-  base::TimeDelta http_rtt_notification_wait_;
-};
-
-}  // namespace
-
-class DataSaverBrowserTest : public InProcessBrowserTest {
- protected:
-  void EnableDataSaver(bool enabled) {
-    SetDataSaverEnabled(browser()->profile(), enabled);
-  }
-
-  void VerifySaveDataHeader(const std::string& expected_header_value,
-                            Browser* browser = nullptr) {
-    if (!browser)
-      browser = InProcessBrowserTest::browser();
-    ASSERT_TRUE(ui_test_utils::NavigateToURL(
-        browser, embedded_test_server()->GetURL("/echoheader?Save-Data")));
-    EXPECT_EQ(
-        expected_header_value,
-        content::EvalJs(browser->tab_strip_model()->GetActiveWebContents(),
-                        "document.body.textContent;"));
-  }
-};
-
-IN_PROC_BROWSER_TEST_F(DataSaverBrowserTest, DataSaverEnabled) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-  EnableDataSaver(true);
-  VerifySaveDataHeader("on");
-}
-
-IN_PROC_BROWSER_TEST_F(DataSaverBrowserTest, DataSaverDisabled) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-  EnableDataSaver(false);
-  VerifySaveDataHeader("None");
-}
-
-IN_PROC_BROWSER_TEST_F(DataSaverBrowserTest, DataSaverDisabledInIncognito) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-  EnableDataSaver(true);
-  VerifySaveDataHeader("None", CreateIncognitoBrowser());
-}
-
-class DataSaverWithServerBrowserTest : public InProcessBrowserTest {
- protected:
-  void Init() {
-    test_server_ = std::make_unique<net::EmbeddedTestServer>();
-    test_server_->RegisterRequestHandler(base::BindRepeating(
-        &DataSaverWithServerBrowserTest::VerifySaveDataHeader,
-        base::Unretained(this)));
-    test_server_->ServeFilesFromSourceDirectory(GetChromeTestDataDir());
-  }
-
-  void EnableDataSaver(bool enabled) {
-    SetDataSaverEnabled(browser()->profile(), enabled);
-  }
-
-  std::unique_ptr<net::test_server::HttpResponse> VerifySaveDataHeader(
-      const net::test_server::HttpRequest& request) {
-    auto save_data_header_it = request.headers.find("save-data");
-
-    if (request.relative_url == "/favicon.ico") {
-      // Favicon request could be received for the previous page load.
-      return nullptr;
-    }
-
-    if (!expected_save_data_header_.empty()) {
-      EXPECT_TRUE(save_data_header_it != request.headers.end())
-          << request.relative_url;
-      EXPECT_EQ(expected_save_data_header_, save_data_header_it->second)
-          << request.relative_url;
-    } else {
-      EXPECT_TRUE(save_data_header_it == request.headers.end())
-          << request.relative_url;
-    }
-    return nullptr;
-  }
-
-  std::unique_ptr<net::EmbeddedTestServer> test_server_;
-  std::string expected_save_data_header_;
-};
-
-IN_PROC_BROWSER_TEST_F(DataSaverWithServerBrowserTest, ReloadPage) {
-  Init();
-  ASSERT_TRUE(test_server_->Start());
-  EnableDataSaver(true);
-
-  expected_save_data_header_ = "on";
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), test_server_->GetURL("/google/google.html")));
-
-  // Reload the webpage and expect the main and the subresources will get the
-  // correct save-data header.
-  expected_save_data_header_ = "on";
-  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
-  EXPECT_TRUE(content::WaitForLoadStop(
-      browser()->tab_strip_model()->GetActiveWebContents()));
-
-  // Reload the webpage with data saver disabled, and expect all the resources
-  // will get no save-data header.
-  EnableDataSaver(false);
-  expected_save_data_header_ = "";
-  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
-  EXPECT_TRUE(content::WaitForLoadStop(
-      browser()->tab_strip_model()->GetActiveWebContents()));
-}
-
-class DataSaverForWorkerBrowserTest : public InProcessBrowserTest,
-                                      public testing::WithParamInterface<bool> {
- protected:
-  void EnableDataSaver(bool enabled) {
-    SetDataSaverEnabled(browser()->profile(), enabled);
-  }
-
-  // Sends a request to |url| and returns its headers via |header_map|. |script|
-  // is provided as the response body.
-  void RequestAndGetHeaders(
-      const std::string& url,
-      const std::string& script,
-      net::test_server::HttpRequest::HeaderMap* header_map) {
-    base::RunLoop loop;
-    embedded_test_server()->RegisterRequestHandler(base::BindRepeating(
-        &CaptureHeaderHandlerWithContent, "/capture", header_map,
-        "text/javascript", script, loop.QuitClosure()));
-    ASSERT_TRUE(embedded_test_server()->Start());
-
-    ASSERT_TRUE(ui_test_utils::NavigateToURL(
-        browser(), embedded_test_server()->GetURL(url)));
-    loop.Run();
-  }
-
-  content::WebContents* GetActiveWebContents() {
-    return browser()->tab_strip_model()->GetActiveWebContents();
-  }
-
-  static bool IsEnabledDataSaver() { return GetParam(); }
-};
-
-INSTANTIATE_TEST_SUITE_P(/* no prefix */,
-                         DataSaverForWorkerBrowserTest,
-                         testing::Bool());
-
-// Checks that the Save-Data header is sent in a request for dedicated worker
-// script when the data saver is enabled.
-IN_PROC_BROWSER_TEST_P(DataSaverForWorkerBrowserTest, DedicatedWorker) {
-  EnableDataSaver(IsEnabledDataSaver());
-
-  const std::string kWorkerScript = R"(postMessage('DONE');)";
-  net::test_server::HttpRequest::HeaderMap header_map;
-  RequestAndGetHeaders(
-      "/workers/create_dedicated_worker.html?worker_url=/capture",
-      kWorkerScript, &header_map);
-
-  if (IsEnabledDataSaver()) {
-    EXPECT_TRUE(base::Contains(header_map, "Save-Data"));
-    EXPECT_EQ("on", header_map["Save-Data"]);
-  } else {
-    EXPECT_FALSE(base::Contains(header_map, "Save-Data"));
-  }
-
-  // Wait until the worker script is loaded to stop the test from crashing
-  // during destruction.
-  EXPECT_EQ("DONE", content::EvalJs(
-                        browser()->tab_strip_model()->GetActiveWebContents(),
-                        "waitForMessage();"));
-}
-
-// Checks that the Save-Data header is sent in a request for shared worker
-// script when the data saver is enabled. Disabled on Android since a shared
-// worker is not available on Android.
-#if BUILDFLAG(IS_ANDROID)
-#define MAYBE_SharedWorker DISABLED_SharedWorker
-#else
-#define MAYBE_SharedWorker SharedWorker
-#endif
-IN_PROC_BROWSER_TEST_P(DataSaverForWorkerBrowserTest, MAYBE_SharedWorker) {
-  EnableDataSaver(IsEnabledDataSaver());
-
-  const std::string kWorkerScript =
-      R"(self.onconnect = e => { e.ports[0].postMessage('DONE'); };)";
-  net::test_server::HttpRequest::HeaderMap header_map;
-  RequestAndGetHeaders("/workers/create_shared_worker.html?worker_url=/capture",
-                       kWorkerScript, &header_map);
-
-  if (IsEnabledDataSaver()) {
-    EXPECT_TRUE(base::Contains(header_map, "Save-Data"));
-    EXPECT_EQ("on", header_map["Save-Data"]);
-  } else {
-    EXPECT_FALSE(base::Contains(header_map, "Save-Data"));
-  }
-
-  // Wait until the worker script is loaded to stop the test from crashing
-  // during destruction.
-  EXPECT_EQ("DONE", content::EvalJs(
-                        browser()->tab_strip_model()->GetActiveWebContents(),
-                        "waitForMessage();"));
-}
-
-// Checks that the Save-Data header is not sent in a request for a service
-// worker script when it's disabled.
-IN_PROC_BROWSER_TEST_P(DataSaverForWorkerBrowserTest, ServiceWorker_Register) {
-  EnableDataSaver(IsEnabledDataSaver());
-  net::test_server::HttpRequest::HeaderMap header_map;
-  base::RunLoop loop;
-  embedded_test_server()->RegisterRequestHandler(base::BindRepeating(
-      &CaptureHeaderHandlerWithContent, "/capture", &header_map,
-      "text/javascript", "// empty", loop.QuitClosure()));
-  ASSERT_TRUE(embedded_test_server()->Start());
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), embedded_test_server()->GetURL(
-                     "/service_worker/create_service_worker.html")));
-
-  EXPECT_EQ("DONE",
-            content::EvalJs(GetActiveWebContents(), "register('/capture');"));
-  loop.Run();
-
-  if (IsEnabledDataSaver()) {
-    EXPECT_TRUE(base::Contains(header_map, "Save-Data"));
-    EXPECT_EQ("on", header_map["Save-Data"]);
-  } else {
-    EXPECT_FALSE(base::Contains(header_map, "Save-Data"));
-  }
-
-  // Service worker doesn't have to wait for onmessage event because
-  // navigator.serviceWorker.ready can ensure that the script load has
-  // been completed.
-}
-
-// Checks that the Save-Data header is not sent in a request for a service
-// worker script when it's disabled.
-IN_PROC_BROWSER_TEST_P(DataSaverForWorkerBrowserTest, ServiceWorker_Update) {
-  EnableDataSaver(IsEnabledDataSaver());
-  net::test_server::HttpRequest::HeaderMap header_map;
-  base::RunLoop loop;
-  // Wait for two requests to capture the request header for updating.
-  embedded_test_server()->RegisterRequestHandler(
-      base::BindRepeating(&CaptureHeaderHandlerWithContent, "/capture",
-                          &header_map, "text/javascript", "// empty",
-                          base::BarrierClosure(2, loop.QuitClosure())));
-  ASSERT_TRUE(embedded_test_server()->Start());
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), embedded_test_server()->GetURL(
-                     "/service_worker/create_service_worker.html")));
-
-  EXPECT_EQ("DONE",
-            content::EvalJs(GetActiveWebContents(), "register('/capture');"));
-  EXPECT_EQ("DONE", content::EvalJs(GetActiveWebContents(), "update();"));
-  loop.Run();
-
-  if (IsEnabledDataSaver()) {
-    EXPECT_TRUE(base::Contains(header_map, "Save-Data"));
-    EXPECT_EQ("on", header_map["Save-Data"]);
-  } else {
-    EXPECT_FALSE(base::Contains(header_map, "Save-Data"));
-  }
-
-  // Service worker doesn't have to wait for onmessage event because
-  // navigator.serviceWorker.ready can ensure that the script load has
-  // been completed.
-}
-
-// Checks that Save-Data header is appropriately set to requests from fetch() in
-// a dedicated worker.
-IN_PROC_BROWSER_TEST_P(DataSaverForWorkerBrowserTest, FetchFromWorker) {
-  EnableDataSaver(IsEnabledDataSaver());
-  ASSERT_TRUE(embedded_test_server()->Start());
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(),
-      embedded_test_server()->GetURL("/workers/fetch_from_worker.html")));
-  const char* expected = IsEnabledDataSaver() ? "on" : "None";
-  EXPECT_EQ(expected,
-            content::EvalJs(GetActiveWebContents(),
-                            "fetch_from_worker('/echoheader?Save-Data');"));
-}
-
-// Checks that Save-Data header is appropriately set to requests from fetch() in
-// a shared worker.
-IN_PROC_BROWSER_TEST_P(DataSaverForWorkerBrowserTest, FetchFromSharedWorker) {
-  EnableDataSaver(IsEnabledDataSaver());
-  ASSERT_TRUE(embedded_test_server()->Start());
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), embedded_test_server()->GetURL(
-                     "/workers/fetch_from_shared_worker.html")));
-  const char* expected = IsEnabledDataSaver() ? "on" : "None";
-  EXPECT_EQ(
-      expected,
-      content::EvalJs(GetActiveWebContents(),
-                      "fetch_from_shared_worker('/echoheader?Save-Data');"));
-}
-
-// Checks that Save-Data header is appropriately set to requests from fetch() in
-// a service worker.
-IN_PROC_BROWSER_TEST_P(DataSaverForWorkerBrowserTest, FetchFromServiceWorker) {
-  EnableDataSaver(IsEnabledDataSaver());
-  ASSERT_TRUE(embedded_test_server()->Start());
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), embedded_test_server()->GetURL(
-                     "/service_worker/fetch_from_service_worker.html")));
-  EXPECT_EQ("ready", content::EvalJs(GetActiveWebContents(), "setup();"));
-
-  const char* expected = IsEnabledDataSaver() ? "on" : "None";
-  EXPECT_EQ(
-      expected,
-      content::EvalJs(GetActiveWebContents(),
-                      "fetch_from_service_worker('/echoheader?Save-Data');"));
-}
-
-// Checks that Save-Data header is appropriately set to requests from fetch() in
-// a page controlled by a service worker without fetch handler.
-IN_PROC_BROWSER_TEST_P(DataSaverForWorkerBrowserTest,
-                       FetchFromServiceWorkerControlledPage_NoFetchHandler) {
-  EnableDataSaver(IsEnabledDataSaver());
-  ASSERT_TRUE(embedded_test_server()->Start());
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), embedded_test_server()->GetURL(
-                     "/service_worker/create_service_worker.html")));
-  EXPECT_EQ("DONE",
-            content::EvalJs(GetActiveWebContents(), "register('empty.js');"));
-
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(),
-      embedded_test_server()->GetURL("/service_worker/fetch_from_page.html")));
-
-  const char* expected = IsEnabledDataSaver() ? "on" : "None";
-  EXPECT_EQ(expected,
-            content::EvalJs(GetActiveWebContents(),
-                            "fetch_from_page('/echoheader?Save-Data');"));
-}
-
-// Checks that Save-Data header is appropriately set to requests from fetch() in
-// a page controlled by a service worker with fetch handler but no respondWith.
-IN_PROC_BROWSER_TEST_P(DataSaverForWorkerBrowserTest,
-                       FetchFromServiceWorkerControlledPage_PassThrough) {
-  EnableDataSaver(IsEnabledDataSaver());
-  ASSERT_TRUE(embedded_test_server()->Start());
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), embedded_test_server()->GetURL(
-                     "/service_worker/create_service_worker.html")));
-  EXPECT_EQ("DONE",
-            content::EvalJs(GetActiveWebContents(),
-                            "register('fetch_event_pass_through.js');"));
-
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(),
-      embedded_test_server()->GetURL("/service_worker/fetch_from_page.html")));
-
-  const char* expected = IsEnabledDataSaver() ? "on" : "None";
-  EXPECT_EQ(expected,
-            content::EvalJs(GetActiveWebContents(),
-                            "fetch_from_page('/echoheader?Save-Data');"));
-}
-
-// Checks that Save-Data header is appropriately set to requests from fetch() in
-// a page controlled by a service worker with fetch handler and responds with
-// fetch().
-IN_PROC_BROWSER_TEST_P(DataSaverForWorkerBrowserTest,
-                       FetchFromServiceWorkerControlledPage_RespondWithFetch) {
-  EnableDataSaver(IsEnabledDataSaver());
-  ASSERT_TRUE(embedded_test_server()->Start());
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), embedded_test_server()->GetURL(
-                     "/service_worker/create_service_worker.html")));
-  EXPECT_EQ("DONE",
-            content::EvalJs(GetActiveWebContents(),
-                            "register('fetch_event_respond_with_fetch.js');"));
-
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(),
-      embedded_test_server()->GetURL("/service_worker/fetch_from_page.html")));
-
-  const char* expected = IsEnabledDataSaver() ? "on" : "None";
-  EXPECT_EQ(expected,
-            content::EvalJs(GetActiveWebContents(),
-                            "fetch_from_page('/echoheader?Save-Data');"));
-}
-
-class DataSaverWithImageServerBrowserTest : public InProcessBrowserTest {
- public:
-  DataSaverWithImageServerBrowserTest() {
-    scoped_feature_list_.InitWithFeatures({blink::features::kSaveDataImgSrcset},
-                                          {});
-  }
-  void SetUp() override {
-    test_server_ = std::make_unique<net::EmbeddedTestServer>();
-    test_server_->RegisterRequestMonitor(base::BindRepeating(
-        &DataSaverWithImageServerBrowserTest::MonitorImageRequest,
-        base::Unretained(this)));
-    test_server_->ServeFilesFromSourceDirectory(GetChromeTestDataDir());
-    LOG(WARNING) << GetChromeTestDataDir();
-    ASSERT_TRUE(test_server_->Start());
-
-
-    InProcessBrowserTest::SetUp();
-  }
-
-  void EnableDataSaver(bool enabled) {
-    SetDataSaverEnabled(browser()->profile(), enabled);
-  }
-
-  void SetImagesNotToLoad(const std::vector<std::string>& imgs_not_to_load) {
-    imgs_not_to_load_ = std::vector<std::string>(imgs_not_to_load);
-  }
-
-  std::unique_ptr<net::EmbeddedTestServer> test_server_;
-
- private:
-  // Called by |test_server_|.
-  void MonitorImageRequest(const net::test_server::HttpRequest& request) {
-    for (const auto& img : imgs_not_to_load_)
-      EXPECT_FALSE(request.GetURL().path() == img);
-  }
-
-  base::test::ScopedFeatureList scoped_feature_list_;
-  std::vector<std::string> imgs_not_to_load_;
-};
-
-IN_PROC_BROWSER_TEST_F(DataSaverWithImageServerBrowserTest,
-                       ImgSrcset_DataSaverEnabled) {
-  EnableDataSaver(true);
-  SetImagesNotToLoad({"/data_saver/red.jpg"});
-
-  base::HistogramTester histogram_tester;
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), test_server_->GetURL("/data_saver/image_srcset.html")));
-}
-
-IN_PROC_BROWSER_TEST_F(DataSaverWithImageServerBrowserTest,
-                       ImgSrcset_DataSaverDisabled) {
-  EnableDataSaver(false);
-  SetImagesNotToLoad({"/data_saver/green.jpg"});
-
-  base::HistogramTester histogram_tester;
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), test_server_->GetURL("/data_saver/image_srcset.html")));
-}
diff --git a/chrome/browser/data_saver/data_saver_holdback_browsertest.cc b/chrome/browser/data_saver/data_saver_holdback_browsertest.cc
deleted file mode 100644
index 67d5390..0000000
--- a/chrome/browser/data_saver/data_saver_holdback_browsertest.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-
-#include "base/metrics/field_trial_param_associator.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/base/ui_test_utils.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
-#include "components/prefs/pref_service.h"
-#include "content/public/common/content_features.h"
-#include "content/public/test/browser_test.h"
-#include "content/public/test/browser_test_base.h"
-#include "content/public/test/browser_test_utils.h"
-#include "net/test/embedded_test_server/embedded_test_server.h"
-
-// Tests if the save data header holdback works as expected.
-class DataSaverHoldbackBrowserTest : public InProcessBrowserTest,
-                                     public testing::WithParamInterface<bool> {
- protected:
-  DataSaverHoldbackBrowserTest() { ConfigureHoldbackExperiment(); }
-  void SetUp() override {
-    test_server_.ServeFilesFromSourceDirectory("content/test/data");
-    ASSERT_TRUE(test_server_.Start());
-    InProcessBrowserTest::SetUp();
-  }
-
-  void SetUpCommandLine(base::CommandLine* cmd) override {
-    cmd->AppendSwitch(
-        data_reduction_proxy::switches::kEnableDataReductionProxy);
-  }
-
-  void VerifySaveDataHeader(const std::string& expected_header_value) {
-    ASSERT_TRUE(ui_test_utils::NavigateToURL(
-        browser(), embedded_test_server()->GetURL("/echoheader?Save-Data")));
-    EXPECT_EQ(
-        expected_header_value,
-        content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(),
-                        "document.body.textContent;"));
-  }
-
-  void VerifySaveDataAPI(bool expected_header_set) {
-    ASSERT_TRUE(ui_test_utils::NavigateToURL(
-        browser(), test_server_.GetURL("/net_info.html")));
-    EXPECT_EQ(expected_header_set, RunScriptExtractBool("getSaveData()"));
-  }
-
-  void ConfigureHoldbackExperiment() {
-    std::map<std::string, std::string> params;
-    params["holdback_web"] = GetParam() ? "true" : "false";
-    scoped_feature_list_.InitWithFeaturesAndParameters(
-        {{features::kDataSaverHoldback, {params}}}, {});
-  }
-
- private:
-  bool RunScriptExtractBool(const std::string& script) {
-    return content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(),
-                           script, content::EXECUTE_SCRIPT_USE_MANUAL_REPLY)
-        .ExtractBool();
-  }
-
-  net::EmbeddedTestServer test_server_;
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-// The data saver holdback is enabled only if the first param is true.
-INSTANTIATE_TEST_SUITE_P(All, DataSaverHoldbackBrowserTest, testing::Bool());
-
-IN_PROC_BROWSER_TEST_P(DataSaverHoldbackBrowserTest,
-                       DataSaverEnabledWithHoldbackEnabled) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-
-  // If holdback is enabled, then the save-data header should not be set.
-  if (GetParam()) {
-    VerifySaveDataHeader("None");
-  } else {
-    VerifySaveDataHeader("on");
-  }
-  VerifySaveDataAPI(!GetParam());
-}
diff --git a/chrome/browser/data_saver/data_saver_webapis_browsertest.cc b/chrome/browser/data_saver/data_saver_webapis_browsertest.cc
deleted file mode 100644
index c12d370..0000000
--- a/chrome/browser/data_saver/data_saver_webapis_browsertest.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <string>
-
-#include "base/command_line.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/base/ui_test_utils.h"
-#include "components/prefs/pref_service.h"
-#include "content/public/common/content_switches.h"
-#include "content/public/test/browser_test.h"
-#include "content/public/test/browser_test_base.h"
-#include "content/public/test/browser_test_utils.h"
-#include "net/test/embedded_test_server/embedded_test_server.h"
-#include "net/test/embedded_test_server/http_request.h"
-#include "net/test/embedded_test_server/http_response.h"
-
-// Verify that the saveData attribute in NetInfo JavaScript API is set
-// correctly.
-class DataSaverWebAPIsBrowserTest : public InProcessBrowserTest {
- protected:
-  void EnableDataSaver(bool enabled) {
-    data_reduction_proxy::DataReductionProxySettings::
-        SetDataSaverEnabledForTesting(browser()->profile()->GetPrefs(),
-                                      enabled);
-  }
-
-  void SetUp() override {
-    test_server_.ServeFilesFromSourceDirectory("content/test/data");
-    ASSERT_TRUE(test_server_.Start());
-    InProcessBrowserTest::SetUp();
-  }
-
-  void VerifySaveDataAPI(bool expected_header_set, Browser* browser = nullptr) {
-    if (!browser)
-      browser = InProcessBrowserTest::browser();
-    ASSERT_TRUE(ui_test_utils::NavigateToURL(
-        browser, test_server_.GetURL("/net_info.html")));
-    EXPECT_EQ(expected_header_set,
-              RunScriptExtractBool(browser, "getSaveData()"));
-  }
-
- private:
-  bool RunScriptExtractBool(Browser* browser, const std::string& script) {
-    return content::EvalJs(browser->tab_strip_model()->GetActiveWebContents(),
-                           script, content::EXECUTE_SCRIPT_USE_MANUAL_REPLY)
-        .ExtractBool();
-  }
-
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    command_line->AppendSwitch(
-        switches::kEnableExperimentalWebPlatformFeatures);
-  }
-
-  net::EmbeddedTestServer test_server_;
-};
-
-IN_PROC_BROWSER_TEST_F(DataSaverWebAPIsBrowserTest, DataSaverEnabledJS) {
-  EnableDataSaver(true);
-  VerifySaveDataAPI(true);
-}
-
-IN_PROC_BROWSER_TEST_F(DataSaverWebAPIsBrowserTest, DataSaverDisabledJS) {
-  EnableDataSaver(false);
-  VerifySaveDataAPI(false);
-}
-
-IN_PROC_BROWSER_TEST_F(DataSaverWebAPIsBrowserTest, DataSaverToggleJS) {
-  EnableDataSaver(false);
-  VerifySaveDataAPI(false);
-
-  EnableDataSaver(true);
-  VerifySaveDataAPI(true);
-
-  EnableDataSaver(false);
-  VerifySaveDataAPI(false);
-}
-
-IN_PROC_BROWSER_TEST_F(DataSaverWebAPIsBrowserTest,
-                       DataSaverDisabledInIncognito) {
-  EnableDataSaver(true);
-  VerifySaveDataAPI(false, CreateIncognitoBrowser());
-}
diff --git a/chrome/browser/download/android/download_dialog_bridge.cc b/chrome/browser/download/android/download_dialog_bridge.cc
index 87259d0..bbf1666 100644
--- a/chrome/browser/download/android/download_dialog_bridge.cc
+++ b/chrome/browser/download/android/download_dialog_bridge.cc
@@ -161,14 +161,6 @@
 }
 
 // static
-jboolean JNI_DownloadDialogBridge_IsDataReductionProxyEnabled(JNIEnv* env) {
-  auto* data_reduction_settings =
-      DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
-          ProfileManager::GetActiveUserProfile());
-  return data_reduction_settings->IsDataReductionProxyEnabled();
-}
-
-// static
 jlong JNI_DownloadDialogBridge_GetDownloadLaterMinFileSize(JNIEnv* env) {
   return DownloadDialogBridge::GetDownloadLaterMinFileSize();
 }
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java
index 3f486a5..9d86522 100644
--- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java
+++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java
@@ -299,10 +299,7 @@
                 .setLastAccessTime(item.lastAccessedTimeMs)
                 .setIsOpenable(item.isOpenable)
                 .setMimeType(item.mimeType)
-
-                // TODO(https://crbug.com/1278805): Continue migration for OfflineItem
-                .setUrl(new GURL(item.url))
-
+                .setUrl(item.url)
                 .setOriginalUrl(item.originalUrl)
                 .setOTRProfileId(OTRProfileID.deserialize(item.otrProfileId))
                 .setState(state)
diff --git a/chrome/browser/download/internal/android/BUILD.gn b/chrome/browser/download/internal/android/BUILD.gn
index 885a40ee..e50bbd2d 100644
--- a/chrome/browser/download/internal/android/BUILD.gn
+++ b/chrome/browser/download/internal/android/BUILD.gn
@@ -125,6 +125,7 @@
     "//third_party/androidx:androidx_recyclerview_recyclerview_java",
     "//third_party/androidx:androidx_vectordrawable_vectordrawable_animated_java",
     "//ui/android:ui_java",
+    "//url:gurl_java",
   ]
 
   annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
@@ -236,6 +237,8 @@
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java",
     "//ui/android:ui_java_test_support",
+    "//url:gurl_java",
+    "//url:gurl_junit_test_support",
   ]
 
   resources_package = "org.chromium.chrome.browser.download.internal"
@@ -272,6 +275,8 @@
     "//third_party/junit:junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_full_java",
+    "//url:gurl_java",
+    "//url:gurl_junit_test_support",
   ]
 
   resources_package = "org.chromium.chrome.browser.download.internal"
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/DownloadActivityV2Test.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/DownloadActivityV2Test.java
index 801402bb..6c5b67c 100644
--- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/DownloadActivityV2Test.java
+++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/DownloadActivityV2Test.java
@@ -79,6 +79,7 @@
 import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.test.util.DummyUiActivityTestCase;
 import org.chromium.ui.test.util.UiRestriction;
+import org.chromium.url.JUnitTestGURLs;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -301,8 +302,8 @@
 
         // Add an item. The new item should be visible and the storage text should be updated.
         OfflineItem item5 = StubbedProvider.createOfflineItem("offline_guid_5",
-                "http://stuff_and_things.com", OfflineItemState.COMPLETE, 1024, "page 5",
-                "/data/fake_path/Downloads/file_5", System.currentTimeMillis(), 100000,
+                JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_2), OfflineItemState.COMPLETE, 1024,
+                "page 5", "/data/fake_path/Downloads/file_5", System.currentTimeMillis(), 100000,
                 OfflineItemFilter.OTHER);
 
         TestThreadUtils.runOnUiThreadBlocking(() -> mStubbedOfflineContentProvider.addItem(item5));
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/StubbedProvider.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/StubbedProvider.java
index 4d48fcb..03458b8 100644
--- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/StubbedProvider.java
+++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/StubbedProvider.java
@@ -22,6 +22,8 @@
 import org.chromium.components.offline_items_collection.RenameResult;
 import org.chromium.components.offline_items_collection.ShareCallback;
 import org.chromium.components.offline_items_collection.VisualsCallback;
+import org.chromium.url.GURL;
+import org.chromium.url.JUnitTestGURLs;
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -125,23 +127,27 @@
         long startTime = dateToEpoch(date);
         int downloadState = OfflineItemState.COMPLETE;
         if (which == 0) {
-            return createOfflineItem("offline_guid_1", "https://url.com", downloadState, 0,
-                    "page 1", "/data/fake_path/Downloads/first_file", startTime, 1000, filter);
+            return createOfflineItem("offline_guid_1", JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1),
+                    downloadState, 0, "page 1", "/data/fake_path/Downloads/first_file", startTime,
+                    1000, filter);
         } else if (which == 1) {
-            return createOfflineItem("offline_guid_2", "http://stuff_and_things.com", downloadState,
-                    0, "page 2", "/data/fake_path/Downloads/file_two", startTime, 10000, filter);
+            return createOfflineItem("offline_guid_2", JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_2),
+                    downloadState, 0, "page 2", "/data/fake_path/Downloads/file_two", startTime,
+                    10000, filter);
         } else if (which == 2) {
-            return createOfflineItem("offline_guid_3", "https://url.com", downloadState, 100,
-                    "page 3", "/data/fake_path/Downloads/3_file", startTime, 100000, filter);
+            return createOfflineItem("offline_guid_3", JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1),
+                    downloadState, 100, "page 3", "/data/fake_path/Downloads/3_file", startTime,
+                    100000, filter);
         } else if (which == 3) {
-            return createOfflineItem("offline_guid_4", "https://things.com", downloadState, 1024,
-                    "page 4", "/data/fake_path/Downloads/4", startTime, ONE_GIGABYTE * 5L, filter);
+            return createOfflineItem("offline_guid_4", JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_3),
+                    downloadState, 1024, "page 4", "/data/fake_path/Downloads/4", startTime,
+                    ONE_GIGABYTE * 5L, filter);
         } else {
             return null;
         }
     }
 
-    public static OfflineItem createOfflineItem(String guid, String url, int state,
+    public static OfflineItem createOfflineItem(String guid, GURL url, int state,
             long downloadProgressBytes, String title, String targetPath, long startTime,
             long totalSize, int filter) {
         OfflineItem offlineItem = new OfflineItem();
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutatorTest.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutatorTest.java
index 2f83d830..8a35af7 100644
--- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutatorTest.java
+++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutatorTest.java
@@ -4,7 +4,7 @@
 
 package org.chromium.chrome.browser.download.home.list;
 
-import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -44,6 +44,8 @@
 import org.chromium.components.url_formatter.UrlFormatter;
 import org.chromium.components.url_formatter.UrlFormatterJni;
 import org.chromium.ui.modelutil.ListObservable.ListObserver;
+import org.chromium.url.GURL;
+import org.chromium.url.JUnitTestGURLs;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -79,9 +81,9 @@
     public void setUp() {
         mModel = new ListItemModel();
         mJniMocker.mock(UrlFormatterJni.TEST_HOOKS, mUrlFormatterJniMock);
-        when(mUrlFormatterJniMock.formatStringUrlForSecurityDisplay(
-                     anyString(), eq(SchemeDisplay.OMIT_HTTP_AND_HTTPS)))
-                .then(inv -> inv.getArgument(0));
+        when(mUrlFormatterJniMock.formatUrlForSecurityDisplay(
+                     any(), eq(SchemeDisplay.OMIT_HTTP_AND_HTTPS)))
+                .then(inv -> ((GURL) (inv.getArgument(0))).getSpec());
     }
 
     @After
@@ -1086,7 +1088,7 @@
 
         Assert.assertEquals(10, mModel.size());
         assertDivider(mModel.get(0), ListItem.CardDividerListItem.Position.TOP);
-        assertCardHeader(mModel.get(1), buildCalendar(2018, 1, 4, 0), "http://example.com/xyz");
+        assertCardHeader(mModel.get(1), buildCalendar(2018, 1, 4, 0), JUnitTestGURLs.EXAMPLE_URL);
         assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 4, 4), item4);
         assertDivider(mModel.get(3), ListItem.CardDividerListItem.Position.MIDDLE);
         assertOfflineItem(mModel.get(4), buildCalendar(2018, 1, 4, 3), item3);
@@ -1192,7 +1194,7 @@
         item.isSuggested = true;
         item.creationTimeMs = calendar.getTimeInMillis();
         item.filter = filter;
-        item.url = "http://example.com/xyz";
+        item.url = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL);
         return item;
     }
 
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/ShareUtils.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/ShareUtils.java
index fb6ac99..147c7840 100644
--- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/ShareUtils.java
+++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/ShareUtils.java
@@ -6,7 +6,6 @@
 
 import android.content.Intent;
 import android.net.Uri;
-import android.text.TextUtils;
 
 import androidx.core.util.Pair;
 
@@ -49,9 +48,9 @@
             Uri uri = item.second == null ? null : item.second.uri;
             if (uri != null && uri.compareTo(Uri.EMPTY) != 0) {
                 uris.add(uri);
-            } else if (!TextUtils.isEmpty(item.first.url)) {
+            } else if (item.first.url != null && !item.first.url.isEmpty()) {
                 if (urls.length() > 0) urls.append("\n");
-                urls.append(item.first.url);
+                urls.append(item.first.url.getSpec());
             }
         }
 
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/ShareUtilsTest.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/ShareUtilsTest.java
index a8f1b42..459be008 100644
--- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/ShareUtilsTest.java
+++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/ShareUtilsTest.java
@@ -17,6 +17,8 @@
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.components.offline_items_collection.OfflineItem;
 import org.chromium.components.offline_items_collection.OfflineItemShareInfo;
+import org.chromium.url.GURL;
+import org.chromium.url.JUnitTestGURLs;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -35,112 +37,111 @@
     @Test
     public void testAction() {
         Intent intent = ShareUtils.createIntent(Collections.singletonList(
-                createItem("http://www.google.com", "text/plain", "", null)));
+                createItem(JUnitTestGURLs.URL_1, "text/plain", "", null)));
         Assert.assertEquals(Intent.ACTION_SEND, intent.getAction());
 
         intent = ShareUtils.createIntent(
-                Arrays.asList(createItem("http://www.google.com", "text/plain", "", null),
-                        createItem("http://www.chrome.com", "text/plain", "", null)));
+                Arrays.asList(createItem(JUnitTestGURLs.URL_1, "text/plain", "", null),
+                        createItem(JUnitTestGURLs.URL_2, "text/plain", "", null)));
         Assert.assertEquals(Intent.ACTION_SEND, intent.getAction());
 
         intent = ShareUtils.createIntent(
-                Arrays.asList(createItem("http://www.google.com", "text/plain", "", null),
-                        createItem("", "text/plain", "", "http://www.chrome.com")));
+                Arrays.asList(createItem(JUnitTestGURLs.URL_1, "text/plain", "", null),
+                        createItem("", "text/plain", "", JUnitTestGURLs.URL_2)));
         Assert.assertEquals(Intent.ACTION_SEND_MULTIPLE, intent.getAction());
 
         intent = ShareUtils.createIntent(
-                Arrays.asList(createItem("", "text/plain", "", "http://www.google.com"),
-                        createItem("", "text/plain", "", "http://www.chrome.com")));
+                Arrays.asList(createItem("", "text/plain", "", JUnitTestGURLs.URL_1),
+                        createItem("", "text/plain", "", JUnitTestGURLs.URL_2)));
         Assert.assertEquals(Intent.ACTION_SEND_MULTIPLE, intent.getAction());
     }
 
     @Test
     public void testFlags() {
         Intent intent = ShareUtils.createIntent(Collections.singletonList(
-                createItem("http://www.google.com", "text/plain", "", null)));
+                createItem(JUnitTestGURLs.URL_1, "text/plain", "", null)));
         Assert.assertNotEquals(0, intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
     }
 
     @Test
     public void testExtraText() {
         Intent intent = ShareUtils.createIntent(Collections.singletonList(
-                createItem("http://www.google.com", "text/plain", "", null)));
-        Assert.assertEquals("http://www.google.com", intent.getStringExtra(Intent.EXTRA_TEXT));
-
-        intent = ShareUtils.createIntent(Arrays.asList(
-                createItem("http://www.google.com", "text/plain", "", null),
-                createItem("http://www.chrome.com", "text/plain", "", "http://www.chrome.com")));
-        Assert.assertEquals("http://www.google.com", intent.getStringExtra(Intent.EXTRA_TEXT));
+                createItem(JUnitTestGURLs.URL_1, "text/plain", "", null)));
+        Assert.assertEquals(JUnitTestGURLs.URL_1, intent.getStringExtra(Intent.EXTRA_TEXT));
 
         intent = ShareUtils.createIntent(
-                Arrays.asList(createItem("http://www.google.com", "text/plain", "", null),
-                        createItem("http://www.chrome.com", "text/plain", "", null)));
-        Assert.assertEquals("http://www.google.com\nhttp://www.chrome.com",
+                Arrays.asList(createItem(JUnitTestGURLs.URL_1, "text/plain", "", null),
+                        createItem(JUnitTestGURLs.URL_2, "text/plain", "", JUnitTestGURLs.URL_2)));
+        Assert.assertEquals(JUnitTestGURLs.URL_1, intent.getStringExtra(Intent.EXTRA_TEXT));
+
+        intent = ShareUtils.createIntent(
+                Arrays.asList(createItem(JUnitTestGURLs.URL_1, "text/plain", "", null),
+                        createItem(JUnitTestGURLs.URL_2, "text/plain", "", null)));
+        Assert.assertEquals(JUnitTestGURLs.URL_1 + "\n" + JUnitTestGURLs.URL_2,
                 intent.getStringExtra(Intent.EXTRA_TEXT));
 
-        intent = ShareUtils.createIntent(Collections.singletonList(
-                createItem("", "text/plain", "", "http://www.google.com")));
+        intent = ShareUtils.createIntent(
+                Collections.singletonList(createItem("", "text/plain", "", JUnitTestGURLs.URL_1)));
         Assert.assertFalse(intent.hasExtra(Intent.EXTRA_TEXT));
     }
 
     @Test
     public void testExtraSubject() {
         Intent intent = ShareUtils.createIntent(Collections.singletonList(
-                createItem("http://www.google.com", "text/plain", "title", null)));
+                createItem(JUnitTestGURLs.URL_1, "text/plain", "title", null)));
         Assert.assertEquals("title", intent.getStringExtra(Intent.EXTRA_SUBJECT));
 
-        intent = ShareUtils.createIntent(
-                Arrays.asList(createItem("http://www.google.com", "text/plain", "title1", null),
-                        createItem("http://www.chrome.com", "text/plain", "title2",
-                                "http://www.chrome.com")));
+        intent = ShareUtils.createIntent(Arrays.asList(
+                createItem(JUnitTestGURLs.URL_1, "text/plain", "title1", null),
+                createItem(JUnitTestGURLs.URL_2, "text/plain", "title2", JUnitTestGURLs.URL_2)));
         Assert.assertFalse(intent.hasExtra(Intent.EXTRA_SUBJECT));
     }
 
     @Test
     public void testExtraStream() {
         Intent intent = ShareUtils.createIntent(Collections.singletonList(
-                createItem("http://www.google.com", "text/plain", "", null)));
-        Assert.assertFalse(intent.hasExtra(Intent.EXTRA_STREAM));
-        Assert.assertNull(intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM));
-
-        intent = ShareUtils.createIntent(Collections.singletonList(
-                createItem("", "text/plain", "", "http://www.google.com")));
-        Assert.assertEquals(
-                Uri.parse("http://www.google.com"), intent.getParcelableExtra(Intent.EXTRA_STREAM));
-
-        intent = ShareUtils.createIntent(Collections.singletonList(
-                createItem("http://www.google.com", "text/plain", "", "http://www.google.com")));
-        Assert.assertEquals(
-                Uri.parse("http://www.google.com"), intent.getParcelableExtra(Intent.EXTRA_STREAM));
-
-        intent = ShareUtils.createIntent(
-                Arrays.asList(createItem("", "text/plain", "", "http://www.google.com"),
-                        createItem("http://www.chrome.com", "text/plain", "", "")));
-        Assert.assertEquals(
-                Uri.parse("http://www.google.com"), intent.getParcelableExtra(Intent.EXTRA_STREAM));
-
-        intent = ShareUtils.createIntent(Arrays.asList(
-                createItem("", "text/plain", "", "http://www.google.com"),
-                createItem("http://www.chrome.com", "text/plain", "", "http://www.chrome.com")));
-        Assert.assertEquals(Arrays.asList(Uri.parse("http://www.google.com"),
-                                    Uri.parse("http://www.chrome.com")),
-                intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM));
-
-        intent = ShareUtils.createIntent(
-                Arrays.asList(createItem("", "text/plain", "", "http://www.google.com"),
-                        createItem("", "text/plain", "", "http://www.chrome.com")));
-        Assert.assertEquals(Arrays.asList(Uri.parse("http://www.google.com"),
-                                    Uri.parse("http://www.chrome.com")),
-                intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM));
-
-        intent = ShareUtils.createIntent(Collections.singletonList(
-                createItem("http://www.google.com", "text/plain", "", null)));
+                createItem(JUnitTestGURLs.URL_1, "text/plain", "", null)));
         Assert.assertFalse(intent.hasExtra(Intent.EXTRA_STREAM));
         Assert.assertNull(intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM));
 
         intent = ShareUtils.createIntent(
-                Arrays.asList(createItem("http://www.google.com", "text/plain", "", null),
-                        createItem("http://www.chrome.com", "text/plain", "", null)));
+                Collections.singletonList(createItem("", "text/plain", "", JUnitTestGURLs.URL_1)));
+        Assert.assertEquals(
+                Uri.parse(JUnitTestGURLs.URL_1), intent.getParcelableExtra(Intent.EXTRA_STREAM));
+
+        intent = ShareUtils.createIntent(Collections.singletonList(
+                createItem(JUnitTestGURLs.URL_1, "text/plain", "", JUnitTestGURLs.URL_1)));
+        Assert.assertEquals(
+                Uri.parse(JUnitTestGURLs.URL_1), intent.getParcelableExtra(Intent.EXTRA_STREAM));
+
+        intent = ShareUtils.createIntent(
+                Arrays.asList(createItem("", "text/plain", "", JUnitTestGURLs.URL_1),
+                        createItem(JUnitTestGURLs.URL_2, "text/plain", "", "")));
+        Assert.assertEquals(
+                Uri.parse(JUnitTestGURLs.URL_1), intent.getParcelableExtra(Intent.EXTRA_STREAM));
+
+        intent = ShareUtils.createIntent(
+                Arrays.asList(createItem("", "text/plain", "", JUnitTestGURLs.URL_1),
+                        createItem(JUnitTestGURLs.URL_2, "text/plain", "", JUnitTestGURLs.URL_2)));
+        Assert.assertEquals(
+                Arrays.asList(Uri.parse(JUnitTestGURLs.URL_1), Uri.parse(JUnitTestGURLs.URL_2)),
+                intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM));
+
+        intent = ShareUtils.createIntent(
+                Arrays.asList(createItem("", "text/plain", "", JUnitTestGURLs.URL_1),
+                        createItem("", "text/plain", "", JUnitTestGURLs.URL_2)));
+        Assert.assertEquals(
+                Arrays.asList(Uri.parse(JUnitTestGURLs.URL_1), Uri.parse(JUnitTestGURLs.URL_2)),
+                intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM));
+
+        intent = ShareUtils.createIntent(Collections.singletonList(
+                createItem(JUnitTestGURLs.URL_1, "text/plain", "", null)));
+        Assert.assertFalse(intent.hasExtra(Intent.EXTRA_STREAM));
+        Assert.assertNull(intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM));
+
+        intent = ShareUtils.createIntent(
+                Arrays.asList(createItem(JUnitTestGURLs.URL_1, "text/plain", "", null),
+                        createItem(JUnitTestGURLs.URL_2, "text/plain", "", null)));
         Assert.assertFalse(intent.hasExtra(Intent.EXTRA_STREAM));
         Assert.assertNull(intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM));
     }
@@ -148,26 +149,32 @@
     @Test
     public void testType() {
         Intent intent = ShareUtils.createIntent(Collections.singletonList(
-                createItem("http://www.google.com", "text/plain", "", null)));
+                createItem(JUnitTestGURLs.URL_1, "text/plain", "", null)));
         Assert.assertEquals(Intent.normalizeMimeType("text/plain"), intent.getType());
 
         intent = ShareUtils.createIntent(
-                Arrays.asList(createItem("http://www.google.com", "text/plain", "", null),
-                        createItem("http://www.google.com", "text/plain", "", null),
-                        createItem("http://www.google.com", "text/html", "", null),
-                        createItem("http://www.google.com", "text/html", "", null)));
+                Arrays.asList(createItem(JUnitTestGURLs.URL_1, "text/plain", "", null),
+                        createItem(JUnitTestGURLs.URL_1, "text/plain", "", null),
+                        createItem(JUnitTestGURLs.URL_1, "text/html", "", null),
+                        createItem(JUnitTestGURLs.URL_1, "text/html", "", null)));
         Assert.assertEquals(Intent.normalizeMimeType("text/*"), intent.getType());
 
         intent = ShareUtils.createIntent(
-                Arrays.asList(createItem("http://www.google.com", "text/plain", "", null),
-                        createItem("http://www.google.com", "application/octet-stream", "", null)));
+                Arrays.asList(createItem(JUnitTestGURLs.URL_1, "text/plain", "", null),
+                        createItem(JUnitTestGURLs.URL_1, "application/octet-stream", "", null)));
         Assert.assertEquals(Intent.normalizeMimeType("*/*"), intent.getType());
     }
 
     private static Pair<OfflineItem, OfflineItemShareInfo> createItem(
             String url, String mimeType, String title, String uri) {
         OfflineItem item = new OfflineItem();
-        item.url = url;
+        if (url == null) {
+            item.url = null;
+        } else if (url.isEmpty()) {
+            item.url = GURL.emptyGURL();
+        } else {
+            item.url = JUnitTestGURLs.getGURL(url);
+        }
         item.mimeType = mimeType;
         item.title = title;
 
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/GroupCardLabelAdder.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/GroupCardLabelAdder.java
index c8d89d8..0fbfcae 100644
--- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/GroupCardLabelAdder.java
+++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/GroupCardLabelAdder.java
@@ -102,7 +102,7 @@
         }
 
         Pair<Date, String> dateAndDomain = getDateAndDomainForItem(candidateCardItems.get(0));
-        String url = ((ListItem.OfflineItemListItem) candidateCardItems.get(0)).item.url;
+        String url = ((ListItem.OfflineItemListItem) candidateCardItems.get(0)).item.url.getSpec();
         mCardPaginator.initializeEntry(dateAndDomain);
 
         // Add the card header, and the divider above it.
diff --git a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc
index a09a1c3..e1e151f5 100644
--- a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc
+++ b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc
@@ -23,8 +23,6 @@
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
 #include "chrome/browser/google/google_brand.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/sync/sync_service_factory.h"
@@ -76,7 +74,6 @@
 constexpr char kSyncDataKey[] = "about_sync_data";
 constexpr char kExtensionsListKey[] = "extensions";
 constexpr char kPowerApiListKey[] = "chrome.power extensions";
-constexpr char kDataReductionProxyKey[] = "data_reduction_proxy";
 constexpr char kChromeVersionTag[] = "CHROME VERSION";
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -337,7 +334,6 @@
   PopulateSyncLogs(response.get());
   PopulateExtensionInfoLogs(response.get());
   PopulatePowerApiLogs(response.get());
-  PopulateDataReductionProxyLogs(response.get());
 #if BUILDFLAG(IS_WIN)
   PopulateUsbKeyboardDetected(response.get());
   PopulateEnrolledToDomain(response.get());
@@ -453,19 +449,6 @@
     response->emplace(kPowerApiListKey, info);
 }
 
-void ChromeInternalLogSource::PopulateDataReductionProxyLogs(
-    SystemLogsResponse* response) {
-  data_reduction_proxy::DataReductionProxySettings*
-      data_reduction_proxy_settings =
-          DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
-              ProfileManager::GetLastUsedProfile());
-  bool data_saver_enabled =
-      data_reduction_proxy_settings &&
-      data_reduction_proxy_settings->IsDataReductionProxyEnabled();
-  response->emplace(kDataReductionProxyKey,
-                    data_saver_enabled ? "enabled" : "disabled");
-}
-
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 void ChromeInternalLogSource::PopulateLocalStateSettings(
     SystemLogsResponse* response) {
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 3966822..b95773e 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -745,11 +745,6 @@
     "Enable new features that affect setting, sending, and managing cookies. "
     "The enabled features are subject to change at any time.";
 
-const char kEnableSaveDataName[] = "Enables save data feature";
-const char kEnableSaveDataDescription[] =
-    "Enables save data feature. May cause user's traffic to be proxied via "
-    "Google's data reduction proxy.";
-
 const char kEnableNavigationPredictorName[] = "Enables navigation predictor";
 const char kEnableNavigationPredictorDescription[] =
     "Enables navigation predictor feature that predicts the next likely "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index cda623f..5236ab3 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -439,9 +439,6 @@
 extern const char kEnableExperimentalCookieFeaturesName[];
 extern const char kEnableExperimentalCookieFeaturesDescription[];
 
-extern const char kEnableSaveDataName[];
-extern const char kEnableSaveDataDescription[];
-
 extern const char kEnableNavigationPredictorName[];
 extern const char kEnableNavigationPredictorDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index c4207a8..acc3c625 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -13,7 +13,6 @@
 #include "base/feature_list.h"
 #include "base/metrics/field_trial_params.h"
 #include "chrome/browser/browser_features.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/feature_guide/notifications/feature_notification_guide_service.h"
 #include "chrome/browser/flags/jni_headers/ChromeFeatureList_jni.h"
 #include "chrome/browser/notifications/chime/android/features.h"
@@ -28,6 +27,7 @@
 #include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/browser_sync/browser_sync_switches.h"
 #include "components/browser_ui/photo_picker/android/features.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/content_creation/notes/core/note_features.h"
 #include "components/content_creation/reactions/core/reactions_features.h"
 #include "components/content_settings/core/common/features.h"
diff --git a/chrome/browser/fuchsia/chrome_browser_main_parts_fuchsia.cc b/chrome/browser/fuchsia/chrome_browser_main_parts_fuchsia.cc
index a411d2d0..4fefbe4 100644
--- a/chrome/browser/fuchsia/chrome_browser_main_parts_fuchsia.cc
+++ b/chrome/browser/fuchsia/chrome_browser_main_parts_fuchsia.cc
@@ -27,8 +27,12 @@
 #include "base/fuchsia/scoped_service_binding.h"
 #include "base/notreached.h"
 #include "base/numerics/clamped_math.h"
+#include "chrome/browser/fuchsia/element_manager_impl.h"
 #include "chrome/browser/fuchsia/switches.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
+#include "chrome/common/chrome_switches.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/ozone/public/ozone_switches.h"
 #include "ui/platform_window/fuchsia/initialize_presenter_api_view.h"
@@ -54,6 +58,14 @@
                                   scenic_uses_flatland ? "flatland" : "scenic");
 }
 
+void HandleCFv2Argument() {
+  base::CommandLine* const launch_args = base::CommandLine::ForCurrentProcess();
+  if (!launch_args->HasSwitch(switches::kEnableCFv2)) {
+    return;
+  }
+  launch_args->AppendSwitch(switches::kNoStartupWindow);
+}
+
 fuchsia::ui::views::ViewRef CloneViewRef(
     const fuchsia::ui::views::ViewRef& view_ref) {
   fuchsia::ui::views::ViewRef dup;
@@ -63,6 +75,12 @@
   return dup;
 }
 
+bool NotifyNewBrowserWindow(const base::CommandLine& command_line) {
+  base::FilePath path;
+  return ChromeBrowserMainParts::ProcessSingletonNotificationCallback(
+      command_line, path);
+}
+
 // ViewProviderScenic ----------------------------------------------------------
 
 // ViewProvider implementation that provides a single view and exposes all
@@ -600,6 +618,7 @@
 
 int ChromeBrowserMainPartsFuchsia::PreEarlyInitialization() {
   HandleOzonePlatformArgs();
+  HandleCFv2Argument();
   return ChromeBrowserMainParts::PreEarlyInitialization();
 }
 
@@ -608,6 +627,12 @@
           switches::kEnableCFv2)) {
     // Configure Ozone to create top-level Views via GraphicalPresenter.
     use_graphical_presenter_ = std::make_unique<UseGraphicalPresenter>();
+    element_manager_ = std::make_unique<ElementManagerImpl>(
+        base::ComponentContextForProcess()->outgoing().get(),
+        base::BindRepeating(&NotifyNewBrowserWindow));
+    keep_alive_ = std::make_unique<ScopedKeepAlive>(
+        KeepAliveOrigin::BROWSER_PROCESS_FUCHSIA,
+        KeepAliveRestartOption::ENABLED);
   } else {
     // Register the ViewProvider API.
     view_provider_ = std::make_unique<ViewProviderRouter>(
diff --git a/chrome/browser/fuchsia/chrome_browser_main_parts_fuchsia.h b/chrome/browser/fuchsia/chrome_browser_main_parts_fuchsia.h
index 2c7a48f2..35648059 100644
--- a/chrome/browser/fuchsia/chrome_browser_main_parts_fuchsia.h
+++ b/chrome/browser/fuchsia/chrome_browser_main_parts_fuchsia.h
@@ -13,6 +13,9 @@
 class ProcessLifecycle;
 }
 
+class ScopedKeepAlive;
+class ElementManagerImpl;
+
 class ChromeBrowserMainPartsFuchsia : public ChromeBrowserMainParts {
  public:
   ChromeBrowserMainPartsFuchsia(content::MainFunctionParams parameters,
@@ -37,8 +40,13 @@
 
   std::unique_ptr<base::ProcessLifecycle> lifecycle_;
 
-  // Initialized if GraphicalPresenter is to be used to show top-level windows.
+  // Implementations used when running under CFv2. Under CFv2 Chrome runs in the
+  // background, only opening windows when requested to via the
+  // fuchsia.element.Manager service. The browser process must remain live until
+  // explicitly torn-down by the ELF runner.
   std::unique_ptr<UseGraphicalPresenter> use_graphical_presenter_;
+  std::unique_ptr<ElementManagerImpl> element_manager_;
+  std::unique_ptr<ScopedKeepAlive> keep_alive_;
 
   // TODO(crbug.com/1284806): Remove this once ViewProvider is deprecated.
   std::unique_ptr<ViewProviderRouter> view_provider_;
diff --git a/chrome/browser/fuchsia/element_manager_impl.cc b/chrome/browser/fuchsia/element_manager_impl.cc
new file mode 100644
index 0000000..1869796
--- /dev/null
+++ b/chrome/browser/fuchsia/element_manager_impl.cc
@@ -0,0 +1,40 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/fuchsia/element_manager_impl.h"
+
+#include "base/command_line.h"
+#include "base/files/file_path.h"
+#include "chrome/browser/chrome_browser_main.h"
+
+ElementManagerImpl::ElementManagerImpl(
+    sys::OutgoingDirectory* outgoing_directory,
+    NewProposalCallback callback)
+    : binding_(outgoing_directory, this), callback_(std::move(callback)) {
+  DCHECK(callback_);
+}
+
+ElementManagerImpl::~ElementManagerImpl() = default;
+
+void ElementManagerImpl::ProposeElement(
+    fuchsia::element::Spec spec,
+    fidl::InterfaceRequest<fuchsia::element::Controller> element_controller,
+    ProposeElementCallback callback) {
+  fuchsia::element::Manager_ProposeElement_Result result;
+
+  if (spec.component_url() !=
+      "fuchsia-pkg://fuchsia.com/chrome#meta/chrome.cm") {
+    result.set_err(fuchsia::element::ProposeElementError::INVALID_ARGS);
+    callback(std::move(result));
+    return;
+  }
+
+  base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
+  if (callback_.Run(command_line)) {
+    result.set_response({});
+  } else {
+    result.set_err(fuchsia::element::ProposeElementError::INVALID_ARGS);
+  }
+  callback(std::move(result));
+}
diff --git a/chrome/browser/fuchsia/element_manager_impl.h b/chrome/browser/fuchsia/element_manager_impl.h
new file mode 100644
index 0000000..f1e9757
--- /dev/null
+++ b/chrome/browser/fuchsia/element_manager_impl.h
@@ -0,0 +1,50 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_FUCHSIA_ELEMENT_MANAGER_IMPL_H_
+#define CHROME_BROWSER_FUCHSIA_ELEMENT_MANAGER_IMPL_H_
+
+#include <fuchsia/element/cpp/fidl.h>
+#include <lib/fidl/cpp/interface_request.h>
+
+#include "base/callback.h"
+#include "base/fuchsia/scoped_service_binding.h"
+
+namespace base {
+class CommandLine;
+}  // namespace base
+
+namespace sys {
+class OutgoingDirectory;
+}  // namespace sys
+
+class ElementManagerImpl : public fuchsia::element::Manager {
+ public:
+  // Implement this callback to handle notifications to start a new element. The
+  // callback will receive the command line needed to start the new window(s).
+  // Return true if the command line will be handled within the current browser
+  // instance or false if not (i.e., because the current process is shutting
+  // down).
+  using NewProposalCallback =
+      base::RepeatingCallback<bool(const base::CommandLine& command_line)>;
+
+  ElementManagerImpl(sys::OutgoingDirectory* outgoing_directory,
+                     NewProposalCallback callback);
+  ~ElementManagerImpl() override;
+
+  ElementManagerImpl(const ElementManagerImpl&) = delete;
+  ElementManagerImpl& operator=(const ElementManagerImpl&) = delete;
+
+  // fuchsia::element::Manager implementation
+  void ProposeElement(
+      fuchsia::element::Spec spec,
+      fidl::InterfaceRequest<fuchsia::element::Controller> element_controller,
+      ProposeElementCallback callback) override;
+
+ private:
+  base::ScopedServiceBinding<fuchsia::element::Manager> binding_;
+  NewProposalCallback callback_;
+};
+
+#endif  // CHROME_BROWSER_FUCHSIA_ELEMENT_MANAGER_IMPL_H_
diff --git a/chrome/browser/fuchsia/element_manager_impl_unittest.cc b/chrome/browser/fuchsia/element_manager_impl_unittest.cc
new file mode 100644
index 0000000..259c96a
--- /dev/null
+++ b/chrome/browser/fuchsia/element_manager_impl_unittest.cc
@@ -0,0 +1,82 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/fuchsia/element_manager_impl.h"
+
+#include <lib/sys/cpp/component_context.h>
+#include <lib/sys/cpp/service_directory.h>
+
+#include "base/command_line.h"
+#include "base/fuchsia/process_context.h"
+#include "base/fuchsia/test_component_context_for_process.h"
+#include "base/test/bind.h"
+#include "base/test/task_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+class TestElementManagerImpl : public testing::Test {
+ public:
+  TestElementManagerImpl()
+      : element_manager_(base::ComponentContextForProcess()->outgoing().get(),
+                         base::BindLambdaForTesting(
+                             [&](const base::CommandLine& command_line) {
+                               received_command_line_ = command_line;
+                               return true;
+                             })) {}
+
+ protected:
+  fuchsia::element::ManagerPtr GetElementManagerPtr() {
+    return test_context_.published_services()
+        ->Connect<fuchsia::element::Manager>();
+  }
+
+  base::test::SingleThreadTaskEnvironment task_environment_{
+      base::test::SingleThreadTaskEnvironment::MainThreadType::IO};
+  base::TestComponentContextForProcess test_context_;
+  std::optional<base::CommandLine> received_command_line_;
+  ElementManagerImpl element_manager_;
+};
+
+TEST_F(TestElementManagerImpl, TestCorrectSpec) {
+  fuchsia::element::Spec spec;
+  spec.set_component_url("fuchsia-pkg://fuchsia.com/chrome#meta/chrome.cm");
+
+  auto element_manager = GetElementManagerPtr();
+  base::RunLoop run_loop;
+  std::optional<fuchsia::element::Manager_ProposeElement_Result>
+      received_result;
+  element_manager->ProposeElement(
+      std::move(spec), {},
+      [&](fuchsia::element::Manager_ProposeElement_Result result) {
+        received_result = std::move(result);
+        run_loop.Quit();
+      });
+  run_loop.Run();
+  ASSERT_TRUE(received_result);
+  EXPECT_FALSE(received_result->is_err());
+  EXPECT_TRUE(received_command_line_);
+}
+
+TEST_F(TestElementManagerImpl, TestIncorrectSpec) {
+  fuchsia::element::Spec spec;
+  spec.set_component_url("foobar");
+
+  auto element_manager = GetElementManagerPtr();
+  base::RunLoop run_loop;
+  std::optional<fuchsia::element::Manager_ProposeElement_Result>
+      received_result;
+  element_manager->ProposeElement(
+      std::move(spec), {},
+      [&](fuchsia::element::Manager_ProposeElement_Result result) {
+        received_result = std::move(result);
+        run_loop.Quit();
+      });
+  run_loop.Run();
+  ASSERT_TRUE(received_result);
+  EXPECT_TRUE(received_result->is_err());
+  EXPECT_FALSE(received_command_line_);
+}
+
+}  // namespace
diff --git a/chrome/browser/nearby_sharing/nearby_notification_manager.cc b/chrome/browser/nearby_sharing/nearby_notification_manager.cc
index e8d91844..ae38945 100644
--- a/chrome/browser/nearby_sharing/nearby_notification_manager.cc
+++ b/chrome/browser/nearby_sharing/nearby_notification_manager.cc
@@ -46,11 +46,24 @@
 
 namespace {
 
-constexpr char kNearbyNotificationId[] = "chrome://nearby";
+constexpr char kNearbyInProgressNotificationId[] =
+    "chrome://nearby_share/in_progress";
+constexpr char kNearbyTransferResultNotificationIdPrefix[] =
+    "chrome://nearby_share/result/";
 constexpr char kNearbyDeviceTryingToShareNotificationId[] =
-    "chrome://nearby/nearby_device_trying_to_share";
+    "chrome://nearby_share/nearby_device_trying_to_share";
 constexpr char kNearbyNotifier[] = "nearby";
 
+std::string CreateNotificationIdForShareTarget(
+    const ShareTarget& share_target) {
+  if (base::FeatureList::IsEnabled(features::kNearbySharingSelfShare)) {
+    return std::string(kNearbyTransferResultNotificationIdPrefix) +
+           share_target.id.ToString();
+  } else {
+    return std::string(kNearbyInProgressNotificationId);
+  }
+}
+
 // Creates a default Nearby Share notification with empty content.
 message_center::Notification CreateNearbyNotification(const std::string& id) {
   message_center::Notification notification(
@@ -476,11 +489,11 @@
         break;
     }
 
-    manager_->CloseSuccessNotification();
+    manager_->CloseSuccessNotification(notification_id);
   }
 
   void OnClose(const std::string& notification_id) override {
-    manager_->CloseSuccessNotification();
+    manager_->CloseSuccessNotification(notification_id);
   }
 
  private:
@@ -748,6 +761,7 @@
 
 void NearbyNotificationManager::OnNearbyProcessStopped() {
   if (share_target_ && last_transfer_status_) {
+    CloseTransfer();
     ShowFailure(
         *share_target_,
         TransferMetadataBuilder().set_status(*last_transfer_status_).build());
@@ -774,7 +788,7 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   message_center::Notification notification =
-      CreateNearbyNotification(kNearbyNotificationId);
+      CreateNearbyNotification(kNearbyInProgressNotificationId);
   notification.set_type(message_center::NOTIFICATION_TYPE_PROGRESS);
   notification.set_title(GetProgressNotificationTitle(share_target));
   notification.set_never_timeout(true);
@@ -807,7 +821,7 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   message_center::Notification notification =
-      CreateNearbyNotification(kNearbyNotificationId);
+      CreateNearbyNotification(kNearbyInProgressNotificationId);
   notification.set_title(l10n_util::GetStringUTF16(
       IDS_NEARBY_NOTIFICATION_CONNECTION_REQUEST_TITLE));
   notification.set_message(
@@ -881,11 +895,13 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   if (!share_target.is_incoming) {
+    std::string notification_id =
+        CreateNotificationIdForShareTarget(share_target);
     message_center::Notification notification =
-        CreateNearbyNotification(kNearbyNotificationId);
+        CreateNearbyNotification(notification_id);
     notification.set_title(GetSuccessNotificationTitle(share_target));
 
-    delegate_map_.erase(kNearbyNotificationId);
+    delegate_map_.erase(notification_id);
 
     notification_display_service_->Display(
         NotificationHandler::Type::NEARBY_SHARE, notification,
@@ -914,8 +930,10 @@
     const ShareTarget& share_target,
     ReceivedContentType type,
     const SkBitmap& image) {
+  std::string notification_id =
+      CreateNotificationIdForShareTarget(share_target);
   message_center::Notification notification =
-      CreateNearbyNotification(kNearbyNotificationId);
+      CreateNearbyNotification(notification_id);
   notification.set_title(GetSuccessNotificationTitle(share_target));
 
   // Revert to generic file handling if image decoding failed.
@@ -950,7 +968,7 @@
   }
   notification.set_buttons(notification_actions);
 
-  delegate_map_[kNearbyNotificationId] =
+  delegate_map_[notification_id] =
       std::make_unique<SuccessNotificationDelegate>(
           this, profile_, share_target, type, image,
           std::move(success_action_test_callback_));
@@ -974,8 +992,10 @@
     const TransferMetadata& transfer_metadata) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
+  std::string notification_id =
+      CreateNotificationIdForShareTarget(share_target);
   message_center::Notification notification =
-      CreateNearbyNotification(kNearbyNotificationId);
+      CreateNearbyNotification(notification_id);
   notification.set_title(GetFailureNotificationTitle(share_target));
 
   absl::optional<std::u16string> message =
@@ -984,7 +1004,7 @@
     notification.set_message(*message);
   }
 
-  delegate_map_.erase(kNearbyNotificationId);
+  delegate_map_.erase(notification_id);
 
   notification_display_service_->Display(
       NotificationHandler::Type::NEARBY_SHARE, notification,
@@ -994,14 +1014,16 @@
 void NearbyNotificationManager::ShowCancelled(const ShareTarget& share_target) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
+  std::string notification_id =
+      CreateNotificationIdForShareTarget(share_target);
   message_center::Notification notification =
-      CreateNearbyNotification(kNearbyNotificationId);
+      CreateNearbyNotification(notification_id);
 
   notification.set_title(base::ReplaceStringPlaceholders(
       l10n_util::GetStringUTF16(IDS_NEARBY_NOTIFICATION_SENDER_CANCELLED),
       {base::UTF8ToUTF16(share_target.device_name)}, /*offsets=*/nullptr));
 
-  delegate_map_.erase(kNearbyNotificationId);
+  delegate_map_.erase(notification_id);
 
   notification_display_service_->Display(
       NotificationHandler::Type::NEARBY_SHARE, notification,
@@ -1009,9 +1031,9 @@
 }
 
 void NearbyNotificationManager::CloseTransfer() {
-  delegate_map_.erase(kNearbyNotificationId);
+  delegate_map_.erase(kNearbyInProgressNotificationId);
   notification_display_service_->Close(NotificationHandler::Type::NEARBY_SHARE,
-                                       kNearbyNotificationId);
+                                       kNearbyInProgressNotificationId);
 }
 
 void NearbyNotificationManager::CloseNearbyDeviceTryingToShare() {
@@ -1109,10 +1131,11 @@
   }
 }
 
-void NearbyNotificationManager::CloseSuccessNotification() {
-  delegate_map_.erase(kNearbyNotificationId);
+void NearbyNotificationManager::CloseSuccessNotification(
+    const std::string& notification_id) {
+  delegate_map_.erase(notification_id);
   notification_display_service_->Close(NotificationHandler::Type::NEARBY_SHARE,
-                                       kNearbyNotificationId);
+                                       notification_id);
 }
 
 void NearbyNotificationManager::SetOnSuccessClickedForTesting(
diff --git a/chrome/browser/nearby_sharing/nearby_notification_manager.h b/chrome/browser/nearby_sharing/nearby_notification_manager.h
index c0f80e4..08c962e 100644
--- a/chrome/browser/nearby_sharing/nearby_notification_manager.h
+++ b/chrome/browser/nearby_sharing/nearby_notification_manager.h
@@ -143,7 +143,7 @@
   // won't show another one for a certain time period after this.
   void OnNearbyDeviceTryingToShareDismissed(bool did_click_dismiss);
 
-  void CloseSuccessNotification();
+  void CloseSuccessNotification(const std::string& notification_id);
 
   void SetOnSuccessClickedForTesting(
       base::OnceCallback<void(SuccessNotificationAction)> callback);
diff --git a/chrome/browser/nearby_sharing/nearby_notification_manager_unittest.cc b/chrome/browser/nearby_sharing/nearby_notification_manager_unittest.cc
index 8a2d0ede..38d6e08 100644
--- a/chrome/browser/nearby_sharing/nearby_notification_manager_unittest.cc
+++ b/chrome/browser/nearby_sharing/nearby_notification_manager_unittest.cc
@@ -138,14 +138,18 @@
   return profile_manager;
 }
 
-class NearbyNotificationManagerTest : public testing::Test {
+class NearbyNotificationManagerTestBase : public testing::Test {
  public:
-  NearbyNotificationManagerTest() {
-    scoped_feature_list_.InitAndEnableFeature(features::kNearbySharing);
+  explicit NearbyNotificationManagerTestBase(bool enable_self_share) {
+    is_self_share_enabled_ = enable_self_share;
+    if (is_self_share_enabled_) {
+      scoped_feature_list_.InitAndEnableFeature(
+          features::kNearbySharingSelfShare);
+    }
     RegisterNearbySharingPrefs(pref_service_.registry());
   }
 
-  ~NearbyNotificationManagerTest() override = default;
+  ~NearbyNotificationManagerTestBase() override = default;
 
   void SetUp() override {
     NearbySharingServiceFactory::
@@ -252,6 +256,15 @@
   std::unique_ptr<NearbyNotificationManager> manager_;
   data_decoder::test::InProcessDataDecoder in_process_data_decoder_;
   MockSettingsOpener* settings_opener_;
+  bool is_self_share_enabled_ = false;
+};
+
+// We parameterize these tests to run them with Self Share enabled and disabled.
+class NearbyNotificationManagerTest : public NearbyNotificationManagerTestBase,
+                                      public testing::WithParamInterface<bool> {
+ public:
+  NearbyNotificationManagerTest()
+      : NearbyNotificationManagerTestBase(/*enable_self_share=*/GetParam()) {}
 };
 
 struct AttachmentsTestParamInternal {
@@ -329,17 +342,30 @@
      IDS_NEARBY_FILE_ATTACHMENTS_NOT_CAPITALIZED_UNKNOWN},
 };
 
-using AttachmentsTestParam = std::tuple<AttachmentsTestParamInternal, bool>;
+// Boolean parameters are |is_incoming| and |enable_self_share|.
+using AttachmentsTestParam =
+    std::tuple<AttachmentsTestParamInternal, bool, bool>;
 
 class NearbyNotificationManagerAttachmentsTest
-    : public NearbyNotificationManagerTest,
-      public testing::WithParamInterface<AttachmentsTestParam> {};
+    : public NearbyNotificationManagerTestBase,
+      public testing::WithParamInterface<AttachmentsTestParam> {
+ public:
+  NearbyNotificationManagerAttachmentsTest()
+      : NearbyNotificationManagerTestBase(
+            /*enable_self_share=*/std::get<2>(GetParam())) {}
+};
 
-using ConnectionRequestTestParam = bool;
+// Boolean parameters are |with_token| and |enable_self_share|.
+using ConnectionRequestTestParam = std::tuple<bool, bool>;
 
 class NearbyNotificationManagerConnectionRequestTest
-    : public NearbyNotificationManagerTest,
-      public testing::WithParamInterface<ConnectionRequestTestParam> {};
+    : public NearbyNotificationManagerTestBase,
+      public testing::WithParamInterface<ConnectionRequestTestParam> {
+ public:
+  NearbyNotificationManagerConnectionRequestTest()
+      : NearbyNotificationManagerTestBase(
+            /*enable_self_share=*/std::get<1>(GetParam())) {}
+};
 
 std::u16string FormatNotificationTitle(
     int resource_id,
@@ -359,7 +385,7 @@
 
 }  // namespace
 
-TEST_F(NearbyNotificationManagerTest, RegistersAsBackgroundSurfaces) {
+TEST_P(NearbyNotificationManagerTest, RegistersAsBackgroundSurfaces) {
   manager_.reset();
   TransferUpdateCallback* receive_transfer_callback = nullptr;
   TransferUpdateCallback* send_transfer_callback = nullptr;
@@ -387,13 +413,13 @@
   EXPECT_EQ(manager(), send_discovery_callback);
 }
 
-TEST_F(NearbyNotificationManagerTest, UnregistersSurfaces) {
+TEST_P(NearbyNotificationManagerTest, UnregistersSurfaces) {
   EXPECT_CALL(*nearby_service_, UnregisterReceiveSurface(manager()));
   EXPECT_CALL(*nearby_service_, UnregisterSendSurface(manager(), manager()));
   manager_.reset();
 }
 
-TEST_F(NearbyNotificationManagerTest, ShowProgress_ShowsNotification) {
+TEST_P(NearbyNotificationManagerTest, ShowProgress_ShowsNotification) {
   ShareTarget share_target;
   TransferMetadata transfer_metadata = TransferMetadataBuilder().build();
 
@@ -423,7 +449,7 @@
   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_APP_CANCEL), cancel_button.title);
 }
 
-TEST_F(NearbyNotificationManagerTest, ShowProgress_ShowsProgress) {
+TEST_P(NearbyNotificationManagerTest, ShowProgress_ShowsProgress) {
   double progress = 75.0;
 
   ShareTarget share_target;
@@ -440,7 +466,7 @@
   EXPECT_EQ(progress, notification.progress());
 }
 
-TEST_F(NearbyNotificationManagerTest, ShowProgress_UpdatesProgress) {
+TEST_P(NearbyNotificationManagerTest, ShowProgress_UpdatesProgress) {
   ShareTarget share_target;
   TransferMetadataBuilder transfer_metadata_builder;
   transfer_metadata_builder.set_progress(75.0);
@@ -459,7 +485,7 @@
   EXPECT_EQ(progress, notification.progress());
 }
 
-TEST_F(NearbyNotificationManagerTest, ShowProgress_DeviceNameEncoding) {
+TEST_P(NearbyNotificationManagerTest, ShowProgress_DeviceNameEncoding) {
   ShareTarget share_target;
   share_target.device_name = u8"\xf0\x9f\x8c\xb5";  // Cactus emoji.
   TransferMetadata transfer_metadata =
@@ -597,11 +623,12 @@
     NearbyNotificationManagerAttachmentsTest,
     NearbyNotificationManagerAttachmentsTest,
     testing::Combine(testing::ValuesIn(kAttachmentsTestParams),
+                     testing::Bool(),
                      testing::Bool()));
 
 TEST_P(NearbyNotificationManagerConnectionRequestTest,
        ShowConnectionRequest_ShowsNotification) {
-  bool with_token = GetParam();
+  bool with_token = std::get<0>(GetParam());
 
   std::string device_name = "device";
   std::string token = "3141";
@@ -672,9 +699,9 @@
 
 INSTANTIATE_TEST_SUITE_P(NearbyNotificationManagerConnectionRequestTest,
                          NearbyNotificationManagerConnectionRequestTest,
-                         testing::Bool());
+                         testing::Combine(testing::Bool(), testing::Bool()));
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        ShowConnectionRequest_DeviceNameEncoding) {
   ShareTarget share_target;
   share_target.device_name = u8"\xf0\x9f\x8c\xb5";  // Cactus emoji.
@@ -687,7 +714,7 @@
   EXPECT_TRUE(message.find(share_target.device_name) != std::string::npos);
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        ShowNearbyDeviceTryingToShare_ShowsNotification) {
   manager()->ShowNearbyDeviceTryingToShare();
 
@@ -725,7 +752,7 @@
     EXPECT_EQ(expected_button_titles[i], buttons[i].title);
 }
 
-TEST_F(
+TEST_P(
     NearbyNotificationManagerTest,
     ShowNearbyDeviceTryingToShare_AlreadyOnboarded_ShowsGoVisibleNotification) {
   pref_service_.SetBoolean(prefs::kNearbySharingOnboardingCompletePrefName,
@@ -766,7 +793,7 @@
     EXPECT_EQ(expected_button_titles[i], buttons[i].title);
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        FastInitiationDeviceFound_ShowsNearbyDeviceTryingToShare) {
   manager()->OnFastInitiationDevicesDetected();
 
@@ -784,7 +811,7 @@
       notification.message());
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        FastInitiationDeviceLost_ClosesNearbyDeviceTryingToShare) {
   manager()->OnFastInitiationDevicesDetected();
   EXPECT_EQ(1u, GetDisplayedNotifications().size());
@@ -793,7 +820,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        FastInitiationScanningStopped_ClosesNearbyDeviceTryingToShare) {
   manager()->OnFastInitiationDevicesDetected();
   EXPECT_EQ(1u, GetDisplayedNotifications().size());
@@ -802,7 +829,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest, ShowSuccess_ShowsNotification) {
+TEST_P(NearbyNotificationManagerTest, ShowSuccess_ShowsNotification) {
   manager()->ShowSuccess(ShareTarget());
 
   std::vector<message_center::Notification> notifications =
@@ -823,7 +850,7 @@
   EXPECT_EQ(0u, notification.buttons().size());
 }
 
-TEST_F(NearbyNotificationManagerTest, ShowSuccess_DeviceNameEncoding) {
+TEST_P(NearbyNotificationManagerTest, ShowSuccess_DeviceNameEncoding) {
   ShareTarget share_target;
   share_target.device_name = u8"\xf0\x9f\x8c\xb5";  // Cactus emoji.
 
@@ -834,7 +861,7 @@
   EXPECT_TRUE(title.find(share_target.device_name) != std::string::npos);
 }
 
-TEST_F(NearbyNotificationManagerTest, ShowCancelled_ShowsNotification) {
+TEST_P(NearbyNotificationManagerTest, ShowCancelled_ShowsNotification) {
   ShareTarget share_target;
   manager()->ShowCancelled(share_target);
   std::vector<message_center::Notification> notifications =
@@ -842,7 +869,7 @@
   ASSERT_EQ(1u, notifications.size());
 }
 
-TEST_F(NearbyNotificationManagerTest, ShowCancelled_DeviceNameEncoding) {
+TEST_P(NearbyNotificationManagerTest, ShowCancelled_DeviceNameEncoding) {
   ShareTarget share_target;
   share_target.device_name = u8"\xf0\x9f\x8c\xb5";  // Cactus emoji.
 
@@ -854,7 +881,7 @@
   EXPECT_TRUE(title.find(share_target.device_name) != std::string::npos);
 }
 
-TEST_F(NearbyNotificationManagerTest, ShowFailure_ShowsNotification) {
+TEST_P(NearbyNotificationManagerTest, ShowFailure_ShowsNotification) {
   manager()->ShowFailure(ShareTarget(), TransferMetadataBuilder().build());
 
   std::vector<message_center::Notification> notifications =
@@ -875,7 +902,7 @@
   EXPECT_EQ(0u, notification.buttons().size());
 }
 
-TEST_F(NearbyNotificationManagerTest, ShowFailure_DeviceNameEncoding) {
+TEST_P(NearbyNotificationManagerTest, ShowFailure_DeviceNameEncoding) {
   ShareTarget share_target;
   share_target.device_name = u8"\xf0\x9f\x8c\xb5";  // Cactus emoji.
 
@@ -886,7 +913,7 @@
   EXPECT_TRUE(title.find(share_target.device_name) != std::string::npos);
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        CloseTransfer_ClosesProgressNotification) {
   manager()->ShowProgress(ShareTarget(), TransferMetadataBuilder().build());
   ASSERT_EQ(1u, GetDisplayedNotifications().size());
@@ -895,7 +922,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        CloseTransfer_ClosesConnectionNotification) {
   manager()->ShowConnectionRequest(ShareTarget(),
                                    TransferMetadataBuilder().build());
@@ -905,7 +932,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        CloseProgressNotification_NoopWithoutNotification) {
   ASSERT_EQ(0u, GetDisplayedNotifications().size());
 
@@ -913,7 +940,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        CloseProgressNotification_KeepsNearbyDeviceTryingToShareNotification) {
   manager()->ShowNearbyDeviceTryingToShare();
 
@@ -921,7 +948,7 @@
   EXPECT_EQ(1u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest, ProgressNotification_Cancel) {
+TEST_P(NearbyNotificationManagerTest, ProgressNotification_Cancel) {
   ShareTarget share_target;
   share_target.is_incoming = true;
   TransferMetadata transfer_metadata =
@@ -951,7 +978,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest, ProgressNotification_Close) {
+TEST_P(NearbyNotificationManagerTest, ProgressNotification_Close) {
   ShareTarget share_target;
   share_target.is_incoming = true;
   TransferMetadata transfer_metadata =
@@ -976,7 +1003,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest, ProgressNotification_Cancelled) {
+TEST_P(NearbyNotificationManagerTest, ProgressNotification_Cancelled) {
   ShareTarget share_target;
   share_target.is_incoming = true;
   TransferMetadata transfer_metadata =
@@ -1000,7 +1027,7 @@
   EXPECT_EQ(1u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest, ConnectionRequest_Accept) {
+TEST_P(NearbyNotificationManagerTest, ConnectionRequest_Accept) {
   ShareTarget share_target;
   share_target.is_incoming = true;
   TransferMetadata transfer_metadata =
@@ -1030,7 +1057,7 @@
   EXPECT_EQ(1u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest, ConnectionRequest_Reject_Local) {
+TEST_P(NearbyNotificationManagerTest, ConnectionRequest_Reject_Local) {
   ShareTarget share_target;
   share_target.is_incoming = true;
   TransferMetadata transfer_metadata =
@@ -1060,7 +1087,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest, ProgressNotification_Reject_Remote) {
+TEST_P(NearbyNotificationManagerTest, ProgressNotification_Reject_Remote) {
   ShareTarget share_target;
   share_target.is_incoming = true;
   TransferMetadata transfer_metadata =
@@ -1090,7 +1117,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest, ConnectionRequest_Close) {
+TEST_P(NearbyNotificationManagerTest, ConnectionRequest_Close) {
   ShareTarget share_target;
   share_target.is_incoming = true;
   TransferMetadata transfer_metadata =
@@ -1115,7 +1142,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest, NearbyDeviceTryingToShare_Click) {
+TEST_P(NearbyNotificationManagerTest, NearbyDeviceTryingToShare_Click) {
   manager()->ShowNearbyDeviceTryingToShare();
   std::vector<message_center::Notification> notifications =
       GetDisplayedNotifications();
@@ -1130,7 +1157,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        NearbyDeviceTryingToShare_OnClose_DismissTimeout) {
   // First notification should be shown by default.
   manager()->ShowNearbyDeviceTryingToShare();
@@ -1154,7 +1181,7 @@
   EXPECT_EQ(1u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        NearbyDeviceTryingToShare_OnDismissClicked_DismissTimeout) {
   // First notification should be shown by default.
   manager()->ShowNearbyDeviceTryingToShare();
@@ -1179,7 +1206,7 @@
   EXPECT_EQ(1u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        SuccessNotificationClicked_SingleImageReceived_OpenDownloads) {
   base::RunLoop run_loop;
   manager()->SetOnSuccessClickedForTesting(base::BindLambdaForTesting(
@@ -1226,7 +1253,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        SuccessNotificationClicked_SingleImageReceived_CopyToClipboard) {
   base::RunLoop run_loop;
   manager()->SetOnSuccessClickedForTesting(base::BindLambdaForTesting(
@@ -1277,7 +1304,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        SuccessNotificationClicked_MultipleImagesReceived) {
   base::RunLoop run_loop;
   manager()->SetOnSuccessClickedForTesting(base::BindLambdaForTesting(
@@ -1315,7 +1342,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest, SuccessNotificationClicked_TextReceived) {
+TEST_P(NearbyNotificationManagerTest, SuccessNotificationClicked_TextReceived) {
   base::RunLoop run_loop;
   manager()->SetOnSuccessClickedForTesting(base::BindLambdaForTesting(
       [&](NearbyNotificationManager::SuccessNotificationAction action) {
@@ -1351,7 +1378,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest, SuccessNotificationClicked_UrlReceived) {
+TEST_P(NearbyNotificationManagerTest, SuccessNotificationClicked_UrlReceived) {
   base::RunLoop run_loop;
   manager()->SetOnSuccessClickedForTesting(base::BindLambdaForTesting(
       [&](NearbyNotificationManager::SuccessNotificationAction action) {
@@ -1386,7 +1413,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        SuccessNotificationClicked_SingleFileReceived) {
   base::RunLoop run_loop;
   manager()->SetOnSuccessClickedForTesting(base::BindLambdaForTesting(
@@ -1422,7 +1449,7 @@
   EXPECT_EQ(0u, GetDisplayedNotifications().size());
 }
 
-TEST_F(NearbyNotificationManagerTest,
+TEST_P(NearbyNotificationManagerTest,
        SuccessNotificationClicked_MultipleFilesReceived) {
   base::RunLoop run_loop;
   manager()->SetOnSuccessClickedForTesting(base::BindLambdaForTesting(
@@ -1553,3 +1580,34 @@
 
   EXPECT_TRUE(holding_space_model->items().empty());
 }
+
+TEST_P(NearbyNotificationManagerTest, ShowMultipleNotifications) {
+  if (!is_self_share_enabled_)
+    return;
+
+  // Show two of each type of completion notification and ensure all are
+  // displayed. We also show a progress notification to ensure it doesn't
+  // interfere with the others.
+  ShareTarget share_target_a;
+  manager()->ShowSuccess(share_target_a);
+  manager()->ShowSuccess(ShareTarget());
+  manager()->ShowFailure(ShareTarget(), TransferMetadataBuilder().build());
+  manager()->ShowFailure(ShareTarget(), TransferMetadataBuilder().build());
+  manager()->ShowCancelled(ShareTarget());
+  manager()->ShowCancelled(ShareTarget());
+  manager()->ShowProgress(ShareTarget(), TransferMetadataBuilder().build());
+
+  std::vector<message_center::Notification> notifications =
+      GetDisplayedNotifications();
+  ASSERT_EQ(7u, notifications.size());
+
+  // Make sure we can close an individual one.
+  manager()->CloseSuccessNotification("chrome://nearby_share/result/" +
+                                      share_target_a.id.ToString());
+  notifications = GetDisplayedNotifications();
+  ASSERT_EQ(6u, notifications.size());
+}
+
+INSTANTIATE_TEST_SUITE_P(NearbyNotificationManagerTest,
+                         NearbyNotificationManagerTest,
+                         testing::Bool());
diff --git a/chrome/browser/optimization_guide/chrome_hints_manager_unittest.cc b/chrome/browser/optimization_guide/chrome_hints_manager_unittest.cc
index 591dcaa..92b22cf 100644
--- a/chrome/browser/optimization_guide/chrome_hints_manager_unittest.cc
+++ b/chrome/browser/optimization_guide/chrome_hints_manager_unittest.cc
@@ -11,7 +11,6 @@
 #include "chrome/browser/optimization_guide/optimization_guide_tab_url_provider.h"
 #include "chrome/browser/optimization_guide/optimization_guide_web_contents_observer.h"
 #include "chrome/test/base/testing_profile.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
 #include "components/optimization_guide/content/browser/optimization_guide_decider.h"
 #include "components/optimization_guide/core/hints_fetcher.h"
 #include "components/optimization_guide/core/optimization_guide_features.h"
@@ -88,8 +87,6 @@
     pref_service_ =
         std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
     optimization_guide::prefs::RegisterProfilePrefs(pref_service_->registry());
-    pref_service_->registry()->RegisterBooleanPref(
-        data_reduction_proxy::prefs::kDataSaverEnabled, false);
     unified_consent::UnifiedConsentService::RegisterPrefs(
         pref_service_->registry());
 
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc b/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
index 6398d9fa..b866e248 100644
--- a/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
@@ -25,7 +25,6 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
 #include "components/metrics/content/subprocess_metrics_provider.h"
 #include "components/optimization_guide/core/optimization_guide_constants.h"
 #include "components/optimization_guide/core/optimization_guide_features.h"
diff --git a/chrome/browser/page_load_metrics/integration_tests/data/full_size_image.html b/chrome/browser/page_load_metrics/integration_tests/data/full_size_image.html
index 71db767..6738545c 100644
--- a/chrome/browser/page_load_metrics/integration_tests/data/full_size_image.html
+++ b/chrome/browser/page_load_metrics/integration_tests/data/full_size_image.html
@@ -1,14 +1,13 @@
-<iframe width="96" height="96" src="iframe_with_image.html"></iframe>
 <script>
   const lcpPromise = new Promise(resolve => {
     window.addEventListener("message", event => {
       iframeLCP = event.data.startTime;
       timeOriginDelta = event.data.timeOrigin - performance.timeOrigin;
-      lcpTime = iframeLCP + timeOriginDelta;
-      resolve();
+      resolve(iframeLCP + timeOriginDelta);
     });
   });
   async function waitForLCP() {
-    await lcpPromise;
+    return lcpPromise;
   }
 </script>
+<iframe width="96" height="96" src="iframe_with_image.html"></iframe>
diff --git a/chrome/browser/page_load_metrics/integration_tests/data/iframe_with_image.html b/chrome/browser/page_load_metrics/integration_tests/data/iframe_with_image.html
index fa995b323..61a1660 100644
--- a/chrome/browser/page_load_metrics/integration_tests/data/iframe_with_image.html
+++ b/chrome/browser/page_load_metrics/integration_tests/data/iframe_with_image.html
@@ -3,10 +3,14 @@
     margin: 0;
   }
 </style>
-<img src="images/blue96x96.png" />
+<img src="/images/blue96x96.png" />
 <script>
   new PerformanceObserver(e => {
-    const entries = e.getEntries();
+    // We only care about entry with url, i.e. for images, not any spurrious
+    // text entry.
+    const entries = e.getEntries().filter(e => e.url != '');
+    if (entries.length === 0)
+      return;
     const entry = entries[entries.length - 1];
     window.parent.postMessage({
       startTime: entry.startTime, timeOrigin: performance.timeOrigin
diff --git a/chrome/browser/page_load_metrics/integration_tests/largest_contentful_paint_browsertest.cc b/chrome/browser/page_load_metrics/integration_tests/largest_contentful_paint_browsertest.cc
index 3c5d458..29c7d9a 100644
--- a/chrome/browser/page_load_metrics/integration_tests/largest_contentful_paint_browsertest.cc
+++ b/chrome/browser/page_load_metrics/integration_tests/largest_contentful_paint_browsertest.cc
@@ -173,12 +173,11 @@
   base::test::ScopedFeatureList feature_list_;
 };
 
-IN_PROC_BROWSER_TEST_F(PageViewportInLCPTest, DISABLED_FullSizeImageInIframe) {
+IN_PROC_BROWSER_TEST_F(PageViewportInLCPTest, FullSizeImageInIframe) {
   Start();
   StartTracing({"loading"});
   Load("/full_size_image.html");
-  content::EvalJsResult result = EvalJs(web_contents(), "waitForLCP()");
-  double lcpTime = EvalJs(web_contents(), "lcpTime").ExtractDouble();
+  double lcpTime = EvalJs(web_contents(), "waitForLCP()").ExtractDouble();
 
   // Navigate away to force metrics recording.
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
diff --git a/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_browsertest.cc
index 3bf9cd9a..6962d6c 100644
--- a/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_browsertest.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/prerender_test_util.h"
diff --git a/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_unittest.cc
index f59702a0..25109a787 100644
--- a/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_unittest.cc
@@ -9,8 +9,6 @@
 #include "base/command_line.h"
 #include "base/memory/raw_ptr.h"
 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
 #include "components/page_load_metrics/browser/page_load_tracker.h"
 #include "components/page_load_metrics/common/page_load_timing.h"
 #include "components/page_load_metrics/common/test/page_load_metrics_test_util.h"
diff --git a/chrome/browser/pdf/DEPS b/chrome/browser/pdf/DEPS
index e7b576a..564718e 100644
--- a/chrome/browser/pdf/DEPS
+++ b/chrome/browser/pdf/DEPS
@@ -1,5 +1,6 @@
 specific_include_rules = {
   "pdf_extension_test\.cc": [
+    "+cc/input/scroll_utils.h",
     "+chrome/browser/ui/views/location_bar/zoom_bubble_view.h",
   ],
   "pdf_find_request_manager_browsertest\.cc": [
diff --git a/chrome/browser/pdf/pdf_extension_test.cc b/chrome/browser/pdf/pdf_extension_test.cc
index 82fe9f4..48f0825 100644
--- a/chrome/browser/pdf/pdf_extension_test.cc
+++ b/chrome/browser/pdf/pdf_extension_test.cc
@@ -39,6 +39,7 @@
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
+#include "cc/input/scroll_utils.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/download/download_prefs.h"
@@ -1633,6 +1634,11 @@
   // //chrome/browser/resources/pdf/viewport.js.
   static constexpr int kScrollIncrement = 40;
 
+  // Scrolling by a fraction of the viewport height may introduce slight
+  // position differences on various platforms due to rounding. Tolerate this
+  // difference.
+  static constexpr float kScrollPositionEpsilon = 2.0f;
+
   static int GetViewportHeight(WebContents* guest_contents) {
     int viewport_height = 0;
     EXPECT_TRUE(content::ExecuteScriptAndExtractInt(
@@ -1661,9 +1667,6 @@
   }
 };
 
-// static
-constexpr int PDFExtensionScrollTest::kScrollIncrement;
-
 IN_PROC_BROWSER_TEST_P(PDFExtensionScrollTest, WithSpace) {
   WebContents* guest_contents = LoadPdfGetGuestContents(
       embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
@@ -1674,6 +1677,11 @@
   const int viewport_height = GetViewportHeight(guest_contents);
   ASSERT_GT(viewport_height, 0);
 
+  // For web content, page down / page up scrolling only scrolls by a fraction
+  // of the viewport height. The PDF Viewer should match that behavior.
+  const float scroll_height =
+      viewport_height * cc::kMinFractionToStepWhenPaging;
+
   // Press Space to scroll down.
   ScrollEventWaiter scroll_waiter(guest_contents);
   content::SimulateKeyPress(guest_contents, ui::DomKey::FromCharacter(' '),
@@ -1681,7 +1689,8 @@
                             /*control=*/false, /*shift=*/false, /*alt=*/false,
                             /*command=*/false);
   ASSERT_NO_FATAL_FAILURE(scroll_waiter.Wait());
-  EXPECT_EQ(viewport_height, GetViewportScrollPositionY(guest_contents));
+  EXPECT_NEAR(scroll_height, GetViewportScrollPositionY(guest_contents),
+              kScrollPositionEpsilon);
 
   // Press Space to scroll down again.
   scroll_waiter.Reset();
@@ -1690,7 +1699,8 @@
                             /*control=*/false, /*shift=*/false, /*alt=*/false,
                             /*command=*/false);
   ASSERT_NO_FATAL_FAILURE(scroll_waiter.Wait());
-  EXPECT_EQ(viewport_height * 2, GetViewportScrollPositionY(guest_contents));
+  EXPECT_NEAR(scroll_height * 2, GetViewportScrollPositionY(guest_contents),
+              kScrollPositionEpsilon);
 
   // Press Shift+Space to scroll up.
   scroll_waiter.Reset();
@@ -1699,7 +1709,8 @@
                             /*control=*/false, /*shift=*/true, /*alt=*/false,
                             /*command=*/false);
   ASSERT_NO_FATAL_FAILURE(scroll_waiter.Wait());
-  EXPECT_EQ(viewport_height, GetViewportScrollPositionY(guest_contents));
+  EXPECT_NEAR(scroll_height, GetViewportScrollPositionY(guest_contents),
+              kScrollPositionEpsilon);
 }
 
 IN_PROC_BROWSER_TEST_P(PDFExtensionScrollTest, WithPageDownUp) {
@@ -1712,6 +1723,11 @@
   const int viewport_height = GetViewportHeight(guest_contents);
   ASSERT_GT(viewport_height, 0);
 
+  // For web content, page down / page up scrolling only scrolls by a fraction
+  // of the viewport height. The PDF Viewer should match that behavior.
+  const float scroll_height =
+      viewport_height * cc::kMinFractionToStepWhenPaging;
+
   // Press PageDown to scroll down.
   ScrollEventWaiter scroll_waiter(guest_contents);
   content::SimulateKeyPressWithoutChar(guest_contents, ui::DomKey::PAGE_DOWN,
@@ -1720,7 +1736,8 @@
                                        /*alt=*/false,
                                        /*command=*/false);
   ASSERT_NO_FATAL_FAILURE(scroll_waiter.Wait());
-  EXPECT_EQ(viewport_height, GetViewportScrollPositionY(guest_contents));
+  EXPECT_NEAR(scroll_height, GetViewportScrollPositionY(guest_contents),
+              kScrollPositionEpsilon);
 
   // Press PageDown to scroll down again.
   scroll_waiter.Reset();
@@ -1730,7 +1747,8 @@
                                        /*alt=*/false,
                                        /*command=*/false);
   ASSERT_NO_FATAL_FAILURE(scroll_waiter.Wait());
-  EXPECT_EQ(viewport_height * 2, GetViewportScrollPositionY(guest_contents));
+  EXPECT_NEAR(scroll_height * 2, GetViewportScrollPositionY(guest_contents),
+              kScrollPositionEpsilon);
 
   // Press PageUp to scroll up.
   scroll_waiter.Reset();
@@ -1739,7 +1757,8 @@
       /*control=*/false, /*shift=*/false, /*alt=*/false,
       /*command=*/false);
   ASSERT_NO_FATAL_FAILURE(scroll_waiter.Wait());
-  EXPECT_EQ(viewport_height, GetViewportScrollPositionY(guest_contents));
+  EXPECT_NEAR(scroll_height, GetViewportScrollPositionY(guest_contents),
+              kScrollPositionEpsilon);
 }
 
 IN_PROC_BROWSER_TEST_P(PDFExtensionScrollTest, WithArrowLeftRight) {
diff --git a/chrome/browser/policy/BUILD.gn b/chrome/browser/policy/BUILD.gn
index d43563d..1b57885 100644
--- a/chrome/browser/policy/BUILD.gn
+++ b/chrome/browser/policy/BUILD.gn
@@ -206,6 +206,7 @@
       "test/task_manager_end_process_enabled_browsertest.cc",
       "test/web_rtc_event_log_collection_allowed_policy_browsertest.cc",
       "test/web_rtc_local_ips_allowed_urls_policy_browsertest.cc",
+      "test/window_placement_policy_browsertest.cc",
     ]
 
     deps += [
diff --git a/chrome/browser/policy/cloud/user_policy_signin_service_browsertest.cc b/chrome/browser/policy/cloud/user_policy_signin_service_browsertest.cc
index d1eaa07e..cae21aa0 100644
--- a/chrome/browser/policy/cloud/user_policy_signin_service_browsertest.cc
+++ b/chrome/browser/policy/cloud/user_policy_signin_service_browsertest.cc
@@ -18,7 +18,7 @@
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/policy/core/common/policy_namespace.h"
@@ -53,23 +53,23 @@
     "test_refresh_token_for_enterprise@example.com";
 
 // Dummy delegate forwarding all the calls the test fixture.
-// Owned by the DiceTurnOnSyncHelper.
-class TestDiceTurnSyncOnHelperDelegate : public DiceTurnSyncOnHelper::Delegate {
+// Owned by the TurnSyncOnHelper.
+class TestTurnSyncOnHelperDelegate : public TurnSyncOnHelper::Delegate {
  public:
-  explicit TestDiceTurnSyncOnHelperDelegate(
+  explicit TestTurnSyncOnHelperDelegate(
       UserPolicySigninServiceTest* test_fixture);
-  ~TestDiceTurnSyncOnHelperDelegate() override;
+  ~TestTurnSyncOnHelperDelegate() override;
 
  private:
-  // DiceTurnSyncOnHelper::Delegate:
+  // TurnSyncOnHelper::Delegate:
   void ShowLoginError(const SigninUIError& error) override;
   void ShowMergeSyncDataConfirmation(
       const std::string& previous_email,
       const std::string& new_email,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) override;
+      TurnSyncOnHelper::SigninChoiceCallback callback) override;
   void ShowEnterpriseAccountConfirmation(
       const AccountInfo& account_info,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) override;
+      TurnSyncOnHelper::SigninChoiceCallback callback) override;
   void ShowSyncConfirmation(
       base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
           callback) override;
@@ -106,7 +106,7 @@
 
   ~UserPolicySigninServiceTest() override {
     // Ensure that no helper leaked.
-    DCHECK_EQ(dice_helper_created_count_, dice_helper_deleted_count_);
+    DCHECK_EQ(helper_created_count_, helper_created_count_);
   }
 
   Profile* profile() { return browser()->profile(); }
@@ -117,16 +117,16 @@
     return profile()->GetProfilePolicyConnector()->policy_service();
   }
 
-  DiceTurnSyncOnHelper* CreateDiceTurnOnSyncHelper() {
-    // DiceTurnSyncOnHelper deletes itself. At the end of the test, there is a
-    // check that these objects did not leak.
-    ++dice_helper_created_count_;
-    return new DiceTurnSyncOnHelper(
+  TurnSyncOnHelper* CreateTurnSyncOnHelper() {
+    // TurnSyncOnHelper deletes itself. At the end of the test, there is a check
+    // that these objects did not leak.
+    ++helper_created_count_;
+    return new TurnSyncOnHelper(
         profile(), signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_MANAGER,
         signin_metrics::PromoAction::PROMO_ACTION_WITH_DEFAULT,
         signin_metrics::Reason::kReauthentication, account_info_.account_id,
-        DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT,
-        std::make_unique<TestDiceTurnSyncOnHelperDelegate>(this),
+        TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT,
+        std::make_unique<TestTurnSyncOnHelperDelegate>(this),
         base::DoNothing());
   }
 
@@ -151,11 +151,11 @@
     std::move(sync_confirmation_callback_).Run(confirmation_result);
   }
 
-  // DiceTurnSyncOnHelperDelegate calls:
+  // TurnSyncOnHelperDelegate calls:
   void OnShowEnterpriseAccountConfirmation(
       const AccountInfo& account_info,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) {
-    std::move(callback).Run(DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
+      TurnSyncOnHelper::SigninChoiceCallback callback) {
+    std::move(callback).Run(TurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
   }
 
   void OnShowSyncConfirmation(
@@ -174,7 +174,7 @@
       std::move(sync_confirmation_shown_closure_).Run();
   }
 
-  void OnDiceTurnSyncOnHelperDeleted() { ++dice_helper_deleted_count_; }
+  void OnTurnSyncOnHelperDeleted() { ++helper_deleted_count_; }
 
   void set_policy_hanging(bool hanging) { policy_hanging_ = hanging; }
 
@@ -298,55 +298,54 @@
   base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
       sync_confirmation_callback_;
   bool policy_hanging_ = false;
-  int dice_helper_created_count_ = 0;
-  int dice_helper_deleted_count_ = 0;
+  int helper_created_count_ = 0;
+  int helper_deleted_count_ = 0;
 };
 
-TestDiceTurnSyncOnHelperDelegate::TestDiceTurnSyncOnHelperDelegate(
+TestTurnSyncOnHelperDelegate::TestTurnSyncOnHelperDelegate(
     UserPolicySigninServiceTest* test_fixture)
     : test_fixture_(test_fixture) {}
 
-TestDiceTurnSyncOnHelperDelegate::~TestDiceTurnSyncOnHelperDelegate() {
-  test_fixture_->OnDiceTurnSyncOnHelperDeleted();
+TestTurnSyncOnHelperDelegate::~TestTurnSyncOnHelperDelegate() {
+  test_fixture_->OnTurnSyncOnHelperDeleted();
 }
 
-void TestDiceTurnSyncOnHelperDelegate::ShowLoginError(
-    const SigninUIError& error) {
+void TestTurnSyncOnHelperDelegate::ShowLoginError(const SigninUIError& error) {
   NOTREACHED();
 }
 
-void TestDiceTurnSyncOnHelperDelegate::ShowMergeSyncDataConfirmation(
+void TestTurnSyncOnHelperDelegate::ShowMergeSyncDataConfirmation(
     const std::string& previous_email,
     const std::string& new_email,
-    DiceTurnSyncOnHelper::SigninChoiceCallback callback) {
+    TurnSyncOnHelper::SigninChoiceCallback callback) {
   NOTREACHED();
 }
 
-void TestDiceTurnSyncOnHelperDelegate::ShowEnterpriseAccountConfirmation(
+void TestTurnSyncOnHelperDelegate::ShowEnterpriseAccountConfirmation(
     const AccountInfo& account_info,
-    DiceTurnSyncOnHelper::SigninChoiceCallback callback) {
+    TurnSyncOnHelper::SigninChoiceCallback callback) {
   test_fixture_->OnShowEnterpriseAccountConfirmation(account_info,
                                                      std::move(callback));
 }
 
-void TestDiceTurnSyncOnHelperDelegate::ShowSyncConfirmation(
+void TestTurnSyncOnHelperDelegate::ShowSyncConfirmation(
     base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
         callback) {
   test_fixture_->OnShowSyncConfirmation(std::move(callback));
 }
 
-void TestDiceTurnSyncOnHelperDelegate::ShowSyncDisabledConfirmation(
+void TestTurnSyncOnHelperDelegate::ShowSyncDisabledConfirmation(
     bool is_managed_account,
     base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
         callback) {
   test_fixture_->OnShowSyncDisabledConfirmation(std::move(callback));
 }
 
-void TestDiceTurnSyncOnHelperDelegate::ShowSyncSettings() {
+void TestTurnSyncOnHelperDelegate::ShowSyncSettings() {
   NOTREACHED();
 }
 
-void TestDiceTurnSyncOnHelperDelegate::SwitchToProfile(Profile* new_profile) {
+void TestTurnSyncOnHelperDelegate::SwitchToProfile(Profile* new_profile) {
   NOTREACHED();
 }
 
@@ -354,7 +353,7 @@
   EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(prefs::kShowHomeButton));
 
   // Signin and show sync confirmation dialog.
-  CreateDiceTurnOnSyncHelper();
+  CreateTurnSyncOnHelper();
   WaitForSyncConfirmation();
 
   // Policies are applied even before the user confirms.
@@ -374,7 +373,7 @@
   EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(prefs::kShowHomeButton));
 
   // Signin and show sync confirmation dialog.
-  CreateDiceTurnOnSyncHelper();
+  CreateTurnSyncOnHelper();
   WaitForSyncConfirmation();
 
   // Policies are applied even before the user confirms.
@@ -398,7 +397,7 @@
   EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(prefs::kShowHomeButton));
 
   set_policy_hanging(true);
-  CreateDiceTurnOnSyncHelper();
+  CreateTurnSyncOnHelper();
   WaitForPolicyHanging();
 
   // User is not signed in, policy is not applied.
@@ -408,7 +407,7 @@
   EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(prefs::kShowHomeButton));
 
   // Restart a new signin flow and allow it to complete.
-  CreateDiceTurnOnSyncHelper();
+  CreateTurnSyncOnHelper();
   set_policy_hanging(false);
   WaitForSyncConfirmation();
 
@@ -434,11 +433,11 @@
 #endif
 IN_PROC_BROWSER_TEST_F(UserPolicySigninServiceTest,
                        MAYBE_AcceptManagementDeclineSync) {
-  DiceTurnSyncOnHelper::SetShowSyncEnabledUiForTesting(true);
+  TurnSyncOnHelper::SetShowSyncEnabledUiForTesting(true);
   EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(prefs::kShowHomeButton));
 
   // Signin and show sync confirmation dialog.
-  CreateDiceTurnOnSyncHelper();
+  CreateTurnSyncOnHelper();
   WaitForSyncConfirmation();
 
   // Policies are applied even before the user confirms.
@@ -475,5 +474,5 @@
   EXPECT_FALSE(
       chrome::enterprise_util::UserAcceptedAccountManagement(profile()));
   EXPECT_FALSE(chrome::enterprise_util::ProfileCanBeManaged(profile()));
-  DiceTurnSyncOnHelper::SetShowSyncEnabledUiForTesting(false);
+  TurnSyncOnHelper::SetShowSyncEnabledUiForTesting(false);
 }
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index c7370acd..07e195f 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -65,7 +65,6 @@
 #include "components/content_settings/core/browser/insecure_private_network_policy_handler.h"
 #include "components/content_settings/core/common/pref_names.h"
 #include "components/custom_handlers/pref_names.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
 #include "components/embedder_support/pref_names.h"
 #include "components/enterprise/browser/reporting/cloud_profile_reporting_policy_handler.h"
 #include "components/enterprise/browser/reporting/cloud_reporting_policy_handler.h"
@@ -715,9 +714,6 @@
     base::Value::Type::LIST },
 
 #if BUILDFLAG(IS_ANDROID)
-  { key::kDataCompressionProxyEnabled,
-    data_reduction_proxy::prefs::kDataSaverEnabled,
-    base::Value::Type::BOOLEAN },
   { key::kAuthAndroidNegotiateAccountType,
     prefs::kAuthAndroidNegotiateAccountType,
     base::Value::Type::STRING },
@@ -1596,6 +1592,9 @@
   { key::kForceMajorVersionToMinorPositionInUserAgent,
     prefs::kForceMajorVersionToMinorPositionInUserAgent,
     base::Value::Type::INTEGER},
+  { key::kWindowPlacementAlwaysAllowed,
+    policy_prefs::kWindowPlacementAlwaysAllowed,
+    base::Value::Type::BOOLEAN },
 };
 // clang-format on
 
diff --git a/chrome/browser/policy/test/window_placement_policy_browsertest.cc b/chrome/browser/policy/test/window_placement_policy_browsertest.cc
new file mode 100644
index 0000000..8d17345
--- /dev/null
+++ b/chrome/browser/policy/test/window_placement_policy_browsertest.cc
@@ -0,0 +1,59 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/values.h"
+#include "chrome/browser/policy/policy_test_utils.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "components/policy/core/common/policy_map.h"
+#include "components/policy/core/common/policy_pref_names.h"
+#include "components/policy/core/common/policy_types.h"
+#include "components/policy/policy_constants.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace policy {
+
+class PolicyTestWindowPlacement : public PolicyTest {
+  void SetUpInProcessBrowserTestFixture() override {
+    PolicyTest::SetUpInProcessBrowserTestFixture();
+    PolicyMap policies;
+    SetPolicy(&policies, policy::key::kWindowPlacementAlwaysAllowed,
+              base::Value(true));
+    provider_.UpdateChromePolicy(policies);
+  }
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+        switches::kEnableBlinkFeatures, "WindowPlacement");
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(PolicyTestWindowPlacement, CheckWindowPlacementAllowed) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  const GURL url(embedded_test_server()->GetURL("/empty.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+  auto* tab = browser()->tab_strip_model()->GetActiveWebContents();
+
+  constexpr char kScript[] = R"(
+    (async () => {
+      try {
+        const screenDetails = await self.getScreenDetails();
+        return true;
+      } catch (e) {
+        console.error(e);
+        return false;
+      }
+    })();
+  )";
+  EXPECT_EQ(true,
+            EvalJs(tab, kScript, content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+}
+
+}  // namespace policy
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
index 02c3652..1aff78d 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
@@ -24,8 +24,6 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/history/history_test_utils.h"
 #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h"
@@ -57,8 +55,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
@@ -537,12 +533,6 @@
                            "SpeculationRulesPrefetchProxy");
   }
 
-  void SetDataSaverEnabled(bool enabled) {
-    data_reduction_proxy::DataReductionProxySettings::
-        SetDataSaverEnabledForTesting(browser()->profile()->GetPrefs(),
-                                      enabled);
-  }
-
   void ResetFeatureList() { scoped_feature_list_.Reset(); }
 
   content::WebContents* GetWebContents() const {
@@ -1019,8 +1009,6 @@
 IN_PROC_BROWSER_TEST_F(
     PrefetchProxyBrowserTest,
     DISABLE_ON_WIN_MAC_CHROMEOS(ServiceWorkerRegistrationIsNotEligible)) {
-  SetDataSaverEnabled(true);
-
   // Load a page that registers a service worker.
   ASSERT_TRUE(ui_test_utils::NavigateToURL(
       browser(),
@@ -1062,7 +1050,6 @@
 
 IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest,
                        DISABLE_ON_WIN_MAC_CHROMEOS(DRPClientConfigPlumbing)) {
-  SetDataSaverEnabled(true);
   auto client_config = WaitForUpdatedCustomProxyConfig();
   VerifyProxyConfig(std::move(client_config));
 }
@@ -1070,7 +1057,6 @@
 IN_PROC_BROWSER_TEST_F(
     PrefetchProxyBrowserTest,
     DISABLE_ON_WIN_MAC_CHROMEOS(NoAuthChallenges_FromProxy)) {
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1096,7 +1082,6 @@
 
 IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest,
                        DISABLE_ON_WIN_MAC_CHROMEOS(ProxyServerBackOff)) {
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1144,7 +1129,6 @@
 
 IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest,
                        DISABLE_ON_WIN_MAC_CHROMEOS(CookieOnHigherLevelDomain)) {
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1173,7 +1157,6 @@
 
 IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest,
                        DISABLE_ON_WIN_MAC_CHROMEOS(CookieOnOtherPath)) {
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1202,7 +1185,6 @@
 
 IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest,
                        DISABLE_ON_WIN_MAC_CHROMEOS(ExpiredCookie)) {
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1241,7 +1223,6 @@
 IN_PROC_BROWSER_TEST_F(
     PrefetchProxyBrowserTest,
     DISABLE_ON_WIN_MAC_CHROMEOS(CookieOnNonApplicableDomain)) {
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1279,7 +1260,6 @@
 IN_PROC_BROWSER_TEST_F(
     PrefetchProxyBrowserTest,
     DISABLE_ON_WIN_MAC_CHROMEOS(CookiesChangedAfterInitialCheck)) {
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1318,7 +1298,6 @@
 IN_PROC_BROWSER_TEST_F(
     PrefetchProxyBrowserTest,
     DISABLE_ON_WIN_MAC_CHROMEOS(NoAuthChallenges_FromOrigin)) {
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1360,7 +1339,6 @@
   // back/forward cache to ensure that it doesn't get preserved in the cache.
   content::DisableBackForwardCacheForTesting(
       GetWebContents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(),
                                            GetOriginServerURL("/simple.html")));
   WaitForUpdatedCustomProxyConfig();
@@ -1405,7 +1383,6 @@
       "isolated-prerender-unlimited-prefetches");
 
   GURL starting_page = GetOriginServerURL("/simple.html");
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1608,7 +1585,6 @@
       "isolated-prerender-unlimited-prefetches");
 
   GURL starting_page = GetOriginServerURL("/simple.html");
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1685,7 +1661,6 @@
       "isolated-prerender-unlimited-prefetches");
 
   GURL starting_page = GetOriginServerURL("/simple.html");
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1748,7 +1723,6 @@
       "isolated-prerender-unlimited-prefetches");
 
   GURL starting_page = GetOriginServerURL("/simple.html");
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1823,7 +1797,6 @@
       "isolated-prerender-unlimited-prefetches");
 
   GURL starting_page = GetOriginServerURL("/simple.html");
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1899,7 +1872,6 @@
       "isolated-prerender-unlimited-prefetches");
 
   GURL starting_page = GetOriginServerURL("/simple.html");
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
 
@@ -1960,7 +1932,6 @@
     PrefetchProxyBrowserTest,
     DISABLE_ON_WIN_MAC_CHROMEOS(PrefetchingUKM_PrefetchNotStarted)) {
   GURL starting_page = GetOriginServerURL("/simple.html");
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
 
@@ -2042,7 +2013,6 @@
   content::DisableBackForwardCacheForTesting(
       GetWebContents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
   GURL starting_page = GetOriginServerURL("/simple.html");
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
 
@@ -2120,7 +2090,6 @@
       ->set_client_cert_store_factory_for_testing(
           base::BindRepeating(&CreateCertStore));
 
-  SetDataSaverEnabled(true);
   WaitForUpdatedCustomProxyConfig();
 
   // Setup a test server that requires a client cert.
@@ -2188,8 +2157,6 @@
 
 IN_PROC_BROWSER_TEST_F(PrefetchProxyWithDecoyRequestsBrowserTest,
                        DISABLE_ON_WIN_MAC_CHROMEOS(ServiceWorker)) {
-  SetDataSaverEnabled(true);
-
   GURL starting_page =
       GetOriginServerURL("/service_worker/create_service_worker.html");
 
@@ -2282,7 +2249,6 @@
                        DISABLE_ON_WIN_MAC_CHROMEOS(Cookie)) {
   GURL starting_page = GetOriginServerURL("/simple.html");
 
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
 
@@ -2460,7 +2426,6 @@
 IN_PROC_BROWSER_TEST_F(
     SSLReportingPrefetchProxyBrowserTest,
     DISABLE_ON_WIN_MAC_CHROMEOS(NoIntersitialSSLErrorReporting)) {
-  SetDataSaverEnabled(true);
   WaitForUpdatedCustomProxyConfig();
 
   // Setup a test server that requires a client cert.
@@ -2541,7 +2506,6 @@
 IN_PROC_BROWSER_TEST_F(
     DomainReliabilityPrefetchProxyBrowserTest,
     DISABLE_ON_WIN_MAC_CHROMEOS(NoDomainReliabilityUploads)) {
-  SetDataSaverEnabled(true);
   WaitForUpdatedCustomProxyConfig();
 
   net::EmbeddedTestServer https_report_server(
@@ -2647,7 +2611,6 @@
     probing_server.SetConnectionListener(&probe_counter);
     ASSERT_TRUE(probing_server.Start());
 
-    SetDataSaverEnabled(true);
     GURL starting_page = GetOriginServerURL("/simple.html");
     ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
     WaitForUpdatedCustomProxyConfig();
@@ -2952,7 +2915,6 @@
       GetWebContents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
   base::HistogramTester histogram_tester;
 
-  SetDataSaverEnabled(true);
   GURL starting_page = GetOriginServerURL("/simple.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
@@ -3138,7 +3100,6 @@
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
       "isolated-prerender-start-spare-renderer");
 
-  SetDataSaverEnabled(true);
   GURL starting_page = GetOriginServerURL("/simple.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
@@ -3282,7 +3243,6 @@
   content::SetCookie(browser()->profile(),
                      non_eligible_origin.GetURL("b.test", "/"), "cookie=yes");
 
-  SetDataSaverEnabled(true);
   WaitForUpdatedCustomProxyConfig();
 
   PrefetchProxyTabHelper* tab_helper =
@@ -3340,7 +3300,6 @@
       &HandleOriginWithIneligibleSubresources, &non_eligible_origin));
   ASSERT_TRUE(eligible_origin.Start());
 
-  SetDataSaverEnabled(true);
   WaitForUpdatedCustomProxyConfig();
 
   PrefetchProxyTabHelper* tab_helper =
@@ -3388,7 +3347,6 @@
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
       switches::kEnableLowEndDeviceMode);
 
-  SetDataSaverEnabled(true);
   GURL starting_page = GetOriginServerURL("/simple.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
@@ -3432,7 +3390,6 @@
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
       "isolated-prerender-unlimited-prefetches");
 
-  SetDataSaverEnabled(true);
   GURL starting_page = GetOriginServerURL("/simple.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
@@ -3494,7 +3451,6 @@
 
 IN_PROC_BROWSER_TEST_F(PrefetchProxyWithNSPBrowserTest,
                        DISABLE_ON_WIN_MAC_CHROMEOS(NoLinkRelSearch)) {
-  SetDataSaverEnabled(true);
   GURL starting_page = GetOriginServerURL("/simple.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
@@ -3543,7 +3499,6 @@
   base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
       kIsolatedPrerenderLimitNSPSubresourcesCmdLineFlag, "1");
 
-  SetDataSaverEnabled(true);
   GURL starting_page = GetOriginServerURL("/simple.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
@@ -3617,7 +3572,6 @@
 
 IN_PROC_BROWSER_TEST_F(ProbingAndNSPEnabledPrefetchProxyBrowserTest,
                        DISABLE_ON_WIN_MAC_CHROMEOS(ProbeGood_NSPSuccess)) {
-  SetDataSaverEnabled(true);
   GURL starting_page = GetOriginServerURL("/simple.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
@@ -3721,7 +3675,6 @@
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
       switches::kEnableLowEndDeviceMode);
 
-  SetDataSaverEnabled(true);
   GURL starting_page = GetOriginServerURL("/simple.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
@@ -3765,7 +3718,6 @@
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
       "isolated-prerender-unlimited-prefetches");
 
-  SetDataSaverEnabled(true);
   GURL starting_page = GetOriginServerURL("/simple.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
@@ -3831,7 +3783,6 @@
   // back/forward cache to ensure that it doesn't get preserved in the cache.
   content::DisableBackForwardCacheForTesting(
       GetWebContents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
-  SetDataSaverEnabled(true);
   GURL starting_page = GetOriginServerURL("/simple.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
@@ -3961,7 +3912,6 @@
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
       switches::kEnableLowEndDeviceMode);
 
-  SetDataSaverEnabled(true);
   GURL starting_page = GetOriginServerURL("/simple.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
@@ -4012,7 +3962,6 @@
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
       "isolated-prerender-unlimited-prefetches");
 
-  SetDataSaverEnabled(true);
   GURL starting_page = GetOriginServerURL("/simple.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
@@ -4107,7 +4056,6 @@
       GetWebContents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
   base::HistogramTester histogram_tester;
 
-  SetDataSaverEnabled(true);
   WaitForUpdatedCustomProxyConfig();
 
   ui_test_utils::WaitForHistoryToLoad(HistoryServiceFactory::GetForProfile(
@@ -4285,7 +4233,6 @@
 
 IN_PROC_BROWSER_TEST_F(SpeculationPrefetchProxyTest,
                        DISABLE_ON_WIN_MAC_CHROMEOS(ConnectProxyEndtoEnd)) {
-  SetDataSaverEnabled(true);
   WaitForUpdatedCustomProxyConfig();
 
   PrefetchProxyTabHelper* tab_helper =
@@ -4326,7 +4273,6 @@
 
 IN_PROC_BROWSER_TEST_F(SpeculationPrefetchProxyTest,
                        DISABLE_ON_WIN_MAC_CHROMEOS(TwoSpeculations)) {
-  SetDataSaverEnabled(true);
   WaitForUpdatedCustomProxyConfig();
 
   PrefetchProxyTabHelper* tab_helper =
@@ -4406,7 +4352,6 @@
 
 IN_PROC_BROWSER_TEST_F(PrefetchProxyPrerenderBrowserTest,
                        ShouldNotAffectPrefetchProxyTabHelperOnPrerendering) {
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
   WaitForUpdatedCustomProxyConfig();
 
@@ -4470,7 +4415,6 @@
 IN_PROC_BROWSER_TEST_F(
     ZeroCacheTimePrefetchProxyBrowserTest,
     DISABLE_ON_WIN_MAC_CHROMEOS(PrefetchAfterCacheExpiration)) {
-  SetDataSaverEnabled(true);
   GURL starting_page = GetOriginServerURL("/simple.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
@@ -4542,7 +4486,6 @@
   content::DisableBackForwardCacheForTesting(
       GetWebContents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
   GURL starting_page = GetOriginServerURL("/simple.html");
-  SetDataSaverEnabled(true);
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
   WaitForUpdatedCustomProxyConfig();
 
@@ -4644,7 +4587,6 @@
   // back/forward cache to ensure that it doesn't get preserved in the cache.
   content::DisableBackForwardCacheForTesting(
       GetWebContents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
-  SetDataSaverEnabled(true);
 
   GURL starting_page = GetReferringPageServerURL("/search/q=blah");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
@@ -4700,7 +4642,6 @@
   // back/forward cache to ensure that it doesn't get preserved in the cache.
   content::DisableBackForwardCacheForTesting(
       GetWebContents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
-  SetDataSaverEnabled(true);
 
   GURL starting_page = GetReferringPageServerURL("/search/q=blah");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
@@ -4764,7 +4705,6 @@
   // back/forward cache to ensure that it doesn't get preserved in the cache.
   content::DisableBackForwardCacheForTesting(
       GetWebContents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
-  SetDataSaverEnabled(true);
 
   GURL starting_page = GetOriginServerURL("/search/q=blah");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), starting_page));
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 6b4119a..1955cf3 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -96,7 +96,6 @@
 #include "components/certificate_transparency/pref_names.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/custom_handlers/protocol_handler_registry.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h"
 #include "components/dom_distiller/core/distilled_page_prefs.h"
 #include "components/dom_distiller/core/dom_distiller_features.h"
 #include "components/dom_distiller/core/pref_names.h"
@@ -361,7 +360,7 @@
 #include "chrome/browser/ash/system/input_device_settings.h"
 #include "chrome/browser/ash/web_applications/help_app/help_app_notification_controller.h"
 #include "chrome/browser/chromeos/extensions/echo_private_api.h"
-#include "chrome/browser/chromeos/extensions/login_screen/login/login_api.h"
+#include "chrome/browser/chromeos/extensions/login_screen/login/prefs.h"
 #include "chrome/browser/chromeos/printing/cups_printers_manager.h"
 #include "chrome/browser/device_identity/chromeos/device_oauth2_token_store_chromeos.h"
 #include "chrome/browser/extensions/extension_assets_manager_chromeos.h"
@@ -718,6 +717,11 @@
     "data_reduction.this_week_user_traffic_contenttype_downstream_kb";
 const char kLastWeekUserTrafficContentTypeDownstreamKB[] =
     "data_reduction.last_week_user_traffic_contenttype_downstream_kb";
+const char kDataSaverEnabled[] = "spdy_proxy.enabled";
+const char kDataReductionProxyWasEnabledBefore[] =
+    "spdy_proxy.was_enabled_before";
+const char kDataReductionProxyLastEnabledTime[] =
+    "data_reduction.last_enabled_time";
 
 // Register local state used only for migration (clearing or moving to a new
 // key).
@@ -942,6 +946,9 @@
                                    PrefRegistry::LOSSY_PREF);
   registry->RegisterDictionaryPref(kLastWeekUserTrafficContentTypeDownstreamKB,
                                    PrefRegistry::LOSSY_PREF);
+  registry->RegisterBooleanPref(kDataSaverEnabled, false);
+  registry->RegisterBooleanPref(kDataReductionProxyWasEnabledBefore, false);
+  registry->RegisterInt64Pref(kDataReductionProxyLastEnabledTime, 0L);
 }
 
 }  // namespace
@@ -951,7 +958,6 @@
   // prefs en masse. See RegisterProfilePrefs for per-profile prefs. Please
   // keep this list alphabetized.
   browser_shutdown::RegisterPrefs(registry);
-  data_reduction_proxy::RegisterPrefs(registry);
   BrowserProcessImpl::RegisterPrefs(registry);
   ChromeContentBrowserClient::RegisterLocalStatePrefs(registry);
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
@@ -1837,6 +1843,9 @@
   profile_prefs->ClearPref(kLastWeekServicesDownstreamForegroundKB);
   profile_prefs->ClearPref(kThisWeekUserTrafficContentTypeDownstreamKB);
   profile_prefs->ClearPref(kLastWeekUserTrafficContentTypeDownstreamKB);
+  profile_prefs->ClearPref(kDataSaverEnabled);
+  profile_prefs->ClearPref(kDataReductionProxyWasEnabledBefore);
+  profile_prefs->ClearPref(kDataReductionProxyLastEnabledTime);
 
   // Added 01/2022.
   invalidation::InvalidatorRegistrarWithMemory::
diff --git a/chrome/browser/prefs/chrome_command_line_pref_store.cc b/chrome/browser/prefs/chrome_command_line_pref_store.cc
index d82f30cc..983c79e5 100644
--- a/chrome/browser/prefs/chrome_command_line_pref_store.cc
+++ b/chrome/browser/prefs/chrome_command_line_pref_store.cc
@@ -26,8 +26,6 @@
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "components/browser_sync/browser_sync_switches.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/proxy_config/proxy_config_dictionary.h"
 #include "components/proxy_config/proxy_config_pref_names.h"
diff --git a/chrome/browser/privacy_sandbox/android/BUILD.gn b/chrome/browser/privacy_sandbox/android/BUILD.gn
index d617e79..1e28e548 100644
--- a/chrome/browser/privacy_sandbox/android/BUILD.gn
+++ b/chrome/browser/privacy_sandbox/android/BUILD.gn
@@ -36,6 +36,7 @@
     "//third_party/androidx:androidx_core_core_java",
     "//third_party/androidx:androidx_fragment_fragment_java",
     "//third_party/androidx:androidx_preference_preference_java",
+    "//third_party/androidx:androidx_recyclerview_recyclerview_java",
     "//third_party/androidx:androidx_vectordrawable_vectordrawable_java",
     "//ui/android:ui_full_java",
   ]
diff --git a/chrome/browser/privacy_sandbox/android/java/res/xml/ad_personalization_preference.xml b/chrome/browser/privacy_sandbox/android/java/res/xml/ad_personalization_preference.xml
index 2fd7549..9a7bf0c 100644
--- a/chrome/browser/privacy_sandbox/android/java/res/xml/ad_personalization_preference.xml
+++ b/chrome/browser/privacy_sandbox/android/java/res/xml/ad_personalization_preference.xml
@@ -16,6 +16,11 @@
         android:title="@string/privacy_sandbox_topic_interests_category" />
 
     <Preference
+        android:key="empty_topics"
+        android:summary="@string/privacy_sandbox_topic_empty_state" />
+
+    <Preference
+        android:key="removed_topics"
         android:title="@string/privacy_sandbox_remove_interest_title"
         android:fragment="org.chromium.chrome.browser.privacy_sandbox.AdPersonalizationRemovedFragment"/>
 
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/AdPersonalizationFragment.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/AdPersonalizationFragment.java
index 566a21f..fbb9a8c 100644
--- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/AdPersonalizationFragment.java
+++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/AdPersonalizationFragment.java
@@ -5,8 +5,12 @@
 package org.chromium.chrome.browser.privacy_sandbox;
 
 import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceFragmentCompat;
@@ -22,8 +26,12 @@
 public class AdPersonalizationFragment
         extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener {
     private static final String TOPICS_CATEGORY_PREFERENCE = "topic_interests";
+    private static final String EMPTY_TOPICS_PREFERENCE = "empty_topics";
+    private static final String REMOVE_TOPICS_PREFERENCE = "removed_topics";
 
     private PreferenceCategory mTopicsCategory;
+    private Preference mEmptyTopicsPreference;
+    private Preference mRemoveTopicsPreference;
 
     /**
      * Initializes all the objects related to the preferences page.
@@ -35,8 +43,32 @@
         SettingsUtils.addPreferencesFromResource(this, R.xml.ad_personalization_preference);
         mTopicsCategory = findPreference(TOPICS_CATEGORY_PREFERENCE);
         assert mTopicsCategory != null;
+        mEmptyTopicsPreference = findPreference(EMPTY_TOPICS_PREFERENCE);
+        assert mEmptyTopicsPreference != null;
+        mRemoveTopicsPreference = findPreference(REMOVE_TOPICS_PREFERENCE);
+        assert mRemoveTopicsPreference != null;
+    }
 
-        for (String interest : getCurrentTopics()) {
+    @Override
+    public void onResume() {
+        updatePreferences();
+        super.onResume();
+    }
+
+    @NonNull
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+            @Nullable Bundle savedInstanceState) {
+        View view = super.onCreateView(inflater, container, savedInstanceState);
+        getListView().setItemAnimator(null);
+        return view;
+    }
+
+    private void updatePreferences() {
+        List<String> currentTopics = PrivacySandboxBridge.getCurrentTopTopics();
+        List<String> blockedTopics = PrivacySandboxBridge.getBlockedTopics();
+        mTopicsCategory.removeAll();
+        for (String interest : currentTopics) {
             ImageButtonPreference interestPreference = new ImageButtonPreference(getContext());
             interestPreference.setTitle(interest);
             interestPreference.setImage(R.drawable.btn_close,
@@ -45,10 +77,9 @@
             interestPreference.setOnPreferenceClickListener(this);
             mTopicsCategory.addPreference(interestPreference);
         }
-    }
-
-    private List<String> getCurrentTopics() {
-        return PrivacySandboxBridge.getCurrentTopTopics();
+        boolean hasAnyTopics = !currentTopics.isEmpty() || !blockedTopics.isEmpty();
+        mRemoveTopicsPreference.setVisible(hasAnyTopics);
+        mEmptyTopicsPreference.setVisible(!hasAnyTopics);
     }
 
     private void blockTopic(String topic) {
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/AdPersonalizationRemovedFragment.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/AdPersonalizationRemovedFragment.java
index df17833..79f45d0 100644
--- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/AdPersonalizationRemovedFragment.java
+++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/AdPersonalizationRemovedFragment.java
@@ -5,8 +5,12 @@
 package org.chromium.chrome.browser.privacy_sandbox;
 
 import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceFragmentCompat;
@@ -47,6 +51,15 @@
         }
     }
 
+    @NonNull
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+            @Nullable Bundle savedInstanceState) {
+        View view = super.onCreateView(inflater, container, savedInstanceState);
+        getListView().setItemAnimator(null);
+        return view;
+    }
+
     private List<String> getBlockedTopics() {
         return PrivacySandboxBridge.getBlockedTopics();
     }
diff --git a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSettingsFragmentV3Test.java b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSettingsFragmentV3Test.java
index acf490e..221c80d 100644
--- a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSettingsFragmentV3Test.java
+++ b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSettingsFragmentV3Test.java
@@ -6,7 +6,10 @@
 
 import static androidx.test.espresso.Espresso.onView;
 import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
 import static androidx.test.espresso.matcher.ViewMatchers.hasSibling;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
 import static androidx.test.espresso.matcher.ViewMatchers.withChild;
 import static androidx.test.espresso.matcher.ViewMatchers.withId;
 import static androidx.test.espresso.matcher.ViewMatchers.withParent;
@@ -96,6 +99,12 @@
         return view[0];
     }
 
+    private void clickImageButtonNextToText(String text) {
+        // Click on the image_button of the preference with |text|.
+        onView(allOf(withId(R.id.image_button), withParent(hasSibling(withChild(withText(text))))))
+                .perform(click());
+    }
+
     @Test
     @SmallTest
     @Feature({"RenderTest"})
@@ -119,7 +128,6 @@
     @Test
     @SmallTest
     @Feature({"RenderTest"})
-    @Features.EnableFeatures(ChromeFeatureList.PRIVACY_SANDBOX_SETTINGS_3)
     public void testRenderRemovedInterestsView() throws IOException {
         openPrivacySandboxSettings();
         onView(withText(R.string.privacy_sandbox_ad_personalization_title)).perform(click());
@@ -130,7 +138,6 @@
 
     @Test
     @SmallTest
-    @Features.EnableFeatures(ChromeFeatureList.PRIVACY_SANDBOX_SETTINGS_3)
     public void testMainSettingsView() throws IOException {
         openPrivacySandboxSettings();
         assertTrue(PrivacySandboxBridge.isPrivacySandboxEnabled());
@@ -143,28 +150,36 @@
 
     @Test
     @SmallTest
-    @Features.EnableFeatures(ChromeFeatureList.PRIVACY_SANDBOX_SETTINGS_3)
     public void testAdPersonalizationView() throws IOException {
         openPrivacySandboxSettings();
         onView(withText(R.string.privacy_sandbox_ad_personalization_title)).perform(click());
-        // Click on the image_button of a the preference with "Foo" text.
-        onView(allOf(withId(R.id.image_button), withParent(hasSibling(withChild(withText("Foo"))))))
-                .perform(click());
+        onView(withText(R.string.privacy_sandbox_remove_interest_title))
+                .check(matches(isDisplayed()));
+        onView(withText(R.string.privacy_sandbox_topic_empty_state)).check(doesNotExist());
+        clickImageButtonNextToText("Foo");
         assertThat(PrivacySandboxBridge.getCurrentTopTopics(), not(hasItem("Foo")));
         assertThat(PrivacySandboxBridge.getBlockedTopics(), hasItem("Foo"));
     }
 
     @Test
     @SmallTest
-    @Features.EnableFeatures(ChromeFeatureList.PRIVACY_SANDBOX_SETTINGS_3)
+    public void testAdPersonalizationEmptyView() throws IOException {
+        // Set no current or blocked topics.
+        mFakePrivacySandboxBridge.setCurrentTopTopics();
+        mFakePrivacySandboxBridge.setBlockedTopics();
+        openPrivacySandboxSettings();
+        onView(withText(R.string.privacy_sandbox_ad_personalization_title)).perform(click());
+        onView(withText(R.string.privacy_sandbox_remove_interest_title)).check(doesNotExist());
+        onView(withText(R.string.privacy_sandbox_topic_empty_state)).check(matches(isDisplayed()));
+    }
+
+    @Test
+    @SmallTest
     public void testRemovedInterestsView() throws IOException {
         openPrivacySandboxSettings();
         onView(withText(R.string.privacy_sandbox_ad_personalization_title)).perform(click());
         onView(withText(R.string.privacy_sandbox_remove_interest_title)).perform(click());
-        // Click on the image_button of a the preference with "BlockedFoo" text.
-        onView(allOf(withId(R.id.image_button),
-                       withParent(hasSibling(withChild(withText("BlockedFoo"))))))
-                .perform(click());
+        clickImageButtonNextToText("BlockedFoo");
         assertThat(PrivacySandboxBridge.getCurrentTopTopics(), hasItem("BlockedFoo"));
         assertThat(PrivacySandboxBridge.getBlockedTopics(), not(hasItem("BlockedFoo")));
     }
diff --git a/chrome/browser/privacy_sandbox/android/privacy_sandbox_bridge.cc b/chrome/browser/privacy_sandbox/android/privacy_sandbox_bridge.cc
index b08cd2d..7d6cff2 100644
--- a/chrome/browser/privacy_sandbox/android/privacy_sandbox_bridge.cc
+++ b/chrome/browser/privacy_sandbox/android/privacy_sandbox_bridge.cc
@@ -4,6 +4,7 @@
 
 #include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
+#include "base/no_destructor.h"
 #include "base/time/time.h"
 #include "chrome/browser/privacy_sandbox/android/jni_headers/PrivacySandboxBridge_jni.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h"
@@ -15,6 +16,20 @@
 using base::android::ConvertUTF16ToJavaString;
 using base::android::ScopedJavaLocalRef;
 
+namespace {
+// TODO(crbug.com/1286276): Remove this fake implementation and call
+// PrivacySandboxService.
+std::set<std::string>* GetCurrentTopics() {
+  static base::NoDestructor<std::set<std::string>> current_topics(
+      {"Generated sample data", "More made up data"});
+  return current_topics.get();
+}
+std::set<std::string>* GetBlockedTopics() {
+  static base::NoDestructor<std::set<std::string>> blocked_topics({});
+  return blocked_topics.get();
+}
+}  // namespace
+
 static jboolean JNI_PrivacySandboxBridge_IsPrivacySandboxEnabled(JNIEnv* env) {
   return PrivacySandboxServiceFactory::GetForProfile(
              ProfileManager::GetActiveUserProfile())
@@ -100,23 +115,32 @@
                                       ->GetFlocResetExplanationForDisplay());
 }
 
+// TODO(crbug.com/1286276): Remove this fake implementation and call
+// PrivacySandboxService.
 static ScopedJavaLocalRef<jobjectArray>
 JNI_PrivacySandboxBridge_GetCurrentTopTopics(JNIEnv* env) {
-  // TODO(crbug.com/1286276): Call PrivacySandboxService.
-  std::vector<std::string> topics{"Generated sample data", "More made up data"};
-  return base::android::ToJavaArrayOfStrings(env, topics);
+  return base::android::ToJavaArrayOfStrings(
+      env, std::vector<std::string>(GetCurrentTopics()->begin(),
+                                    GetCurrentTopics()->end()));
 }
 
 static ScopedJavaLocalRef<jobjectArray>
 JNI_PrivacySandboxBridge_GetBlockedTopics(JNIEnv* env) {
-  // TODO(crbug.com/1286276): Call PrivacySandboxService.
-  std::vector<std::string> topics{"Blocked sample data", "More blocked data"};
-  return base::android::ToJavaArrayOfStrings(env, topics);
+  return base::android::ToJavaArrayOfStrings(
+      env, std::vector<std::string>(GetBlockedTopics()->begin(),
+                                    GetBlockedTopics()->end()));
 }
 
 static void JNI_PrivacySandboxBridge_SetTopicAllowed(
     JNIEnv* env,
-    const base::android::JavaParamRef<jstring>& topic,
+    const base::android::JavaParamRef<jstring>& j_topic,
     jboolean allowed) {
-  // TODO(crbug.com/1286276): Call PrivacySandboxService.
+  std::string topic = base::android::ConvertJavaStringToUTF8(j_topic);
+  if (allowed) {
+    GetCurrentTopics()->insert(topic);
+    GetBlockedTopics()->erase(topic);
+  } else {
+    GetCurrentTopics()->erase(topic);
+    GetBlockedTopics()->insert(topic);
+  }
 }
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index b958d9a7..a2d3ee2 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -132,11 +132,11 @@
 #include "chrome/browser/android/reading_list/reading_list_notification_service_factory.h"
 #include "chrome/browser/android/search_permissions/search_permissions_service.h"
 #include "chrome/browser/android/thin_webview/chrome_thin_webview_initializer.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/commerce/merchant_viewer/merchant_signal_db_content.pb.h"
 #include "chrome/browser/commerce/merchant_viewer/merchant_viewer_data_manager_factory.h"
 #include "chrome/browser/commerce/subscriptions/commerce_subscription_db_content.pb.h"
 #include "chrome/browser/media/android/cdm/media_drm_origin_id_manager_factory.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #else
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/browsing_data/chrome_browsing_data_lifetime_manager_factory.h"
diff --git a/chrome/browser/profiles/profile.cc b/chrome/browser/profiles/profile.cc
index a3fadab7..719321b 100644
--- a/chrome/browser/profiles/profile.cc
+++ b/chrome/browser/profiles/profile.cc
@@ -21,7 +21,6 @@
 #include "chrome/browser/profiles/profile_observer.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/live_caption/pref_names.h"
@@ -333,8 +332,6 @@
                                std::string());
 #endif
 
-  data_reduction_proxy::RegisterSyncableProfilePrefs(registry);
-
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH)
   // Preferences related to the avatar bubble and user manager tutorials.
   registry->RegisterIntegerPref(prefs::kProfileAvatarTutorialShown, 0);
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index 28211dc..6447763 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -46,8 +46,6 @@
 #include "chrome/browser/buildflags.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
-#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
 #include "chrome/browser/download/download_core_service.h"
 #include "chrome/browser/download/download_core_service_factory.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
@@ -1634,11 +1632,6 @@
   SupervisedUserServiceFactory::GetForProfile(profile)->Init();
 #endif
 
-  // Activate data reduction proxy. This creates a request context and makes a
-  // URL request to check if the data reduction proxy server is reachable.
-  DataReductionProxyChromeSettingsFactory::GetForBrowserContext(profile)->
-      MaybeActivateDataReductionProxy(true);
-
   // Ensure NavigationPredictorKeyedService is started.
   NavigationPredictorKeyedServiceFactory::GetForProfile(profile);
 
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
index 1a816cef..823264a0 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -54,7 +54,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/search_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
 #include "components/guest_view/browser/guest_view_manager_delegate.h"
 #include "components/guest_view/browser/test_guest_view_manager.h"
 #include "components/lens/lens_features.h"
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
index a77ffda..707dba6 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
@@ -32,7 +32,6 @@
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/custom_handlers/protocol_handler_registry.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
 #include "components/lens/lens_features.h"
 #include "components/policy/core/common/policy_pref_names.h"
 #include "components/prefs/pref_registry_simple.h"
@@ -591,26 +590,6 @@
   EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_CUSTOM_FIRST));
 }
 
-// Verify that request headers do not specify pass through when "Save Image
-// As..." is used with Data Saver disabled.
-TEST_F(RenderViewContextMenuPrefsTest, DataSaverDisabledSaveImageAs) {
-  data_reduction_proxy::DataReductionProxySettings::
-      SetDataSaverEnabledForTesting(profile()->GetPrefs(), false);
-
-  content::ContextMenuParams params = CreateParams(MenuItem::IMAGE);
-  params.unfiltered_link_url = params.link_url;
-  auto menu = std::make_unique<TestRenderViewContextMenu>(
-      *web_contents()->GetMainFrame(), params);
-
-  menu->ExecuteCommand(IDC_CONTENT_CONTEXT_SAVEIMAGEAS, 0);
-
-  const std::string& headers =
-      content::WebContentsTester::For(web_contents())->GetSaveFrameHeaders();
-  EXPECT_TRUE(headers.find(
-      "Chrome-Proxy-Accept-Transform: identity") == std::string::npos);
-  EXPECT_TRUE(headers.find("Cache-Control: no-cache") == std::string::npos);
-}
-
 // Check that if image is broken "Load image" menu item is present.
 TEST_F(RenderViewContextMenuPrefsTest, LoadBrokenImage) {
   content::ContextMenuParams params = CreateParams(MenuItem::IMAGE);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
index 5189b49..9be985e 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -743,6 +743,9 @@
     });
 
 TEST_F('ChromeVoxBackgroundTest', 'SelectOptionSelected', function() {
+  // Undoes the ChromeVoxNextE2E call setting this to true. The doDefault action
+  // should always be read.
+  DesktopAutomationHandler.announceActions = false;
   const mockFeedback = this.createMockFeedback();
   const site = `
     <p>start</p>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/base_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/base_automation_handler.js
index 3edfda5..cba1a00 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/base_automation_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/base_automation_handler.js
@@ -101,10 +101,8 @@
 
     // Decide whether to announce and sync this event.
     const prevRange = ChromeVoxState.instance.getCurrentRangeWithoutRecovery();
-    if (!DesktopAutomationHandler.announceActions &&
-        (prevRange && !prevRange.requiresRecovery()) &&
-        evt.eventFrom === 'action' &&
-        !BaseAutomationHandler.allowEventFromAction_(evt.eventFromAction)) {
+    if ((prevRange && !prevRange.requiresRecovery()) &&
+        BaseAutomationHandler.disallowEventFromAction(evt)) {
       return;
     }
 
@@ -125,13 +123,15 @@
   }
 
   /**
-   * @param {ActionType} eventFromAction
+   * Returns true if the event contains an action that should not be processed.
+   * @param {!ChromeVoxEvent} evt
    * @return {boolean}
-   * @private
    */
-  static allowEventFromAction_(eventFromAction) {
-    return eventFromAction === ActionType.DO_DEFAULT ||
-        eventFromAction === ActionType.SHOW_CONTEXT_MENU;
+  static disallowEventFromAction(evt) {
+    return !DesktopAutomationHandler.announceActions &&
+        evt.eventFrom === 'action' &&
+        evt.eventFromAction !== ActionType.DO_DEFAULT &&
+        evt.eventFromAction !== ActionType.SHOW_CONTEXT_MENU;
   }
 };
 });  // goog.scope
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js
index 35fe764..1c3b573d 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js
@@ -98,8 +98,7 @@
    * @param {!ChromeVoxEvent} evt
    */
   onEventIfInRange(evt) {
-    if (!DesktopAutomationHandler.announceActions &&
-        evt.eventFrom === 'action') {
+    if (BaseAutomationHandler.disallowEventFromAction(evt)) {
       return;
     }
 
diff --git a/chrome/browser/resources/pdf/pdf_viewer_shared_style.html b/chrome/browser/resources/pdf/pdf_viewer_shared_style.html
index 91c5e5dc..9cfc9097 100644
--- a/chrome/browser/resources/pdf/pdf_viewer_shared_style.html
+++ b/chrome/browser/resources/pdf/pdf_viewer_shared_style.html
@@ -8,6 +8,7 @@
     }
 
     #plugin {
+      display: block;
       height: 100%;
       position: absolute;
       width: 100%;
diff --git a/chrome/browser/resources/pdf/viewport.js b/chrome/browser/resources/pdf/viewport.js
index c3baa5f..d3e8d34 100644
--- a/chrome/browser/resources/pdf/viewport.js
+++ b/chrome/browser/resources/pdf/viewport.js
@@ -1116,7 +1116,12 @@
       // Since we do the movement of the page.
       e.preventDefault();
     } else if (isCrossFrameKeyEvent(e)) {
-      const scrollOffset = (isDown ? 1 : -1) * this.size.height;
+      // Web scrolls by a fraction of the viewport height. Use the same
+      // fractional value as `cc::kMinFractionToStepWhenPaging` in
+      // cc/input/scroll_utils.h. The values must be kept in sync.
+      const MIN_FRACTION_TO_STEP_WHEN_PAGING = 0.875;
+      const scrollOffset = (isDown ? 1 : -1) * this.size.height *
+          MIN_FRACTION_TO_STEP_WHEN_PAGING;
       this.setPosition({
         x: this.position.x,
         y: this.position.y + scrollOffset,
diff --git a/chrome/browser/signin/chrome_signin_helper.cc b/chrome/browser/signin/chrome_signin_helper.cc
index ea548efe..4f0a9af2 100644
--- a/chrome/browser/signin/chrome_signin_helper.cc
+++ b/chrome/browser/signin/chrome_signin_helper.cc
@@ -76,7 +76,7 @@
 #endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 #endif
 
 namespace signin {
@@ -401,22 +401,22 @@
 
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
 
-// Creates a DiceTurnOnSyncHelper.
-void CreateDiceTurnOnSyncHelper(Profile* profile,
-                                signin_metrics::AccessPoint access_point,
-                                signin_metrics::PromoAction promo_action,
-                                signin_metrics::Reason reason,
-                                content::WebContents* web_contents,
-                                const CoreAccountId& account_id) {
+// Creates a TurnSyncOnHelper.
+void CreateTurnSyncOnHelper(Profile* profile,
+                            signin_metrics::AccessPoint access_point,
+                            signin_metrics::PromoAction promo_action,
+                            signin_metrics::Reason reason,
+                            content::WebContents* web_contents,
+                            const CoreAccountId& account_id) {
   DCHECK(profile);
   Browser* browser = web_contents
                          ? chrome::FindBrowserWithWebContents(web_contents)
                          : chrome::FindBrowserWithProfile(profile);
-  // DiceTurnSyncOnHelper is suicidal (it will kill itself once it finishes
-  // enabling sync).
-  new DiceTurnSyncOnHelper(
-      profile, browser, access_point, promo_action, reason, account_id,
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  // TurnSyncOnHelper is suicidal (it will kill itself once it finishes enabling
+  // sync).
+  new TurnSyncOnHelper(profile, browser, access_point, promo_action, reason,
+                       account_id,
+                       TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
 }
 
 // Shows UI for signin errors.
@@ -451,10 +451,9 @@
   DiceResponseHandler* dice_response_handler =
       DiceResponseHandler::GetForProfile(profile);
   dice_response_handler->ProcessDiceHeader(
-      dice_params,
-      std::make_unique<ProcessDiceHeaderDelegateImpl>(
-          web_contents, base::BindOnce(&CreateDiceTurnOnSyncHelper),
-          base::BindOnce(&ShowDiceSigninError)));
+      dice_params, std::make_unique<ProcessDiceHeaderDelegateImpl>(
+                       web_contents, base::BindOnce(&CreateTurnSyncOnHelper),
+                       base::BindOnce(&ShowDiceSigninError)));
 }
 #endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
 
diff --git a/chrome/browser/signin/dice_web_signin_interceptor.cc b/chrome/browser/signin/dice_web_signin_interceptor.cc
index 1657f40..4dbff5a 100644
--- a/chrome/browser/signin/dice_web_signin_interceptor.cc
+++ b/chrome/browser/signin/dice_web_signin_interceptor.cc
@@ -39,8 +39,6 @@
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h"
 #include "chrome/browser/ui/signin/profile_colors_util.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/themes/autogenerated_theme_util.h"
 #include "components/password_manager/core/browser/password_manager.h"
@@ -731,7 +729,7 @@
     accounts_mutator->RemoveAccount(
         account_info.account_id,
         signin_metrics::SourceForRefreshTokenOperation::
-            kDiceTurnOnSyncHelper_Abort);
+            kTurnOnSyncHelper_Abort);
   }
   signin_util::RecordEnterpriseProfileCreationUserChoice(
       /*enforced_by_policy=*/signin_util::ProfileSeparationEnforcedByPolicy(
diff --git a/chrome/browser/signin/signin_ui_util.cc b/chrome/browser/signin/signin_ui_util.cc
index 1bbdb265..b951b53 100644
--- a/chrome/browser/signin/signin_ui_util.cc
+++ b/chrome/browser/signin/signin_ui_util.cc
@@ -59,7 +59,7 @@
 
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
 #include "chrome/browser/signin/account_consistency_mode_manager.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 #endif
 
 namespace {
@@ -118,19 +118,19 @@
 };
 
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
-void CreateDiceTurnSyncOnHelper(
+void CreateTurnSyncOnHelper(
     Profile* profile,
     Browser* browser,
     signin_metrics::AccessPoint signin_access_point,
     signin_metrics::PromoAction signin_promo_action,
     signin_metrics::Reason signin_reason,
     const CoreAccountId& account_id,
-    DiceTurnSyncOnHelper::SigninAbortedMode signin_aborted_mode) {
-  // DiceTurnSyncOnHelper is suicidal (it will delete itself once it finishes
+    TurnSyncOnHelper::SigninAbortedMode signin_aborted_mode) {
+  // TurnSyncOnHelper is suicidal (it will delete itself once it finishes
   // enabling sync).
-  new DiceTurnSyncOnHelper(profile, browser, signin_access_point,
-                           signin_promo_action, signin_reason, account_id,
-                           signin_aborted_mode);
+  new TurnSyncOnHelper(profile, browser, signin_access_point,
+                       signin_promo_action, signin_reason, account_id,
+                       signin_aborted_mode);
 }
 #endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
 
@@ -345,7 +345,7 @@
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
   internal::EnableSyncFromPromo(browser, account, access_point,
                                 is_default_promo_account,
-                                base::BindOnce(&CreateDiceTurnSyncOnHelper));
+                                base::BindOnce(&CreateTurnSyncOnHelper));
 #else
   NOTREACHED();
 #endif
@@ -365,8 +365,8 @@
              signin_metrics::PromoAction signin_promo_action,
              signin_metrics::Reason signin_reason,
              const CoreAccountId& account_id,
-             DiceTurnSyncOnHelper::SigninAbortedMode signin_aborted_mode)>
-        create_dice_turn_sync_on_helper_callback) {
+             TurnSyncOnHelper::SigninAbortedMode signin_aborted_mode)>
+        create_turn_sync_on_helper_callback) {
   DCHECK(browser);
   DCHECK_NE(signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN, access_point);
   Profile* profile = browser->profile();
@@ -408,10 +408,10 @@
   signin_metrics::LogSigninAccessPointStarted(access_point, promo_action);
   signin_metrics::RecordSigninUserActionForAccessPoint(access_point,
                                                        promo_action);
-  std::move(create_dice_turn_sync_on_helper_callback)
+  std::move(create_turn_sync_on_helper_callback)
       .Run(profile, browser, access_point, promo_action,
            signin_metrics::Reason::kSigninPrimaryAccount, account.account_id,
-           DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
+           TurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
 }
 }  // namespace internal
 
diff --git a/chrome/browser/signin/signin_ui_util.h b/chrome/browser/signin/signin_ui_util.h
index 075952e..f943ae17 100644
--- a/chrome/browser/signin/signin_ui_util.h
+++ b/chrome/browser/signin/signin_ui_util.h
@@ -17,7 +17,7 @@
 #include "components/signin/public/base/signin_metrics.h"
 
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 #endif
 
 struct AccountInfo;
@@ -133,7 +133,7 @@
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
 namespace internal {
 // Same as |EnableSyncFromPromo| but with a callback that creates a
-// DiceTurnSyncOnHelper so that it can be unit tested.
+// TurnSyncOnHelper so that it can be unit tested.
 void EnableSyncFromPromo(
     Browser* browser,
     const AccountInfo& account,
@@ -146,8 +146,8 @@
              signin_metrics::PromoAction signin_promo_action,
              signin_metrics::Reason signin_reason,
              const CoreAccountId& account_id,
-             DiceTurnSyncOnHelper::SigninAbortedMode signin_aborted_mode)>
-        create_dice_turn_sync_on_helper_callback);
+             TurnSyncOnHelper::SigninAbortedMode signin_aborted_mode)>
+        create_turn_sync_on_helper_callback);
 }  // namespace internal
 #endif
 
diff --git a/chrome/browser/signin/signin_ui_util_unittest.cc b/chrome/browser/signin/signin_ui_util_unittest.cc
index 43be4319f..69371b79 100644
--- a/chrome/browser/signin/signin_ui_util_unittest.cc
+++ b/chrome/browser/signin/signin_ui_util_unittest.cc
@@ -107,7 +107,7 @@
   DiceSigninUiUtilTest() = default;
   ~DiceSigninUiUtilTest() override = default;
 
-  struct CreateDiceTurnSyncOnHelperParams {
+  struct CreateTurnSyncOnHelperParams {
    public:
     raw_ptr<Profile> profile = nullptr;
     raw_ptr<Browser> browser = nullptr;
@@ -118,28 +118,28 @@
     signin_metrics::Reason signin_reason =
         signin_metrics::Reason::kUnknownReason;
     CoreAccountId account_id;
-    DiceTurnSyncOnHelper::SigninAbortedMode signin_aborted_mode =
-        DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT;
+    TurnSyncOnHelper::SigninAbortedMode signin_aborted_mode =
+        TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT;
   };
 
-  void CreateDiceTurnSyncOnHelper(
+  void CreateTurnSyncOnHelper(
       Profile* profile,
       Browser* browser,
       signin_metrics::AccessPoint signin_access_point,
       signin_metrics::PromoAction signin_promo_action,
       signin_metrics::Reason signin_reason,
       const CoreAccountId& account_id,
-      DiceTurnSyncOnHelper::SigninAbortedMode signin_aborted_mode) {
-    create_dice_turn_sync_on_helper_called_ = true;
-    create_dice_turn_sync_on_helper_params_.profile = profile;
-    create_dice_turn_sync_on_helper_params_.browser = browser;
-    create_dice_turn_sync_on_helper_params_.signin_access_point =
+      TurnSyncOnHelper::SigninAbortedMode signin_aborted_mode) {
+    create_turn_sync_on_helper_called_ = true;
+    create_turn_sync_on_helper_params_.profile = profile;
+    create_turn_sync_on_helper_params_.browser = browser;
+    create_turn_sync_on_helper_params_.signin_access_point =
         signin_access_point;
-    create_dice_turn_sync_on_helper_params_.signin_promo_action =
+    create_turn_sync_on_helper_params_.signin_promo_action =
         signin_promo_action;
-    create_dice_turn_sync_on_helper_params_.signin_reason = signin_reason;
-    create_dice_turn_sync_on_helper_params_.account_id = account_id;
-    create_dice_turn_sync_on_helper_params_.signin_aborted_mode =
+    create_turn_sync_on_helper_params_.signin_reason = signin_reason;
+    create_turn_sync_on_helper_params_.account_id = account_id;
+    create_turn_sync_on_helper_params_.signin_aborted_mode =
         signin_aborted_mode;
   }
 
@@ -171,7 +171,7 @@
                   bool is_default_promo_account) {
     signin_ui_util::internal::EnableSyncFromPromo(
         browser(), account_info, access_point_, is_default_promo_account,
-        base::BindOnce(&DiceSigninUiUtilTest::CreateDiceTurnSyncOnHelper,
+        base::BindOnce(&DiceSigninUiUtilTest::CreateTurnSyncOnHelper,
                        base::Unretained(this)));
   }
 
@@ -254,8 +254,8 @@
   signin_metrics::AccessPoint access_point_ =
       signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE;
 
-  bool create_dice_turn_sync_on_helper_called_ = false;
-  CreateDiceTurnSyncOnHelperParams create_dice_turn_sync_on_helper_params_;
+  bool create_turn_sync_on_helper_called_ = false;
+  CreateTurnSyncOnHelperParams create_turn_sync_on_helper_params_;
 };
 
 TEST_F(DiceSigninUiUtilTest, EnableSyncWithExistingAccount) {
@@ -279,7 +279,7 @@
         is_default_promo_account
             ? signin_metrics::PromoAction::PROMO_ACTION_WITH_DEFAULT
             : signin_metrics::PromoAction::PROMO_ACTION_NOT_DEFAULT;
-    ASSERT_TRUE(create_dice_turn_sync_on_helper_called_);
+    ASSERT_TRUE(create_turn_sync_on_helper_called_);
     ExpectOneSigninStartedHistograms(histogram_tester, expected_promo_action);
 
     EXPECT_EQ(1, user_action_tester.GetActionCount(
@@ -294,17 +294,17 @@
 
     // Verify that the helper to enable sync is created with the expected
     // params.
-    EXPECT_EQ(profile(), create_dice_turn_sync_on_helper_params_.profile);
-    EXPECT_EQ(browser(), create_dice_turn_sync_on_helper_params_.browser);
-    EXPECT_EQ(account_id, create_dice_turn_sync_on_helper_params_.account_id);
+    EXPECT_EQ(profile(), create_turn_sync_on_helper_params_.profile);
+    EXPECT_EQ(browser(), create_turn_sync_on_helper_params_.browser);
+    EXPECT_EQ(account_id, create_turn_sync_on_helper_params_.account_id);
     EXPECT_EQ(signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE,
-              create_dice_turn_sync_on_helper_params_.signin_access_point);
+              create_turn_sync_on_helper_params_.signin_access_point);
     EXPECT_EQ(expected_promo_action,
-              create_dice_turn_sync_on_helper_params_.signin_promo_action);
+              create_turn_sync_on_helper_params_.signin_promo_action);
     EXPECT_EQ(signin_metrics::Reason::kSigninPrimaryAccount,
-              create_dice_turn_sync_on_helper_params_.signin_reason);
-    EXPECT_EQ(DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT,
-              create_dice_turn_sync_on_helper_params_.signin_aborted_mode);
+              create_turn_sync_on_helper_params_.signin_reason);
+    EXPECT_EQ(TurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT,
+              create_turn_sync_on_helper_params_.signin_aborted_mode);
   }
 }
 
@@ -332,7 +332,7 @@
     EnableSync(
         GetIdentityManager()->FindExtendedAccountInfoByAccountId(account_id),
         is_default_promo_account);
-    ASSERT_FALSE(create_dice_turn_sync_on_helper_called_);
+    ASSERT_FALSE(create_turn_sync_on_helper_called_);
 
     ExpectOneSigninStartedHistograms(
         histogram_tester,
@@ -372,7 +372,7 @@
       0, user_action_tester.GetActionCount("Signin_Signin_FromBookmarkBubble"));
 
   EnableSync(AccountInfo(), false /* is_default_promo_account (not used)*/);
-  ASSERT_FALSE(create_dice_turn_sync_on_helper_called_);
+  ASSERT_FALSE(create_turn_sync_on_helper_called_);
 
   ExpectOneSigninStartedHistograms(
       histogram_tester, signin_metrics::PromoAction::
@@ -405,7 +405,7 @@
       0, user_action_tester.GetActionCount("Signin_Signin_FromBookmarkBubble"));
 
   EnableSync(AccountInfo(), false /* is_default_promo_account (not used)*/);
-  ASSERT_FALSE(create_dice_turn_sync_on_helper_called_);
+  ASSERT_FALSE(create_turn_sync_on_helper_called_);
 
   ExpectOneSigninStartedHistograms(
       histogram_tester,
@@ -427,7 +427,7 @@
       0, user_action_tester.GetActionCount("Signin_Signin_FromBookmarkBubble"));
 
   EnableSync(AccountInfo(), false /* is_default_promo_account (not used)*/);
-  ASSERT_FALSE(create_dice_turn_sync_on_helper_called_);
+  ASSERT_FALSE(create_turn_sync_on_helper_called_);
 
   ExpectOneSigninStartedHistograms(
       histogram_tester, signin_metrics::PromoAction::
diff --git a/chrome/browser/signin/signin_util_win.cc b/chrome/browser/signin/signin_util_win.cc
index 21f0fdc..8678e8d2 100644
--- a/chrome/browser/signin/signin_util_win.cc
+++ b/chrome/browser/signin/signin_util_win.cc
@@ -27,9 +27,9 @@
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_list.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
 #include "chrome/browser/ui/webui/signin/signin_ui_error.h"
 #include "chrome/browser/ui/webui/signin/signin_utils_desktop.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 #include "chrome/credential_provider/common/gcp_strings.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/core/browser/about_signin_internals.h"
@@ -42,9 +42,9 @@
 
 namespace {
 
-std::unique_ptr<DiceTurnSyncOnHelper::Delegate>*
-GetDiceTurnSyncOnHelperDelegateForTestingStorage() {
-  static base::NoDestructor<std::unique_ptr<DiceTurnSyncOnHelper::Delegate>>
+std::unique_ptr<TurnSyncOnHelper::Delegate>*
+GetTurnSyncOnHelperDelegateForTestingStorage() {
+  static base::NoDestructor<std::unique_ptr<TurnSyncOnHelper::Delegate>>
       delegate;
   return delegate.get();
 }
@@ -73,25 +73,25 @@
 void FinishImportCredentialsFromProvider(const CoreAccountId& account_id,
                                          Browser* browser,
                                          Profile* profile) {
-  // DiceTurnSyncOnHelper deletes itself once done.
-  if (GetDiceTurnSyncOnHelperDelegateForTestingStorage()->get()) {
-    new DiceTurnSyncOnHelper(
+  // TurnSyncOnHelper deletes itself once done.
+  if (GetTurnSyncOnHelperDelegateForTestingStorage()->get()) {
+    new TurnSyncOnHelper(
         profile, signin_metrics::AccessPoint::ACCESS_POINT_MACHINE_LOGON,
         signin_metrics::PromoAction::PROMO_ACTION_WITH_DEFAULT,
         signin_metrics::Reason::kSigninPrimaryAccount, account_id,
-        DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT,
-        std::move(*GetDiceTurnSyncOnHelperDelegateForTestingStorage()),
+        TurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT,
+        std::move(*GetTurnSyncOnHelperDelegateForTestingStorage()),
         base::DoNothing());
   } else {
     if (!browser)
       browser = chrome::FindLastActiveWithProfile(profile);
 
-    new DiceTurnSyncOnHelper(
+    new TurnSyncOnHelper(
         profile, browser,
         signin_metrics::AccessPoint::ACCESS_POINT_MACHINE_LOGON,
         signin_metrics::PromoAction::PROMO_ACTION_WITH_DEFAULT,
         signin_metrics::Reason::kSigninPrimaryAccount, account_id,
-        DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
+        TurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
   }
 }
 
@@ -240,9 +240,9 @@
 
 }  // namespace
 
-void SetDiceTurnSyncOnHelperDelegateForTesting(
-    std::unique_ptr<DiceTurnSyncOnHelper::Delegate> delegate) {
-  GetDiceTurnSyncOnHelperDelegateForTestingStorage()->swap(delegate);
+void SetTurnSyncOnHelperDelegateForTesting(
+    std::unique_ptr<TurnSyncOnHelper::Delegate> delegate) {
+  GetTurnSyncOnHelperDelegateForTestingStorage()->swap(delegate);  // IN-TEST
 }
 
 // Credential provider needs to stick to profile it previously used to import
diff --git a/chrome/browser/signin/signin_util_win.h b/chrome/browser/signin/signin_util_win.h
index 771085f9..c5730471 100644
--- a/chrome/browser/signin/signin_util_win.h
+++ b/chrome/browser/signin/signin_util_win.h
@@ -7,7 +7,7 @@
 
 #include <memory>
 
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 
 class Profile;
 
@@ -22,9 +22,9 @@
 // installed returns true.
 bool ReauthWithCredentialProviderIfPossible(Profile* profile);
 
-// Sets the DiceTurnSyncOnHelper delegate for browser tests.
-void SetDiceTurnSyncOnHelperDelegateForTesting(
-    std::unique_ptr<DiceTurnSyncOnHelper::Delegate> delegate);
+// Sets the TurnSyncOnHelper delegate for browser tests.
+void SetTurnSyncOnHelperDelegateForTesting(
+    std::unique_ptr<TurnSyncOnHelper::Delegate> delegate);
 
 }  // namespace signin_util
 
diff --git a/chrome/browser/signin/signin_util_win_browsertest.cc b/chrome/browser/signin/signin_util_win_browsertest.cc
index 3eea128..78a2bc8 100644
--- a/chrome/browser/signin/signin_util_win_browsertest.cc
+++ b/chrome/browser/signin/signin_util_win_browsertest.cc
@@ -23,7 +23,7 @@
 #include "chrome/browser/signin/signin_util_win.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/ui_features.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/credential_provider/common/gcp_strings.h"
@@ -40,21 +40,21 @@
 
 namespace {
 
-class TestDiceTurnSyncOnHelperDelegate : public DiceTurnSyncOnHelper::Delegate {
-  ~TestDiceTurnSyncOnHelperDelegate() override {}
+class TestTurnSyncOnHelperDelegate : public TurnSyncOnHelper::Delegate {
+  ~TestTurnSyncOnHelperDelegate() override {}
 
-  // DiceTurnSyncOnHelper::Delegate:
+  // TurnSyncOnHelper::Delegate:
   void ShowLoginError(const SigninUIError& error) override {}
   void ShowMergeSyncDataConfirmation(
       const std::string& previous_email,
       const std::string& new_email,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) override {
-    std::move(callback).Run(DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
+      TurnSyncOnHelper::SigninChoiceCallback callback) override {
+    std::move(callback).Run(TurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
   }
   void ShowEnterpriseAccountConfirmation(
       const AccountInfo& account_info,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) override {
-    std::move(callback).Run(DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
+      TurnSyncOnHelper::SigninChoiceCallback callback) override {
+    std::move(callback).Run(TurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
   }
   void ShowSyncConfirmation(
       base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
@@ -213,9 +213,9 @@
   bool SetUpUserDataDirectory() override {
     registry_override_.OverrideRegistry(HKEY_CURRENT_USER);
 
-    signin_util::SetDiceTurnSyncOnHelperDelegateForTesting(
-        std::unique_ptr<DiceTurnSyncOnHelper::Delegate>(
-            new TestDiceTurnSyncOnHelperDelegate()));
+    signin_util::SetTurnSyncOnHelperDelegateForTesting(
+        std::unique_ptr<TurnSyncOnHelper::Delegate>(
+            new TestTurnSyncOnHelperDelegate()));
 
     SetSigninUtilRegistry();
 
@@ -399,9 +399,9 @@
   bool SetUpUserDataDirectory() override {
     registry_override_.OverrideRegistry(HKEY_CURRENT_USER);
 
-    signin_util::SetDiceTurnSyncOnHelperDelegateForTesting(
-        std::unique_ptr<DiceTurnSyncOnHelper::Delegate>(
-            new TestDiceTurnSyncOnHelperDelegate()));
+    signin_util::SetTurnSyncOnHelperDelegateForTesting(
+        std::unique_ptr<TurnSyncOnHelper::Delegate>(
+            new TestTurnSyncOnHelperDelegate()));
     if (!IsPreTest())
       SetSigninUtilRegistry();
 
@@ -548,9 +548,9 @@
   bool SetUpUserDataDirectory() override {
     registry_override_.OverrideRegistry(HKEY_CURRENT_USER);
 
-    signin_util::SetDiceTurnSyncOnHelperDelegateForTesting(
-        std::unique_ptr<DiceTurnSyncOnHelper::Delegate>(
-            new TestDiceTurnSyncOnHelperDelegate()));
+    signin_util::SetTurnSyncOnHelperDelegateForTesting(
+        std::unique_ptr<TurnSyncOnHelper::Delegate>(
+            new TestTurnSyncOnHelperDelegate()));
     if (!IsPreTest()) {
       SetSigninUtilRegistry();
     } else if (IsPrePreTest() && GetParam().cred_provider_used_other_profile) {
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 5067f92..2017860 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -397,7 +397,6 @@
     "//chrome/browser:dev_ui_browser_resources",
     "//chrome/browser:resource_prefetch_predictor_proto",
     "//chrome/browser/breadcrumbs",
-    "//chrome/browser/commerce:feature_list",
     "//chrome/browser/commerce/shopping_list",
     "//chrome/browser/devtools",
     "//chrome/browser/image_decoder",
@@ -456,6 +455,7 @@
     "//components/captive_portal/core:buildflags",
     "//components/client_hints/browser",
     "//components/commerce/content:metrics",
+    "//components/commerce/core:feature_list",
     "//components/consent_auditor/",
     "//components/content_settings/browser",
     "//components/content_settings/common:mojom",
@@ -3312,8 +3312,6 @@
       "webui/settings/settings_manage_profile_handler.h",
       "webui/settings/system_handler.cc",
       "webui/settings/system_handler.h",
-      "webui/signin/dice_turn_sync_on_helper.cc",
-      "webui/signin/dice_turn_sync_on_helper.h",
       "webui/signin/enterprise_profile_welcome_handler.cc",
       "webui/signin/enterprise_profile_welcome_handler.h",
       "webui/signin/enterprise_profile_welcome_ui.cc",
@@ -3340,6 +3338,8 @@
       "webui/signin/signin_ui_error.h",
       "webui/signin/signin_utils_desktop.cc",
       "webui/signin/signin_utils_desktop.h",
+      "webui/signin/turn_sync_on_helper.cc",
+      "webui/signin/turn_sync_on_helper.h",
     ]
 
     deps += [
@@ -3369,8 +3369,6 @@
         "views/sync/dice_bubble_sync_promo_view.h",
         "views/sync/dice_signin_button_view.cc",
         "views/sync/dice_signin_button_view.h",
-        "webui/signin/dice_turn_sync_on_helper_delegate_impl.cc",
-        "webui/signin/dice_turn_sync_on_helper_delegate_impl.h",
         "webui/signin/dice_web_signin_intercept_handler.cc",
         "webui/signin/dice_web_signin_intercept_handler.h",
         "webui/signin/dice_web_signin_intercept_ui.cc",
@@ -3381,6 +3379,8 @@
         "webui/signin/signin_reauth_handler.h",
         "webui/signin/signin_reauth_ui.cc",
         "webui/signin/signin_reauth_ui.h",
+        "webui/signin/turn_sync_on_helper_delegate_impl.cc",
+        "webui/signin/turn_sync_on_helper_delegate_impl.h",
         "webui/welcome/bookmark_handler.cc",
         "webui/welcome/bookmark_handler.h",
         "webui/welcome/bookmark_item.cc",
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index f23c0bc..760115bb 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -929,7 +929,10 @@
        <message name="IDS_PRIVACY_SANDBOX_TOPIC_INTERESTS_CATEGORY" desc="Title of a section of the settings page to configure ad personalization." translateable="false">
         Your interests as estimated by Chrome
       </message>
-       <message name="IDS_PRIVACY_SANDBOX_FLEDGE_INTERESTS_CATEGORY" desc="Title of a section of the settings page to configure ad personalization." translateable="false">
+      <message name="IDS_PRIVACY_SANDBOX_TOPIC_EMPTY_STATE" desc="Summary shown when no interests for ad personlization are available." translateable="false">
+        A list of interests will appear here as you browse the web.
+      </message>
+      <message name="IDS_PRIVACY_SANDBOX_FLEDGE_INTERESTS_CATEGORY" desc="Title of a section of the settings page to configure ad personalization." translateable="false">
         Sites you visit that define your interests
       </message>
        <message name="IDS_PRIVACY_SANDBOX_FLEDGE_UNDER_DEVELOPMENT_NOTICE" desc="Text to explain that a feature for ad personalization is not implemented yet." translateable="false">
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc
index a603e3b..c10ccc5e 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -105,6 +105,7 @@
 #include "chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.h"
 #include "chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h"
 #include "chrome/browser/ui/autofill/payments/save_upi_bubble_controller_impl.h"
+#include "chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.h"
 #include "chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller_impl.h"
 #include "chrome/browser/ui/autofill/payments/virtual_card_selection_dialog_controller_impl.h"
 #include "chrome/browser/ui/autofill/payments/webauthn_dialog_controller_impl.h"
@@ -376,6 +377,21 @@
   return form_data_importer_->GetVirtualCardEnrollmentManager();
 }
 
+void ChromeAutofillClient::ShowVirtualCardEnrollDialog(
+    const raw_ptr<VirtualCardEnrollmentFields> virtual_card_enrollment_fields,
+    base::OnceClosure accept_virtual_card_callback,
+    base::OnceClosure decline_virtual_card_callback) {
+#if !BUILDFLAG(IS_ANDROID)
+  VirtualCardEnrollBubbleControllerImpl::CreateForWebContents(web_contents());
+  VirtualCardEnrollBubbleControllerImpl* controller =
+      VirtualCardEnrollBubbleControllerImpl::FromWebContents(web_contents());
+  DCHECK(controller);
+  controller->ShowBubble(virtual_card_enrollment_fields,
+                         std::move(accept_virtual_card_callback),
+                         std::move(decline_virtual_card_callback));
+#endif  // !BUILDFLAG(IS_ANDROID)
+}
+
 #if !BUILDFLAG(IS_ANDROID)
 std::vector<std::string>
 ChromeAutofillClient::GetAllowedMerchantsForVirtualCards() {
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h
index 33396837..4da3a509 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.h
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -40,6 +40,7 @@
 namespace autofill {
 
 class AutofillPopupControllerImpl;
+struct VirtualCardEnrollmentFields;
 class VirtualCardEnrollmentManager;
 
 // Chrome implementation of AutofillClient.
@@ -99,6 +100,10 @@
   void DismissUnmaskAuthenticatorSelectionDialog(bool server_success) override;
   raw_ptr<VirtualCardEnrollmentManager> GetVirtualCardEnrollmentManager()
       override;
+  void ShowVirtualCardEnrollDialog(
+      const raw_ptr<VirtualCardEnrollmentFields> virtual_card_enrollment_fields,
+      base::OnceClosure accept_virtual_card_callback,
+      base::OnceClosure decline_virtual_card_callback) override;
 #if !BUILDFLAG(IS_ANDROID)
   std::vector<std::string> GetAllowedMerchantsForVirtualCards() override;
   std::vector<std::string> GetAllowedBinRangesForVirtualCards() override;
diff --git a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc
index bc96b05..b07c794 100644
--- a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc
@@ -6,7 +6,6 @@
 
 #include <string>
 
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/commerce/coupons/coupon_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_base.h"
@@ -20,6 +19,7 @@
 #include "components/autofill/core/common/autofill_clock.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/navigation_handle.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl_unittest.cc b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl_unittest.cc
index 1b341a64..d154819 100644
--- a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl_unittest.cc
+++ b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl_unittest.cc
@@ -6,7 +6,6 @@
 
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/commerce/coupons/coupon_service.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_base.h"
 #include "chrome/browser/ui/browser_finder.h"
@@ -15,6 +14,7 @@
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/data_model/autofill_offer_data.h"
 #include "components/autofill/core/browser/test_autofill_clock.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "content/public/test/mock_navigation_handle.h"
 #include "content/public/test/navigation_simulator.h"
 #include "content/public/test/web_contents_tester.h"
diff --git a/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller.h b/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller.h
index f30eed2..9dc9861 100644
--- a/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller.h
+++ b/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller.h
@@ -53,7 +53,7 @@
   virtual std::u16string GetLearnMoreLinkText() const = 0;
 
   // Returns the enrollment fields for the virtual card.
-  virtual VirtualCardEnrollmentFields* GetVirtualCardEnrollmentFields()
+  virtual const VirtualCardEnrollmentFields* GetVirtualCardEnrollmentFields()
       const = 0;
 
   // Returns the currently active virtual card enroll bubble view. Can be
diff --git a/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.cc
index 126a50e..17550dc 100644
--- a/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.cc
@@ -44,9 +44,17 @@
   return VirtualCardEnrollBubbleControllerImpl::FromWebContents(web_contents);
 }
 
-void VirtualCardEnrollBubbleControllerImpl::ShowBubble() {
+void VirtualCardEnrollBubbleControllerImpl::ShowBubble(
+    const VirtualCardEnrollmentFields* virtual_card_enrollment_fields,
+    base::OnceClosure accept_virtual_card_callback,
+    base::OnceClosure decline_virtual_card_callback) {
+  // If bubble is already showing for another card, close it.
   if (bubble_view())
-    return;
+    HideBubble();
+
+  virtual_card_enrollment_fields_ = virtual_card_enrollment_fields;
+  accept_virtual_card_callback_ = std::move(accept_virtual_card_callback);
+  decline_virtual_card_callback_ = std::move(decline_virtual_card_callback);
 
   is_user_gesture_ = false;
   Show();
@@ -102,7 +110,7 @@
       IDS_AUTOFILL_VIRTUAL_CARD_ENROLLMENT_LEARN_MORE_LINK_LABEL);
 }
 
-VirtualCardEnrollmentFields*
+const VirtualCardEnrollmentFields*
 VirtualCardEnrollBubbleControllerImpl::GetVirtualCardEnrollmentFields() const {
   return virtual_card_enrollment_fields_.get();
 }
@@ -112,9 +120,19 @@
   return bubble_view();
 }
 
-void VirtualCardEnrollBubbleControllerImpl::OnAcceptButton() {}
+void VirtualCardEnrollBubbleControllerImpl::OnAcceptButton() {
+  std::move(accept_virtual_card_callback_).Run();
+  decline_virtual_card_callback_.Reset();
 
-void VirtualCardEnrollBubbleControllerImpl::OnDeclineButton() {}
+  should_show_icon_ = false;
+}
+
+void VirtualCardEnrollBubbleControllerImpl::OnDeclineButton() {
+  std::move(decline_virtual_card_callback_).Run();
+  accept_virtual_card_callback_.Reset();
+
+  should_show_icon_ = false;
+}
 
 void VirtualCardEnrollBubbleControllerImpl::OnLinkClicked(const GURL& url) {
   web_contents()->OpenURL(content::OpenURLParams(
@@ -123,7 +141,10 @@
 }
 
 void VirtualCardEnrollBubbleControllerImpl::OnBubbleClosed(
-    PaymentsBubbleClosedReason closed_reason) {}
+    PaymentsBubbleClosedReason closed_reason) {
+  set_bubble_view(nullptr);
+  UpdatePageActionIcon();
+}
 
 bool VirtualCardEnrollBubbleControllerImpl::IsIconVisible() const {
   return should_show_icon_;
diff --git a/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.h
index 5ed67e8..e9e19fa 100644
--- a/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.h
+++ b/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.h
@@ -26,8 +26,12 @@
   ~VirtualCardEnrollBubbleControllerImpl() override;
 
   // Displays both the virtual card enroll bubble and its associated omnibox
-  // icon.
-  void ShowBubble();
+  // icon. Sets virtual card enrollment fields as well as the closure for the
+  // accept and decline bubble events.
+  void ShowBubble(
+      const VirtualCardEnrollmentFields* virtual_card_enrollment_fields,
+      base::OnceClosure accept_virtual_card_callback,
+      base::OnceClosure decline_virtual_card_callback);
 
   // Shows the bubble again if the users clicks the omnibox icon.
   void ReshowBubble();
@@ -38,7 +42,8 @@
   std::u16string GetAcceptButtonText() const override;
   std::u16string GetDeclineButtonText() const override;
   std::u16string GetLearnMoreLinkText() const override;
-  VirtualCardEnrollmentFields* GetVirtualCardEnrollmentFields() const override;
+  const VirtualCardEnrollmentFields* GetVirtualCardEnrollmentFields()
+      const override;
   AutofillBubbleBase* GetVirtualCardEnrollBubbleView() const override;
 
   void OnAcceptButton() override;
@@ -60,7 +65,7 @@
       VirtualCardEnrollBubbleControllerImpl>;
 
   // Contains more details regarding the sort of bubble to show the users.
-  std::unique_ptr<VirtualCardEnrollmentFields> virtual_card_enrollment_fields_;
+  raw_ptr<const VirtualCardEnrollmentFields> virtual_card_enrollment_fields_;
 
   // True if the icon should be showing on the webpage
   bool should_show_icon_ = false;
@@ -69,6 +74,12 @@
   // it means the bubble is a reshown bubble.
   bool is_user_gesture_ = false;
 
+  // Closure invoked when the user agrees to enroll in a virtual card.
+  base::OnceClosure accept_virtual_card_callback_;
+
+  // Closure invoked when the user rejects enrolling in a virtual card.
+  base::OnceClosure decline_virtual_card_callback_;
+
   WEB_CONTENTS_USER_DATA_KEY_DECL();
 };
 
diff --git a/chrome/browser/ui/cocoa/tab_menu_bridge.h b/chrome/browser/ui/cocoa/tab_menu_bridge.h
index 0603f23..1a14514 100644
--- a/chrome/browser/ui/cocoa/tab_menu_bridge.h
+++ b/chrome/browser/ui/cocoa/tab_menu_bridge.h
@@ -9,6 +9,7 @@
 #include "base/mac/scoped_nsobject.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
 
+@class NSMutableArray;
 @class NSMenuItem;
 @class TabMenuListener;
 class TabStripModel;
@@ -43,8 +44,8 @@
  private:
   FRIEND_TEST_ALL_PREFIXES(TabMenuBridgeTest, ClickingMenuActivatesTab);
 
-  // These methods are used to make batch changes to the menu.
-  void RemoveAllDynamicItems();
+  // These methods are used manage the dynamic menu items.
+  NSMutableArray* DynamicMenuItems();
   void AddDynamicItemsFromModel();
 
   // This method exists to be called back into from the Cocoa part of this
diff --git a/chrome/browser/ui/cocoa/tab_menu_bridge.mm b/chrome/browser/ui/cocoa/tab_menu_bridge.mm
index 401cd34..b3478570 100644
--- a/chrome/browser/ui/cocoa/tab_menu_bridge.mm
+++ b/chrome/browser/ui/cocoa/tab_menu_bridge.mm
@@ -47,6 +47,14 @@
   item.image = tab_ui_helper->GetFavicon().AsNSImage();
 }
 
+void RemoveMenuItems(NSArray* menu_items) {
+  NSMenu* tab_menu = [[menu_items firstObject] menu];
+
+  for (NSMenuItem* item in menu_items) {
+    [tab_menu removeItem:item];
+  }
+}
+
 }  // namespace
 
 @interface TabMenuListener : NSObject
@@ -86,35 +94,57 @@
 TabMenuBridge::~TabMenuBridge() {
   if (model_)
     model_->RemoveObserver(this);
-  RemoveAllDynamicItems();
+  RemoveMenuItems(DynamicMenuItems());
 }
 
 void TabMenuBridge::BuildMenu() {
   DCHECK(model_);
-  RemoveAllDynamicItems();
   AddDynamicItemsFromModel();
 }
 
-void TabMenuBridge::RemoveAllDynamicItems() {
+NSMutableArray* TabMenuBridge::DynamicMenuItems() {
+  NSMenu* tabMenu = menu_item_.submenu;
+  NSMutableArray* array = [[[NSMutableArray alloc]
+      initWithCapacity:[tabMenu numberOfItems]] autorelease];
+
   for (NSMenuItem* item in menu_item_.submenu.itemArray) {
     if (item.target == menu_listener_.get())
-      [menu_item_.submenu removeItem:item];
+      [array addObject:item];
   }
+
+  return array;
 }
 
 void TabMenuBridge::AddDynamicItemsFromModel() {
-  dynamic_items_start_ = menu_item_.submenu.numberOfItems;
+  NSMutableArray* recyclable_items = DynamicMenuItems();
+  NSMenu* tabMenu = menu_item_.submenu;
+
+  dynamic_items_start_ = tabMenu.numberOfItems - recyclable_items.count;
   for (int i = 0; i < model_->count(); ++i) {
-    base::scoped_nsobject<NSMenuItem> item([[NSMenuItem alloc]
-        initWithTitle:@""
-               action:@selector(activateTab:)
-        keyEquivalent:@""]);
-    [item setTarget:menu_listener_.get()];
-    if (model_->active_index() == i)
+    base::scoped_nsobject<NSMenuItem> item;
+
+    if (recyclable_items.count) {
+      item.reset([[recyclable_items firstObject] retain]);
+      [recyclable_items removeObjectAtIndex:0];
+      [item setState:NSOffState];
+    } else {
+      item.reset([[NSMenuItem alloc] initWithTitle:@""
+                                            action:@selector(activateTab:)
+                                     keyEquivalent:@""]);
+      [item setTarget:menu_listener_.get()];
+    }
+
+    if (model_->active_index() == i) {
       [item setState:NSOnState];
+    }
     UpdateItemForWebContents(item, model_->GetWebContentsAt(i));
-    [menu_item_.submenu addItem:item.get()];
+
+    if ([item menu] == nil) {
+      [tabMenu addItem:item.get()];
+    }
   }
+
+  RemoveMenuItems(recyclable_items);
 }
 
 void TabMenuBridge::OnDynamicItemChosen(NSMenuItem* item) {
@@ -144,9 +174,6 @@
     return;
   }
 
-  // Rather than doing clever updating from |change|, just destroy the dynamic
-  // menu items and re-add them.
-  RemoveAllDynamicItems();
   AddDynamicItemsFromModel();
 }
 
diff --git a/chrome/browser/ui/cocoa/tab_menu_bridge_unittest.mm b/chrome/browser/ui/cocoa/tab_menu_bridge_unittest.mm
index ab617721..e8e24ef 100644
--- a/chrome/browser/ui/cocoa/tab_menu_bridge_unittest.mm
+++ b/chrome/browser/ui/cocoa/tab_menu_bridge_unittest.mm
@@ -206,6 +206,23 @@
   ExpectDynamicTabsInMenuAre({"Tab 5", "Tab 3", "Tab 2"});
 }
 
+// Tests that dynamic menu items added by the bridge are removed on
+// bridge destruction.
+TEST_F(TabMenuBridgeTest, RemoveDynamicMenuItemsOnDestruct) {
+  std::unique_ptr<TabMenuBridge> bridge =
+      std::make_unique<TabMenuBridge>(model(), menu_root());
+  bridge->BuildMenu();
+
+  AddModelTabNamed("Tab 1");
+  AddModelTabNamed("Tab 2");
+  AddModelTabNamed("Tab 3");
+  ExpectDynamicTabsInMenuAre({"Tab 1", "Tab 2", "Tab 3"});
+
+  bridge.reset();
+
+  ExpectDynamicTabsInMenuAre({});
+}
+
 TEST_F(TabMenuBridgeTest, ClickingMenuActivatesTab) {
   TabMenuBridge bridge(model(), menu_root());
   bridge.BuildMenu();
diff --git a/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.cc b/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.cc
index abdad0f..9d81d01 100644
--- a/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.cc
+++ b/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.cc
@@ -16,7 +16,6 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
 #include "components/signin/public/base/signin_metrics.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "google_apis/gaia/core_account_id.h"
diff --git a/chrome/browser/ui/signin_intercept_first_run_experience_dialog.cc b/chrome/browser/ui/signin_intercept_first_run_experience_dialog.cc
index 8a59000d..a949a42c 100644
--- a/chrome/browser/ui/signin_intercept_first_run_experience_dialog.cc
+++ b/chrome/browser/ui/signin_intercept_first_run_experience_dialog.cc
@@ -14,10 +14,10 @@
 #include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/chrome_pages.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
 #include "chrome/browser/ui/webui/signin/profile_customization_ui.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 #include "chrome/common/webui_url_constants.h"
 #include "components/signin/public/base/signin_metrics.h"
 #include "content/public/browser/navigation_handle.h"
@@ -26,25 +26,25 @@
 #include "ui/base/page_transition_types.h"
 #include "url/gurl.h"
 
-// Delegate class for DiceTurnSyncOnHelper. Determines what will be the next
+// Delegate class for TurnSyncOnHelper. Determines what will be the next
 // step for the first run based on Sync availabitily.
 class SigninInterceptFirstRunExperienceDialog::InterceptTurnSyncOnHelperDelegate
-    : public DiceTurnSyncOnHelper::Delegate,
+    : public TurnSyncOnHelper::Delegate,
       public LoginUIService::Observer {
  public:
   explicit InterceptTurnSyncOnHelperDelegate(
       base::WeakPtr<SigninInterceptFirstRunExperienceDialog> dialog);
   ~InterceptTurnSyncOnHelperDelegate() override;
 
-  // DiceTurnSyncOnHelper::Delegate:
+  // TurnSyncOnHelper::Delegate:
   void ShowLoginError(const SigninUIError& error) override;
   void ShowMergeSyncDataConfirmation(
       const std::string& previous_email,
       const std::string& new_email,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) override;
+      TurnSyncOnHelper::SigninChoiceCallback callback) override;
   void ShowEnterpriseAccountConfirmation(
       const AccountInfo& account_info,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) override;
+      TurnSyncOnHelper::SigninChoiceCallback callback) override;
   void ShowSyncConfirmation(
       base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
           callback) override;
@@ -90,7 +90,7 @@
     InterceptTurnSyncOnHelperDelegate::ShowMergeSyncDataConfirmation(
         const std::string& previous_email,
         const std::string& new_email,
-        DiceTurnSyncOnHelper::SigninChoiceCallback callback) {
+        TurnSyncOnHelper::SigninChoiceCallback callback) {
   NOTREACHED() << "Sign-in intercept shouldn't create a profile for an "
                   "account known to Chrome";
 }
@@ -98,12 +98,12 @@
 void SigninInterceptFirstRunExperienceDialog::
     InterceptTurnSyncOnHelperDelegate::ShowEnterpriseAccountConfirmation(
         const AccountInfo& account_info,
-        DiceTurnSyncOnHelper::SigninChoiceCallback callback) {
+        TurnSyncOnHelper::SigninChoiceCallback callback) {
   // This is a brand new profile. Skip the enterprise confirmation.
   // TODO(crbug.com/1282157): Do not show the sync promo if either
   // - PromotionalTabsEnabled policy is set to False, or
   // - the user went through the Profile Separation dialog.
-  std::move(callback).Run(DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
+  std::move(callback).Run(TurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
 }
 
 void SigninInterceptFirstRunExperienceDialog::
@@ -260,14 +260,14 @@
 }
 
 void SigninInterceptFirstRunExperienceDialog::DoTurnOnSync() {
-  // DiceTurnSyncOnHelper deletes itself once done.
-  new DiceTurnSyncOnHelper(
+  // TurnSyncOnHelper deletes itself once done.
+  new TurnSyncOnHelper(
       browser_->profile(),
       signin_metrics::AccessPoint::
           ACCESS_POINT_SIGNIN_INTERCEPT_FIRST_RUN_EXPERIENCE,
       signin_metrics::PromoAction::PROMO_ACTION_NO_SIGNIN_PROMO,
       signin_metrics::Reason::kSigninPrimaryAccount, account_id_,
-      DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT,
+      TurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT,
       std::make_unique<InterceptTurnSyncOnHelperDelegate>(
           weak_ptr_factory_.GetWeakPtr()),
       base::OnceClosure());
diff --git a/chrome/browser/ui/signin_intercept_first_run_experience_dialog_browsertest.cc b/chrome/browser/ui/signin_intercept_first_run_experience_dialog_browsertest.cc
index 3dbbfae..a0d7619 100644
--- a/chrome/browser/ui/signin_intercept_first_run_experience_dialog_browsertest.cc
+++ b/chrome/browser/ui/signin_intercept_first_run_experience_dialog_browsertest.cc
@@ -17,9 +17,9 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/user_education/feature_promo_controller.h"
 #include "chrome/browser/ui/views/profiles/avatar_toolbar_button.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/feature_engagement/public/feature_constants.h"
 #include "components/feature_engagement/public/tracker.h"
@@ -372,7 +372,7 @@
 }
 
 // Closes the fre dialog before the sync confirmation is shown. Tests that
-// `DiceTurnSyncOnHelper` is eventually destroyed.
+// `TurnSyncOnHelper` is eventually destroyed.
 IN_PROC_BROWSER_TEST_F(SigninInterceptFirstRunExperienceDialogBrowserTest,
                        CloseDialogBeforeSyncConfirmationIsShown) {
   // It's important to use an enterprise email here in order to block the sync
@@ -389,12 +389,12 @@
   controller()->CloseModalSignin();
   EXPECT_FALSE(controller()->ShowsModalDialog());
 
-  // `DiceTurnSyncOnHelper` should be destroyed after the sync engine is up and
+  // `TurnSyncOnHelper` should be destroyed after the sync engine is up and
   // running.
   sync_service()->SetTransportState(
       syncer::SyncService::TransportState::ACTIVE);
   sync_service()->FireStateChanged();
-  EXPECT_FALSE(DiceTurnSyncOnHelper::HasCurrentDiceTurnSyncOnHelperForTesting(
+  EXPECT_FALSE(TurnSyncOnHelper::HasCurrentTurnSyncOnHelperForTesting(
       browser()->profile()));
   // Sync is aborted.
   ExpectPrimaryAccountWithExactConsentLevel(signin::ConsentLevel::kSignin);
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
index 75c07e7..05a1f22 100644
--- a/chrome/browser/ui/tab_helpers.cc
+++ b/chrome/browser/ui/tab_helpers.cc
@@ -21,7 +21,6 @@
 #include "chrome/browser/buildflags.h"
 #include "chrome/browser/captive_portal/captive_portal_service_factory.h"
 #include "chrome/browser/chrome_content_browser_client.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/commerce/shopping_list/shopping_data_provider.h"
 #include "chrome/browser/complex_tasks/task_tab_helper.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
@@ -104,6 +103,7 @@
 #include "components/blocked_content/popup_opener_tab_helper.h"
 #include "components/captive_portal/core/buildflags.h"
 #include "components/commerce/content/metrics/commerce_metrics_tab_helper.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/content_settings/browser/page_specific_content_settings.h"
 #include "components/dom_distiller/core/dom_distiller_features.h"
 #include "components/download/content/factory/navigation_monitor_factory.h"
diff --git a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_test_base.cc b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_test_base.cc
index 8f52aab..3684bf7f 100644
--- a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_test_base.cc
+++ b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_test_base.cc
@@ -6,7 +6,6 @@
 
 #include "chrome/browser/autofill/autofill_uitest_util.h"
 #include "chrome/browser/autofill/personal_data_manager_factory.h"
-#include "chrome/browser/commerce/commerce_feature_list.h"
 #include "chrome/browser/commerce/coupons/coupon_service.h"
 #include "chrome/browser/commerce/coupons/coupon_service_factory.h"
 #include "chrome/browser/ui/browser.h"
@@ -18,6 +17,7 @@
 #include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/core/common/autofill_clock.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
+#include "components/commerce/core/commerce_feature_list.h"
 
 namespace autofill {
 
diff --git a/chrome/browser/ui/views/autofill/payments/virtual_card_enroll_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/virtual_card_enroll_bubble_views.cc
index 15fa37aa..3a81036 100644
--- a/chrome/browser/ui/views/autofill/payments/virtual_card_enroll_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/virtual_card_enroll_bubble_views.cc
@@ -47,11 +47,12 @@
   set_fixed_width(views::LayoutProvider::Get()->GetDistanceMetric(
       views::DISTANCE_BUBBLE_PREFERRED_WIDTH));
 
-  const LegalMessageLines message_lines =
-      controller_->GetVirtualCardEnrollmentFields()->legal_message_lines;
-  if (!message_lines.empty()) {
+  // TODO(crbug.com/1281695): Add issuer legal message as well to the footnote.
+  const LegalMessageLines google_legal_message =
+      controller_->GetVirtualCardEnrollmentFields()->google_legal_message;
+  if (!google_legal_message.empty()) {
     legal_message_view_ = SetFootnoteView(std::make_unique<LegalMessageView>(
-        message_lines,
+        google_legal_message,
         base::BindRepeating(&VirtualCardEnrollBubbleViews::LegalMessageClicked,
                             base::Unretained(this))));
     legal_message_view_->SetID(DialogViewId::FOOTNOTE_VIEW);
@@ -128,7 +129,7 @@
   description_view->SetBetweenChildSpacing(
       provider->GetDistanceMetric(views::DISTANCE_RELATED_BUTTON_HORIZONTAL));
 
-  VirtualCardEnrollmentFields* virtual_card_enrollment_fields =
+  const VirtualCardEnrollmentFields* virtual_card_enrollment_fields =
       controller_->GetVirtualCardEnrollmentFields();
   CreditCard* card = virtual_card_enrollment_fields->credit_card.get();
   gfx::Image* card_image = virtual_card_enrollment_fields->card_art_image.get();
@@ -206,4 +207,4 @@
     controller()->OnLinkClicked(url);
 }
 
-}  // namespace autofill
\ No newline at end of file
+}  // namespace autofill
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_view.cc b/chrome/browser/ui/views/media_router/cast_dialog_view.cc
index 828252c6..13cef21 100644
--- a/chrome/browser/ui/views/media_router/cast_dialog_view.cc
+++ b/chrome/browser/ui/views/media_router/cast_dialog_view.cc
@@ -129,8 +129,6 @@
   if (model.media_sinks().empty()) {
     scroll_position_ = 0;
     ShowNoSinksView();
-    if (sources_button_)
-      sources_button_->SetEnabled(false);
   } else {
     if (scroll_view_)
       scroll_position_ = scroll_view_->GetVisibleRect().y();
@@ -139,10 +137,16 @@
     PopulateScrollView(model.media_sinks());
     RestoreSinkListState();
     metrics_.OnSinksLoaded(base::Time::Now());
-    if (sources_button_)
-      sources_button_->SetEnabled(true);
     DisableUnsupportedSinks();
   }
+
+  // If access code casting is enabled, the sources button needs to be enabled
+  // so that user can set the source before invoking the access code casting
+  // flow.
+  if (sources_button_)
+    sources_button_->SetEnabled(!model.media_sinks().empty() ||
+                                IsAccessCodeCastingEnabled());
+
   dialog_title_ = model.dialog_header();
   MaybeSizeToContents();
   // Update the main action button.
@@ -281,9 +285,7 @@
 }
 
 void CastDialogView::MaybeShowAccessCodeCastButton() {
-  if (!base::FeatureList::IsEnabled(features::kAccessCodeCastUI))
-    return;
-  if (!GetAccessCodeCastEnabledPref(profile_->GetPrefs()))
+  if (!IsAccessCodeCastingEnabled())
     return;
 
   auto callback = base::BindRepeating(&CastDialogView::ShowAccessCodeCastDialog,
@@ -484,6 +486,11 @@
   return false;
 }
 
+bool CastDialogView::IsAccessCodeCastingEnabled() const {
+  return base::FeatureList::IsEnabled(features::kAccessCodeCastUI) &&
+         GetAccessCodeCastEnabledPref(profile_->GetPrefs());
+}
+
 // static
 CastDialogView* CastDialogView::instance_ = nullptr;
 
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_view.h b/chrome/browser/ui/views/media_router/cast_dialog_view.h
index 58327dc8..26cb499 100644
--- a/chrome/browser/ui/views/media_router/cast_dialog_view.h
+++ b/chrome/browser/ui/views/media_router/cast_dialog_view.h
@@ -199,6 +199,10 @@
   // Returns true if there are active Cast and DIAL sinks.
   bool HasCastAndDialSinks() const;
 
+  // Returns true iff feature is turned on and the access code casting policy
+  // has been enabled for this user.
+  bool IsAccessCodeCastingEnabled() const;
+
   // The singleton dialog instance. This is a nullptr when a dialog is not
   // shown.
   static CastDialogView* instance_;
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_view_unittest.cc b/chrome/browser/ui/views/media_router/cast_dialog_view_unittest.cc
index 72da955..51fc3c9b5 100644
--- a/chrome/browser/ui/views/media_router/cast_dialog_view_unittest.cc
+++ b/chrome/browser/ui/views/media_router/cast_dialog_view_unittest.cc
@@ -339,4 +339,24 @@
   EXPECT_TRUE(access_code_cast_button());
 }
 
+// This test demonstrates that when the access code casting feature is
+// available to the user, that the sources button is available even if no
+// sinks are available.
+TEST_F(CastDialogViewTest, AccessCodeEmptySinksSourcesAvailable) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(features::kAccessCodeCastUI);
+  profile_.GetPrefs()->SetBoolean(prefs::kAccessCodeCastEnabled, false);
+
+  CastDialogModel model;
+  InitializeDialogWithModel(model);
+
+  // With policy disabled, button is still disabled even with feature enabled.
+  EXPECT_FALSE(sources_button()->GetEnabled());
+
+  // But with policy enabled, button is now enabled even with no sinks.
+  profile_.GetPrefs()->SetBoolean(prefs::kAccessCodeCastEnabled, true);
+  dialog_->OnModelUpdated(model);
+  EXPECT_TRUE(sources_button()->GetEnabled());
+}
+
 }  // namespace media_router
diff --git a/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc b/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc
index 5a3bfdb..d2c28d3 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc
+++ b/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc
@@ -23,9 +23,9 @@
 #include "chrome/browser/ui/views/profiles/profile_customization_bubble_sync_controller.h"
 #include "chrome/browser/ui/views/profiles/profile_customization_bubble_view.h"
 #include "chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
 #include "chrome/browser/ui/webui/signin/signin_url_utils.h"
 #include "chrome/browser/ui/webui/signin/sync_confirmation_ui.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/webui_url_constants.h"
 #include "components/signin/public/identity_manager/account_info.h"
@@ -143,7 +143,7 @@
   // Do nothing if the sign-in flow is aborted or if this has already been
   // called. Note that this can get called first time from a special case
   // handling (such as the Settings link) and than second time when the
-  // DiceTurnSyncOnHelper finishes.
+  // TurnSyncOnHelper finishes.
   if (is_finished_)
     return;
   is_finished_ = true;
@@ -233,7 +233,7 @@
                      weak_ptr_factory_.GetWeakPtr(), BrowserOpenedCallback());
 
   // Stop with the sign-in navigation and show a spinner instead. The spinner
-  // will be shown until DiceTurnSyncOnHelper (below) figures out whether it's a
+  // will be shown until TurnSyncOnHelper (below) figures out whether it's a
   // managed account and whether sync is disabled by policies (which in some
   // cases involves fetching policies and can take a couple of seconds).
   //
@@ -253,12 +253,12 @@
       FROM_HERE, extended_account_info_timeout_closure_.callback(),
       extended_account_info_timeout_);
 
-  // DiceTurnSyncOnHelper deletes itself once done.
-  new DiceTurnSyncOnHelper(
+  // TurnSyncOnHelper deletes itself once done.
+  new TurnSyncOnHelper(
       profile_, signin_metrics::AccessPoint::ACCESS_POINT_USER_MANAGER,
       signin_metrics::PromoAction::PROMO_ACTION_NO_SIGNIN_PROMO,
       signin_metrics::Reason::kSigninPrimaryAccount, account_info.account_id,
-      DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT,
+      TurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT,
       std::make_unique<ProfilePickerTurnSyncOnDelegate>(
           weak_ptr_factory_.GetWeakPtr(), profile_),
       std::move(sync_consent_completed_closure));
diff --git a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc
index b26cda1..9dc47745 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc
+++ b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc
@@ -78,28 +78,28 @@
   // Open the browser and when it's done, show the login error.
   if (controller_) {
     controller_->FinishAndOpenBrowser(base::BindOnce(
-        &DiceTurnSyncOnHelper::Delegate::ShowLoginErrorForBrowser, error));
+        &TurnSyncOnHelper::Delegate::ShowLoginErrorForBrowser, error));
   }
 }
 
 void ProfilePickerTurnSyncOnDelegate::ShowMergeSyncDataConfirmation(
     const std::string& previous_email,
     const std::string& new_email,
-    DiceTurnSyncOnHelper::SigninChoiceCallback callback) {
+    TurnSyncOnHelper::SigninChoiceCallback callback) {
   // A brand new profile cannot have a conflict in sync accounts.
   NOTREACHED();
 }
 
 void ProfilePickerTurnSyncOnDelegate::ShowEnterpriseAccountConfirmation(
     const AccountInfo& account_info,
-    DiceTurnSyncOnHelper::SigninChoiceCallback callback) {
+    TurnSyncOnHelper::SigninChoiceCallback callback) {
   enterprise_account_ = true;
   // In this flow, the enterprise confirmation is replaced by an enterprise
   // welcome screen. Knowing if sync is enabled is needed for the screen. Thus,
   // it is delayed until either ShowSyncConfirmation() or
   // ShowSyncDisabledConfirmation() gets called.
   // Assume an implicit "Continue" here.
-  std::move(callback).Run(DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
+  std::move(callback).Run(TurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
   return;
 }
 
@@ -194,7 +194,7 @@
     EnterpriseProfileWelcomeUI::ScreenType type,
     bool proceed) {
   if (!proceed) {
-    // The callback provided by DiceTurnSyncOnHelper must be called, UI_CLOSED
+    // The callback provided by TurnSyncOnHelper must be called, UI_CLOSED
     // makes sure the final callback does not get called. It does not matter
     // what happens to sync as the signed-in profile creation gets cancelled
     // right after.
diff --git a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h
index 1b083c1..edcf209 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h
+++ b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h
@@ -11,16 +11,16 @@
 #include "chrome/browser/profiles/profile_metrics.h"
 #include "chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.h"
 #include "chrome/browser/ui/views/profiles/profile_picker_view.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
 #include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 
 class Profile;
 class SigninUIError;
 
 // Handles turning on sync for signed-in profile creation flow, embedded in the
 // profile picker.
-class ProfilePickerTurnSyncOnDelegate : public DiceTurnSyncOnHelper::Delegate,
+class ProfilePickerTurnSyncOnDelegate : public TurnSyncOnHelper::Delegate,
                                         public LoginUIService::Observer {
  public:
   ProfilePickerTurnSyncOnDelegate(
@@ -33,15 +33,15 @@
       const ProfilePickerTurnSyncOnDelegate&) = delete;
 
  private:
-  // DiceTurnSyncOnHelper::Delegate:
+  // TurnSyncOnHelper::Delegate:
   void ShowLoginError(const SigninUIError& error) override;
   void ShowMergeSyncDataConfirmation(
       const std::string& previous_email,
       const std::string& new_email,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) override;
+      TurnSyncOnHelper::SigninChoiceCallback callback) override;
   void ShowEnterpriseAccountConfirmation(
       const AccountInfo& account_info,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) override;
+      TurnSyncOnHelper::SigninChoiceCallback callback) override;
   void ShowSyncConfirmation(
       base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
           callback) override;
diff --git a/chrome/browser/ui/web_applications/web_app_file_handling_browsertest.cc b/chrome/browser/ui/web_applications/web_app_file_handling_browsertest.cc
index f00d200c..0acd06f 100644
--- a/chrome/browser/ui/web_applications/web_app_file_handling_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_file_handling_browsertest.cc
@@ -671,6 +671,8 @@
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
+// TODO(crbug/1288442): re-enable these tests
+#if !BUILDFLAG(IS_CHROMEOS)
 // This test fixture will run the PRE_ test with the feature disabled, then the
 // main test with the feature enabled. If a FH app was installed when the
 // feature was disabled, then the feature becomes enabled, it should be
@@ -742,5 +744,6 @@
   EXPECT_EQ(0, added_count_);
   EXPECT_EQ(1, removed_count_);
 }
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace web_app
diff --git a/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc b/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc
index 082dbe5e..6fafb38 100644
--- a/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc
+++ b/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc
@@ -308,6 +308,19 @@
     }
   }
 
+  // If there is already a route for this sink_id, then terminate the existing
+  // route before starting a new one.
+  auto routes = media_router_->GetCurrentRoutes();
+  auto route_it = std::find_if(routes.begin(), routes.end(),
+                               [this](const MediaRoute& route) {
+                                 return route.media_sink_id() == *sink_id_;
+                               });
+  const MediaRoute* current_route =
+      route_it == routes.end() ? nullptr : &*route_it;
+  if (current_route) {
+    media_router_->TerminateRoute(current_route->media_route_id());
+  }
+
   media_router_->CreateRoute(
       params->source_id, sink_id_.value(), params->origin, web_contents_,
       base::BindOnce(&AccessCodeCastHandler::OnRouteResponse,
diff --git a/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler_unittest.cc b/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler_unittest.cc
index daa4b73..2a4882d8 100644
--- a/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler_unittest.cc
+++ b/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler_unittest.cc
@@ -102,6 +102,9 @@
 
     InitializeMockMediaRouter();
 
+    cast_sink_1_ = CreateCastSink(1);
+    cast_sink_2_ = CreateCastSink(2);
+
     CreateSessionServiceTabHelper(web_contents());
 
     CreateHandler({MediaCastMode::DESKTOP_MIRROR});
@@ -163,15 +166,14 @@
     CreateHandler(cast_modes);
     set_screen_capture_allowed_for_testing(true);
 
-    MediaSinkInternal cast_sink1 = CreateCastSink(1);
     for (MediaSinksObserver* sinks_observer : media_sinks_observers_) {
-      sinks_observer->OnSinksUpdated({cast_sink1.sink()},
+      sinks_observer->OnSinksUpdated({cast_sink_1().sink()},
                                      std::vector<url::Origin>());
     }
-    handler()->set_sink_id_for_testing(cast_sink1.sink().id());
+    handler()->set_sink_id_for_testing(cast_sink_1().sink().id());
 
     EXPECT_CALL(*router(),
-                CreateRouteInternal(source.id(), cast_sink1.sink().id(), _,
+                CreateRouteInternal(source.id(), cast_sink_1().sink().id(), _,
                                     web_contents(), _, timeout, false));
 
     handler()->CastToSink(mock_callback.Get());
@@ -184,18 +186,17 @@
     CreateHandler({MediaCastMode::PRESENTATION, MediaCastMode::TAB_MIRROR},
                   std::move(start_presentation_context));
 
-    MediaSinkInternal cast_sink1 = CreateCastSink(1);
     for (MediaSinksObserver* sinks_observer : media_sinks_observers_) {
-      sinks_observer->OnSinksUpdated({cast_sink1.sink()},
+      sinks_observer->OnSinksUpdated({cast_sink_1().sink()},
                                      {request.frame_origin});
     }
-    handler()->set_sink_id_for_testing(cast_sink1.sink().id());
+    handler()->set_sink_id_for_testing(cast_sink_1().sink().id());
 
     auto source =
         MediaSource::ForPresentationUrl(*(request.presentation_urls.begin()));
 
     EXPECT_CALL(*router(),
-                CreateRouteInternal(source.id(), cast_sink1.sink().id(),
+                CreateRouteInternal(source.id(), cast_sink_1().sink().id(),
                                     request.frame_origin, web_contents(), _,
                                     base::Seconds(20), false));
     handler()->CastToSink(mock_callback.Get());
@@ -211,6 +212,9 @@
         presentation_request, std::move(success_cb), std::move(error_cb));
   }
 
+  const MediaSinkInternal& cast_sink_1() { return cast_sink_1_; }
+  const MediaSinkInternal& cast_sink_2() { return cast_sink_2_; }
+
  private:
   void InitializeMockMediaRouter() {
     router_ = static_cast<MockMediaRouter*>(
@@ -236,6 +240,10 @@
             media_sinks_observers_.erase(it);
           }
         });
+
+    ON_CALL(*router_, GetCurrentRoutes())
+        .WillByDefault(Return(std::vector<MediaRoute>()));
+
     // Handler so MockMediaRouter will respond to requests to create a route.
     // Will construct a RouteRequestResult based on the set result code and
     // then call the handler's callback, which should call the page's callback.
@@ -294,6 +302,8 @@
   std::vector<MediaSinksObserver*> media_sinks_observers_;
   RouteRequestResult::ResultCode result_code_ =
       RouteRequestResult::ResultCode::OK;
+  MediaSinkInternal cast_sink_1_;
+  MediaSinkInternal cast_sink_2_;
 };
 
 TEST_F(AccessCodeCastHandlerTest, DiscoveryDeviceMissingWithOk) {
@@ -319,12 +329,11 @@
   handler()->OnAccessCodeValidated(discovery_device_proto,
                                    AddSinkResultCode::OK);
 
-  MediaSinkInternal cast_sink1 = CreateCastSink(1);
-  handler()->HandleSinkPresentInMediaRouter(cast_sink1, true);
+  handler()->HandleSinkPresentInMediaRouter(cast_sink_1(), true);
 
   // Validate that the sink id of the discovered device is stored for later
   // casting.
-  EXPECT_EQ(cast_sink1.sink().id(), handler()->sink_id_);
+  EXPECT_EQ(cast_sink_1().sink().id(), handler()->sink_id_);
 }
 
 TEST_F(AccessCodeCastHandlerTest, InvalidDiscoveryDevice) {
@@ -360,11 +369,10 @@
   EXPECT_CALL(mock_callback, Run(AddSinkResultCode::OK));
   handler()->SetSinkCallbackForTesting(mock_callback.Get());
 
-  MediaSinkInternal cast_sink1 = CreateCastSink(1);
-  MediaSinkWithCastModes sink_with_cast_modes(cast_sink1.sink());
+  MediaSinkWithCastModes sink_with_cast_modes(cast_sink_1().sink());
   sink_with_cast_modes.cast_modes = {MediaCastMode::DESKTOP_MIRROR};
 
-  handler()->set_sink_id_for_testing(cast_sink1.sink().id());
+  handler()->set_sink_id_for_testing(cast_sink_1().sink().id());
   handler()->OnResultsUpdated({sink_with_cast_modes});
 }
 
@@ -375,11 +383,9 @@
   EXPECT_CALL(mock_callback, Run(_)).Times(Exactly(0));
   handler()->SetSinkCallbackForTesting(mock_callback.Get());
 
-  MediaSinkInternal cast_sink1 = CreateCastSink(1);
-  handler()->set_sink_id_for_testing(cast_sink1.sink().id());
+  handler()->set_sink_id_for_testing(cast_sink_1().sink().id());
 
-  MediaSinkInternal cast_sink2 = CreateCastSink(2);
-  MediaSinkWithCastModes sink_with_cast_modes(cast_sink2.sink());
+  MediaSinkWithCastModes sink_with_cast_modes(cast_sink_2().sink());
   sink_with_cast_modes.cast_modes = {MediaCastMode::DESKTOP_MIRROR};
 
   handler()->OnResultsUpdated({sink_with_cast_modes});
@@ -478,4 +484,42 @@
                     mock_callback);
 }
 
+// Starting a casting session on a sink that has an existing route will cause
+// the current route to be terminate before the new route is created.
+TEST_F(AccessCodeCastHandlerTest, TerminateExistingRoute) {
+  MediaSource existing_source = MediaSource::ForTab(
+      sessions::SessionTabHelper::IdForTab(web_contents()).id());
+  MediaRoute::Id route_id = MediaRoute::GetMediaRouteId(
+      "presentation", cast_sink_1().id(), existing_source);
+  MediaRoute existing_route(route_id, existing_source, cast_sink_1().id(),
+                            "TerminateExistingRoute", false);
+  EXPECT_CALL(*router(), GetCurrentRoutes())
+      .WillOnce(Return(std::vector<MediaRoute>{existing_route}));
+  EXPECT_CALL(*router(), TerminateRoute(route_id));
+
+  set_expected_cast_result(RouteRequestResult::ResultCode::OK);
+  MockCastToSinkCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run(RouteRequestResultCode::OK));
+  StartDesktopMirroring(MediaSource::ForUnchosenDesktop(), mock_callback);
+}
+
+// Starting a casting session when there are routes that exist for other sinks.
+// Demonstrate that those routes aren't terminated.
+TEST_F(AccessCodeCastHandlerTest, IgnoreOtherRoutes) {
+  MediaSource existing_source = MediaSource::ForTab(
+      sessions::SessionTabHelper::IdForTab(web_contents()).id());
+  MediaRoute::Id route_id = MediaRoute::GetMediaRouteId(
+      "presentation", cast_sink_2().id(), existing_source);
+  MediaRoute existing_route(route_id, existing_source, cast_sink_2().id(),
+                            "TerminateExistingRoute", false);
+  EXPECT_CALL(*router(), GetCurrentRoutes())
+      .WillOnce(Return(std::vector<MediaRoute>{existing_route}));
+  EXPECT_CALL(*router(), TerminateRoute(_)).Times(0);
+
+  set_expected_cast_result(RouteRequestResult::ResultCode::OK);
+  MockCastToSinkCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run(RouteRequestResultCode::OK));
+  StartDesktopMirroring(MediaSource::ForUnchosenDesktop(), mock_callback);
+}
+
 }  // namespace media_router
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
index 48cd0950..f0365380 100644
--- a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
@@ -52,13 +52,13 @@
 #include "chrome/browser/ui/tab_modal_confirm_dialog.h"
 #include "chrome/browser/ui/tab_modal_confirm_dialog_delegate.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
 #include "chrome/browser/ui/webui/signin/signin_ui_error.h"
 #include "chrome/browser/ui/webui/signin/signin_utils.h"
 #include "chrome/browser/ui/webui/signin/signin_utils_desktop.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/chromium_strings.h"
@@ -113,13 +113,13 @@
   }
 }
 
-// Specific implementation of DiceTurnSyncOnHelper::Delegate for forced
+// Specific implementation of TurnSyncOnHelper::Delegate for forced
 // signin flows. Some confirmation prompts are skipped.
-class ForcedSigninDiceTurnSyncOnHelperDelegate
-    : public DiceTurnSyncOnHelperDelegateImpl {
+class ForcedSigninTurnSyncOnHelperDelegate
+    : public TurnSyncOnHelperDelegateImpl {
  public:
-  explicit ForcedSigninDiceTurnSyncOnHelperDelegate(Browser* browser)
-      : DiceTurnSyncOnHelperDelegateImpl(browser) {}
+  explicit ForcedSigninTurnSyncOnHelperDelegate(Browser* browser)
+      : TurnSyncOnHelperDelegateImpl(browser) {}
 
  protected:
   void ShouldEnterpriseConfirmationPromptForNewProfile(
@@ -132,7 +132,7 @@
   void ShowMergeSyncDataConfirmation(
       const std::string& previous_email,
       const std::string& new_email,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) override {
+      TurnSyncOnHelper::SigninChoiceCallback callback) override {
     NOTREACHED();
   }
 };
@@ -455,15 +455,14 @@
           signin_metrics::SourceForRefreshTokenOperation::
               kInlineLoginHandler_Signin);
 
-  std::unique_ptr<DiceTurnSyncOnHelper::Delegate> delegate =
-      std::make_unique<ForcedSigninDiceTurnSyncOnHelperDelegate>(browser);
+  std::unique_ptr<TurnSyncOnHelper::Delegate> delegate =
+      std::make_unique<ForcedSigninTurnSyncOnHelperDelegate>(browser);
 
-  new DiceTurnSyncOnHelper(
+  new TurnSyncOnHelper(
       profile_, signin::GetAccessPointForEmbeddedPromoURL(current_url_),
       signin_metrics::PromoAction::PROMO_ACTION_NO_SIGNIN_PROMO,
       signin::GetSigninReasonForEmbeddedPromoURL(current_url_), account_id,
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT,
-      std::move(delegate),
+      TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT, std::move(delegate),
       base::BindOnce(&OnSigninComplete, profile_, email_, password_,
                      is_force_sign_in_with_usermanager_));
 }
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc b/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc
similarity index 80%
rename from chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
rename to chrome/browser/ui/webui/signin/turn_sync_on_helper.cc
index 9269150..022a8d9 100644
--- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
+++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 
 #include <utility>
 
@@ -56,49 +56,46 @@
 
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
 #include "chrome/browser/signin/dice_signed_in_profile_creator.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.h"
 #endif
 
 namespace {
 
-const void* const kCurrentDiceTurnSyncOnHelperKey =
-    &kCurrentDiceTurnSyncOnHelperKey;
+const void* const kCurrentTurnSyncOnHelperKey = &kCurrentTurnSyncOnHelperKey;
 bool g_show_sync_enabled_ui_for_testing_ = false;
 
 // A helper class to watch profile lifetime.
-class DiceTurnSyncOnHelperShutdownNotifierFactory
+class TurnSyncOnHelperShutdownNotifierFactory
     : public BrowserContextKeyedServiceShutdownNotifierFactory {
  public:
-  DiceTurnSyncOnHelperShutdownNotifierFactory(
-      const DiceTurnSyncOnHelperShutdownNotifierFactory&) = delete;
-  DiceTurnSyncOnHelperShutdownNotifierFactory& operator=(
-      const DiceTurnSyncOnHelperShutdownNotifierFactory&) = delete;
+  TurnSyncOnHelperShutdownNotifierFactory(
+      const TurnSyncOnHelperShutdownNotifierFactory&) = delete;
+  TurnSyncOnHelperShutdownNotifierFactory& operator=(
+      const TurnSyncOnHelperShutdownNotifierFactory&) = delete;
 
-  static DiceTurnSyncOnHelperShutdownNotifierFactory* GetInstance() {
-    static base::NoDestructor<DiceTurnSyncOnHelperShutdownNotifierFactory>
-        factory;
+  static TurnSyncOnHelperShutdownNotifierFactory* GetInstance() {
+    static base::NoDestructor<TurnSyncOnHelperShutdownNotifierFactory> factory;
     return factory.get();
   }
 
  private:
-  friend class base::NoDestructor<DiceTurnSyncOnHelperShutdownNotifierFactory>;
+  friend class base::NoDestructor<TurnSyncOnHelperShutdownNotifierFactory>;
 
-  DiceTurnSyncOnHelperShutdownNotifierFactory()
+  TurnSyncOnHelperShutdownNotifierFactory()
       : BrowserContextKeyedServiceShutdownNotifierFactory(
-            "DiceTurnSyncOnHelperShutdownNotifier") {
+            "TurnSyncOnHelperShutdownNotifier") {
     DependsOn(IdentityManagerFactory::GetInstance());
     DependsOn(SyncServiceFactory::GetInstance());
     DependsOn(UnifiedConsentServiceFactory::GetInstance());
     DependsOn(policy::UserPolicySigninServiceFactory::GetInstance());
   }
-  ~DiceTurnSyncOnHelperShutdownNotifierFactory() override {}
+  ~TurnSyncOnHelperShutdownNotifierFactory() override {}
 };
 
 // User input handler for the signin confirmation dialog.
 class SigninDialogDelegate : public ui::ProfileSigninConfirmationDelegate {
  public:
-  explicit SigninDialogDelegate(
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback)
+  explicit SigninDialogDelegate(TurnSyncOnHelper::SigninChoiceCallback callback)
       : callback_(std::move(callback)) {
     DCHECK(callback_);
   }
@@ -108,66 +105,64 @@
 
   void OnCancelSignin() override {
     DCHECK(callback_);
-    std::move(callback_).Run(DiceTurnSyncOnHelper::SIGNIN_CHOICE_CANCEL);
+    std::move(callback_).Run(TurnSyncOnHelper::SIGNIN_CHOICE_CANCEL);
   }
 
   void OnContinueSignin() override {
     DCHECK(callback_);
-    std::move(callback_).Run(DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
+    std::move(callback_).Run(TurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
   }
 
   void OnSigninWithNewProfile() override {
     DCHECK(callback_);
-    std::move(callback_).Run(DiceTurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE);
+    std::move(callback_).Run(TurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE);
   }
 
  private:
-  DiceTurnSyncOnHelper::SigninChoiceCallback callback_;
+  TurnSyncOnHelper::SigninChoiceCallback callback_;
 };
 
-struct CurrentDiceTurnSyncOnHelperUserData
-    : public base::SupportsUserData::Data {
-  DiceTurnSyncOnHelper* current_helper = nullptr;
+struct CurrentTurnSyncOnHelperUserData : public base::SupportsUserData::Data {
+  TurnSyncOnHelper* current_helper = nullptr;
 };
 
-DiceTurnSyncOnHelper* GetCurrentDiceTurnSyncOnHelper(Profile* profile) {
+TurnSyncOnHelper* GetCurrentTurnSyncOnHelper(Profile* profile) {
   base::SupportsUserData::Data* data =
-      profile->GetUserData(kCurrentDiceTurnSyncOnHelperKey);
+      profile->GetUserData(kCurrentTurnSyncOnHelperKey);
   if (!data)
     return nullptr;
-  CurrentDiceTurnSyncOnHelperUserData* wrapper =
-      static_cast<CurrentDiceTurnSyncOnHelperUserData*>(data);
-  DiceTurnSyncOnHelper* helper = wrapper->current_helper;
+  CurrentTurnSyncOnHelperUserData* wrapper =
+      static_cast<CurrentTurnSyncOnHelperUserData*>(data);
+  TurnSyncOnHelper* helper = wrapper->current_helper;
   DCHECK(helper);
   return helper;
 }
 
-void SetCurrentDiceTurnSyncOnHelper(Profile* profile,
-                                    DiceTurnSyncOnHelper* helper) {
+void SetCurrentTurnSyncOnHelper(Profile* profile, TurnSyncOnHelper* helper) {
   if (!helper) {
-    DCHECK(profile->GetUserData(kCurrentDiceTurnSyncOnHelperKey));
-    profile->RemoveUserData(kCurrentDiceTurnSyncOnHelperKey);
+    DCHECK(profile->GetUserData(kCurrentTurnSyncOnHelperKey));
+    profile->RemoveUserData(kCurrentTurnSyncOnHelperKey);
     return;
   }
 
-  DCHECK(!profile->GetUserData(kCurrentDiceTurnSyncOnHelperKey));
-  std::unique_ptr<CurrentDiceTurnSyncOnHelperUserData> wrapper =
-      std::make_unique<CurrentDiceTurnSyncOnHelperUserData>();
+  DCHECK(!profile->GetUserData(kCurrentTurnSyncOnHelperKey));
+  std::unique_ptr<CurrentTurnSyncOnHelperUserData> wrapper =
+      std::make_unique<CurrentTurnSyncOnHelperUserData>();
   wrapper->current_helper = helper;
-  profile->SetUserData(kCurrentDiceTurnSyncOnHelperKey, std::move(wrapper));
+  profile->SetUserData(kCurrentTurnSyncOnHelperKey, std::move(wrapper));
 }
 
 }  // namespace
 
 // static
-void DiceTurnSyncOnHelper::Delegate::ShowLoginErrorForBrowser(
+void TurnSyncOnHelper::Delegate::ShowLoginErrorForBrowser(
     const SigninUIError& error,
     Browser* browser) {
   LoginUIServiceFactory::GetForProfile(browser->profile())
       ->DisplayLoginResult(browser, error);
 }
 
-DiceTurnSyncOnHelper::DiceTurnSyncOnHelper(
+TurnSyncOnHelper::TurnSyncOnHelper(
     Profile* profile,
     signin_metrics::AccessPoint signin_access_point,
     signin_metrics::PromoAction signin_promo_action,
@@ -187,9 +182,9 @@
           identity_manager_->FindExtendedAccountInfoByAccountId(account_id)),
       scoped_callback_runner_(std::move(callback)),
       shutdown_subscription_(
-          DiceTurnSyncOnHelperShutdownNotifierFactory::GetInstance()
+          TurnSyncOnHelperShutdownNotifierFactory::GetInstance()
               ->Get(profile)
-              ->Subscribe(base::BindOnce(&DiceTurnSyncOnHelper::AbortAndDelete,
+              ->Subscribe(base::BindOnce(&TurnSyncOnHelper::AbortAndDelete,
                                          base::Unretained(this)))) {
   DCHECK(delegate_);
   DCHECK(profile_);
@@ -211,7 +206,7 @@
   if (HasCanOfferSigninError()) {
     // Do not self-destruct synchronously in the constructor.
     base::SequencedTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(&DiceTurnSyncOnHelper::AbortAndDelete,
+        FROM_HERE, base::BindOnce(&TurnSyncOnHelper::AbortAndDelete,
                                   weak_pointer_factory_.GetWeakPtr()));
     return;
   }
@@ -229,12 +224,12 @@
       profile_->GetPrefs()->GetString(prefs::kGoogleServicesLastUsername);
   delegate_->ShowMergeSyncDataConfirmation(
       last_email, account_info_.email,
-      base::BindOnce(&DiceTurnSyncOnHelper::OnMergeAccountConfirmation,
+      base::BindOnce(&TurnSyncOnHelper::OnMergeAccountConfirmation,
                      weak_pointer_factory_.GetWeakPtr()));
 }
 
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
-DiceTurnSyncOnHelper::DiceTurnSyncOnHelper(
+TurnSyncOnHelper::TurnSyncOnHelper(
     Profile* profile,
     Browser* browser,
     signin_metrics::AccessPoint signin_access_point,
@@ -242,23 +237,22 @@
     signin_metrics::Reason signin_reason,
     const CoreAccountId& account_id,
     SigninAbortedMode signin_aborted_mode)
-    : DiceTurnSyncOnHelper(
-          profile,
-          signin_access_point,
-          signin_promo_action,
-          signin_reason,
-          account_id,
-          signin_aborted_mode,
-          std::make_unique<DiceTurnSyncOnHelperDelegateImpl>(browser),
-          base::OnceClosure()) {}
+    : TurnSyncOnHelper(profile,
+                       signin_access_point,
+                       signin_promo_action,
+                       signin_reason,
+                       account_id,
+                       signin_aborted_mode,
+                       std::make_unique<TurnSyncOnHelperDelegateImpl>(browser),
+                       base::OnceClosure()) {}
 #endif
 
-DiceTurnSyncOnHelper::~DiceTurnSyncOnHelper() {
-  DCHECK_EQ(this, GetCurrentDiceTurnSyncOnHelper(profile_));
-  SetCurrentDiceTurnSyncOnHelper(profile_, nullptr);
+TurnSyncOnHelper::~TurnSyncOnHelper() {
+  DCHECK_EQ(this, GetCurrentTurnSyncOnHelper(profile_));
+  SetCurrentTurnSyncOnHelper(profile_, nullptr);
 }
 
-bool DiceTurnSyncOnHelper::HasCanOfferSigninError() {
+bool TurnSyncOnHelper::HasCanOfferSigninError() {
   SigninUIError can_offer_error =
       CanOfferSignin(profile_, account_info_.gaia, account_info_.email);
   if (can_offer_error.IsOk())
@@ -269,7 +263,7 @@
   return true;
 }
 
-void DiceTurnSyncOnHelper::OnMergeAccountConfirmation(SigninChoice choice) {
+void TurnSyncOnHelper::OnMergeAccountConfirmation(SigninChoice choice) {
   switch (choice) {
     case SIGNIN_CHOICE_NEW_PROFILE:
       base::RecordAction(
@@ -293,8 +287,7 @@
   }
 }
 
-void DiceTurnSyncOnHelper::OnEnterpriseAccountConfirmation(
-    SigninChoice choice) {
+void TurnSyncOnHelper::OnEnterpriseAccountConfirmation(SigninChoice choice) {
   enterprise_account_confirmed_ =
       choice == SIGNIN_CHOICE_CONTINUE || choice == SIGNIN_CHOICE_NEW_PROFILE;
   signin_util::RecordEnterpriseProfileCreationUserChoice(
@@ -323,7 +316,7 @@
   }
 }
 
-void DiceTurnSyncOnHelper::TurnSyncOnWithProfileMode(ProfileMode profile_mode) {
+void TurnSyncOnHelper::TurnSyncOnWithProfileMode(ProfileMode profile_mode) {
   switch (profile_mode) {
     case ProfileMode::CURRENT_PROFILE: {
       // If this is a new signin (no account authenticated yet) try loading
@@ -333,7 +326,7 @@
           policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
       policy_service->RegisterForPolicyWithAccountId(
           account_info_.email, account_info_.account_id,
-          base::BindOnce(&DiceTurnSyncOnHelper::OnRegisteredForPolicy,
+          base::BindOnce(&TurnSyncOnHelper::OnRegisteredForPolicy,
                          weak_pointer_factory_.GetWeakPtr()));
       break;
     }
@@ -348,8 +341,8 @@
   }
 }
 
-void DiceTurnSyncOnHelper::OnRegisteredForPolicy(const std::string& dm_token,
-                                                 const std::string& client_id) {
+void TurnSyncOnHelper::OnRegisteredForPolicy(const std::string& dm_token,
+                                             const std::string& client_id) {
   // If there's no token for the user (policy registration did not succeed) just
   // finish signing in.
   if (dm_token.empty()) {
@@ -369,7 +362,7 @@
     // Allow user to create a new profile before continuing with sign-in.
     delegate_->ShowEnterpriseAccountConfirmation(
         account_info_,
-        base::BindOnce(&DiceTurnSyncOnHelper::OnEnterpriseAccountConfirmation,
+        base::BindOnce(&TurnSyncOnHelper::OnEnterpriseAccountConfirmation,
                        weak_pointer_factory_.GetWeakPtr()));
     return;
   }
@@ -378,7 +371,7 @@
   LoadPolicyWithCachedCredentials();
 }
 
-void DiceTurnSyncOnHelper::LoadPolicyWithCachedCredentials() {
+void TurnSyncOnHelper::LoadPolicyWithCachedCredentials() {
   DCHECK(!dm_token_.empty());
   DCHECK(!client_id_.empty());
   policy::UserPolicySigninService* policy_service =
@@ -387,11 +380,11 @@
       AccountIdFromAccountInfo(account_info_), dm_token_, client_id_,
       profile_->GetDefaultStoragePartition()
           ->GetURLLoaderFactoryForBrowserProcess(),
-      base::BindOnce(&DiceTurnSyncOnHelper::OnPolicyFetchComplete,
+      base::BindOnce(&TurnSyncOnHelper::OnPolicyFetchComplete,
                      weak_pointer_factory_.GetWeakPtr()));
 }
 
-void DiceTurnSyncOnHelper::OnPolicyFetchComplete(bool success) {
+void TurnSyncOnHelper::OnPolicyFetchComplete(bool success) {
   // For now, we allow signin to complete even if the policy fetch fails. If
   // we ever want to change this behavior, we could call
   // PrimaryAccountMutator::ClearPrimaryAccount() here instead.
@@ -407,7 +400,7 @@
   SigninAndShowSyncConfirmationUI();
 }
 
-void DiceTurnSyncOnHelper::OnProviderUpdatePropagated(
+void TurnSyncOnHelper::OnProviderUpdatePropagated(
     policy::ConfigurationPolicyProvider* provider) {
   if (provider != profile_->GetUserCloudPolicyManager())
     return;
@@ -421,7 +414,7 @@
       ->RemoveProviderUpdateObserver(this);
 }
 
-void DiceTurnSyncOnHelper::CreateNewSignedInProfile() {
+void TurnSyncOnHelper::CreateNewSignedInProfile() {
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
   DCHECK(!dice_signed_in_profile_creator_);
   // Unretained is fine because the profile creator is owned by this.
@@ -430,20 +423,20 @@
           profile_, account_info_.account_id,
           /*local_profile_name=*/std::u16string(), /*icon_index=*/absl::nullopt,
           /*use_guest=*/false,
-          base::BindOnce(&DiceTurnSyncOnHelper::OnNewSignedInProfileCreated,
+          base::BindOnce(&TurnSyncOnHelper::OnNewSignedInProfileCreated,
                          base::Unretained(this)));
 #else
   NOTIMPLEMENTED() << "Creating profiles is not yet supported on lacros.";
 #endif
 }
 
-syncer::SyncService* DiceTurnSyncOnHelper::GetSyncService() {
+syncer::SyncService* TurnSyncOnHelper::GetSyncService() {
   return SyncServiceFactory::IsSyncAllowed(profile_)
              ? SyncServiceFactory::GetForProfile(profile_)
              : nullptr;
 }
 
-void DiceTurnSyncOnHelper::OnNewSignedInProfileCreated(Profile* new_profile) {
+void TurnSyncOnHelper::OnNewSignedInProfileCreated(Profile* new_profile) {
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
   DCHECK(dice_signed_in_profile_creator_);
   dice_signed_in_profile_creator_.reset();
@@ -474,7 +467,7 @@
 #endif
 }
 
-void DiceTurnSyncOnHelper::SigninAndShowSyncConfirmationUI() {
+void TurnSyncOnHelper::SigninAndShowSyncConfirmationUI() {
   // Signin.
   auto* primary_account_mutator = identity_manager_->GetPrimaryAccountMutator();
   primary_account_mutator->SetPrimaryAccount(account_info_.account_id,
@@ -538,34 +531,33 @@
   ShowSyncConfirmationUI();
 }
 
-void DiceTurnSyncOnHelper::SyncStartupCompleted() {
+void TurnSyncOnHelper::SyncStartupCompleted() {
   DCHECK(sync_startup_tracker_);
   sync_startup_tracker_.reset();
   ShowSyncConfirmationUI();
 }
 
-void DiceTurnSyncOnHelper::SyncStartupFailed() {
+void TurnSyncOnHelper::SyncStartupFailed() {
   DCHECK(sync_startup_tracker_);
   sync_startup_tracker_.reset();
   ShowSyncConfirmationUI();
 }
 
 // static
-void DiceTurnSyncOnHelper::SetShowSyncEnabledUiForTesting(
+void TurnSyncOnHelper::SetShowSyncEnabledUiForTesting(
     bool show_sync_enabled_ui_for_testing) {
   g_show_sync_enabled_ui_for_testing_ = show_sync_enabled_ui_for_testing;
 }
 
 // static
-bool DiceTurnSyncOnHelper::HasCurrentDiceTurnSyncOnHelperForTesting(
-    Profile* profile) {
-  return !!GetCurrentDiceTurnSyncOnHelper(profile);
+bool TurnSyncOnHelper::HasCurrentTurnSyncOnHelperForTesting(Profile* profile) {
+  return !!GetCurrentTurnSyncOnHelper(profile);
 }
 
-void DiceTurnSyncOnHelper::ShowSyncConfirmationUI() {
+void TurnSyncOnHelper::ShowSyncConfirmationUI() {
   if (g_show_sync_enabled_ui_for_testing_ || GetSyncService()) {
     delegate_->ShowSyncConfirmation(
-        base::BindOnce(&DiceTurnSyncOnHelper::FinishSyncSetupAndDelete,
+        base::BindOnce(&TurnSyncOnHelper::FinishSyncSetupAndDelete,
                        weak_pointer_factory_.GetWeakPtr()));
   } else {
     // The sync disabled dialog has an explicit "sign-out" label for the
@@ -579,12 +571,12 @@
                   account_info_.email);
     delegate_->ShowSyncDisabledConfirmation(
         is_managed_account,
-        base::BindOnce(&DiceTurnSyncOnHelper::FinishSyncSetupAndDelete,
+        base::BindOnce(&TurnSyncOnHelper::FinishSyncSetupAndDelete,
                        weak_pointer_factory_.GetWeakPtr()));
   }
 }
 
-void DiceTurnSyncOnHelper::FinishSyncSetupAndDelete(
+void TurnSyncOnHelper::FinishSyncSetupAndDelete(
     LoginUIService::SyncConfirmationUIClosedResult result) {
   unified_consent::UnifiedConsentService* consent_service =
       UnifiedConsentServiceFactory::GetForProfile(profile_);
@@ -640,29 +632,28 @@
   delete this;
 }
 
-void DiceTurnSyncOnHelper::SwitchToProfile(Profile* new_profile) {
+void TurnSyncOnHelper::SwitchToProfile(Profile* new_profile) {
   DCHECK(!sync_blocker_);
   DCHECK(!sync_startup_tracker_);
 
   policy::UserPolicySigninServiceFactory::GetForProfile(profile_)
       ->ShutdownUserCloudPolicyManager();
-  SetCurrentDiceTurnSyncOnHelper(profile_, nullptr);  // Detach from old profile
+  SetCurrentTurnSyncOnHelper(profile_, nullptr);  // Detach from old profile
   profile_ = new_profile;
   AttachToProfile();
 
   identity_manager_ = IdentityManagerFactory::GetForProfile(profile_);
   shutdown_subscription_ =
-      DiceTurnSyncOnHelperShutdownNotifierFactory::GetInstance()
+      TurnSyncOnHelperShutdownNotifierFactory::GetInstance()
           ->Get(profile_)
-          ->Subscribe(base::BindOnce(&DiceTurnSyncOnHelper::AbortAndDelete,
+          ->Subscribe(base::BindOnce(&TurnSyncOnHelper::AbortAndDelete,
                                      base::Unretained(this)));
   delegate_->SwitchToProfile(new_profile);
 }
 
-void DiceTurnSyncOnHelper::AttachToProfile() {
+void TurnSyncOnHelper::AttachToProfile() {
   // Delete any current helper.
-  DiceTurnSyncOnHelper* current_helper =
-      GetCurrentDiceTurnSyncOnHelper(profile_);
+  TurnSyncOnHelper* current_helper = GetCurrentTurnSyncOnHelper(profile_);
   if (current_helper) {
     // If the existing flow was using the same account, keep the account.
     if (current_helper->account_info_.account_id == account_info_.account_id)
@@ -671,13 +662,13 @@
         ->ShutdownUserCloudPolicyManager();
     current_helper->AbortAndDelete();
   }
-  DCHECK(!GetCurrentDiceTurnSyncOnHelper(profile_));
+  DCHECK(!GetCurrentTurnSyncOnHelper(profile_));
 
   // Set this as the current helper.
-  SetCurrentDiceTurnSyncOnHelper(profile_, this);
+  SetCurrentTurnSyncOnHelper(profile_, this);
 }
 
-void DiceTurnSyncOnHelper::AbortAndDelete() {
+void TurnSyncOnHelper::AbortAndDelete() {
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
   if (signin_aborted_mode_ == SigninAbortedMode::REMOVE_ACCOUNT) {
     policy::UserPolicySigninServiceFactory::GetForProfile(profile_)
@@ -688,7 +679,7 @@
     accounts_mutator->RemoveAccount(
         account_info_.account_id,
         signin_metrics::SourceForRefreshTokenOperation::
-            kDiceTurnOnSyncHelper_Abort);
+            kTurnOnSyncHelper_Abort);
   }
 #else
   // TODO(https://crbug.com/1260291): Implement on Lacros.
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h b/chrome/browser/ui/webui/signin/turn_sync_on_helper.h
similarity index 83%
rename from chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h
rename to chrome/browser/ui/webui/signin/turn_sync_on_helper.h
index cacada0..d862fa8 100644
--- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h
+++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_DICE_TURN_SYNC_ON_HELPER_H_
-#define CHROME_BROWSER_UI_WEBUI_SIGNIN_DICE_TURN_SYNC_ON_HELPER_H_
+#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_TURN_SYNC_ON_HELPER_H_
+#define CHROME_BROWSER_UI_WEBUI_SIGNIN_TURN_SYNC_ON_HELPER_H_
 
 #include <memory>
 #include <string>
@@ -39,15 +39,12 @@
 namespace syncer {
 class SyncService;
 class SyncSetupInProgressHandle;
-}
+}  // namespace syncer
 
 // Handles details of setting the primary account with IdentityManager and
 // turning on sync for an account for which there is already a refresh token.
-// TODO(crbug.com/1248047): Rename this to TurnSyncOnHelper to reflect this can
-// also be used with mirror.
-class DiceTurnSyncOnHelper
-    : public SyncStartupTracker::Observer,
-      public policy::PolicyService::ProviderUpdateObserver {
+class TurnSyncOnHelper : public SyncStartupTracker::Observer,
+                         public policy::PolicyService::ProviderUpdateObserver {
  public:
   // Behavior when the signin is aborted (by an error or cancelled by the user).
   // The mode has no effect on the sync-is-disabled flow where cancelling always
@@ -138,28 +135,28 @@
   // in the token service.
   // |callback| is called at the end of the flow (i.e. after the user closes the
   // sync confirmation dialog).
-  DiceTurnSyncOnHelper(Profile* profile,
-                       signin_metrics::AccessPoint signin_access_point,
-                       signin_metrics::PromoAction signin_promo_action,
-                       signin_metrics::Reason signin_reason,
-                       const CoreAccountId& account_id,
-                       SigninAbortedMode signin_aborted_mode,
-                       std::unique_ptr<Delegate> delegate,
-                       base::OnceClosure callback);
+  TurnSyncOnHelper(Profile* profile,
+                   signin_metrics::AccessPoint signin_access_point,
+                   signin_metrics::PromoAction signin_promo_action,
+                   signin_metrics::Reason signin_reason,
+                   const CoreAccountId& account_id,
+                   SigninAbortedMode signin_aborted_mode,
+                   std::unique_ptr<Delegate> delegate,
+                   base::OnceClosure callback);
 
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
   // Convenience constructor using the default delegate and empty callback.
-  DiceTurnSyncOnHelper(Profile* profile,
-                       Browser* browser,
-                       signin_metrics::AccessPoint signin_access_point,
-                       signin_metrics::PromoAction signin_promo_action,
-                       signin_metrics::Reason signin_reason,
-                       const CoreAccountId& account_id,
-                       SigninAbortedMode signin_aborted_mode);
+  TurnSyncOnHelper(Profile* profile,
+                   Browser* browser,
+                   signin_metrics::AccessPoint signin_access_point,
+                   signin_metrics::PromoAction signin_promo_action,
+                   signin_metrics::Reason signin_reason,
+                   const CoreAccountId& account_id,
+                   SigninAbortedMode signin_aborted_mode);
 #endif
 
-  DiceTurnSyncOnHelper(const DiceTurnSyncOnHelper&) = delete;
-  DiceTurnSyncOnHelper& operator=(const DiceTurnSyncOnHelper&) = delete;
+  TurnSyncOnHelper(const TurnSyncOnHelper&) = delete;
+  TurnSyncOnHelper& operator=(const TurnSyncOnHelper&) = delete;
 
   // SyncStartupTracker::Observer:
   void SyncStartupCompleted() override;
@@ -169,11 +166,11 @@
   static void SetShowSyncEnabledUiForTesting(
       bool show_sync_enabled_ui_for_testing);
 
-  // Returns true if a `DiceTurnSyncOnHelper` is currently active for `profile`.
-  static bool HasCurrentDiceTurnSyncOnHelperForTesting(Profile* profile);
+  // Returns true if a `TurnSyncOnHelper` is currently active for `profile`.
+  static bool HasCurrentTurnSyncOnHelperForTesting(Profile* profile);
 
  private:
-  friend class base::DeleteHelper<DiceTurnSyncOnHelper>;
+  friend class base::DeleteHelper<TurnSyncOnHelper>;
 
   enum class ProfileMode {
     // Attempts to sign the user in |profile_|. Note that if the account to be
@@ -186,8 +183,8 @@
     NEW_PROFILE
   };
 
-  // DiceTurnSyncOnHelper deletes itself.
-  ~DiceTurnSyncOnHelper() override;
+  // TurnSyncOnHelper deletes itself.
+  ~TurnSyncOnHelper() override;
 
   // Handles can offer sign-in errors.  It returns true if there is an error,
   // and false otherwise.
@@ -246,7 +243,7 @@
   // Switch to a new profile after exporting the token.
   void SwitchToProfile(Profile* new_profile);
 
-  // Only one DiceTurnSyncOnHelper can be attached per profile. This deletes
+  // Only one TurnSyncOnHelper can be attached per profile. This deletes
   // any other helper attached to the profile.
   void AttachToProfile();
 
@@ -284,7 +281,7 @@
   base::CallbackListSubscription shutdown_subscription_;
   bool enterprise_account_confirmed_ = false;
 
-  base::WeakPtrFactory<DiceTurnSyncOnHelper> weak_pointer_factory_{this};
+  base::WeakPtrFactory<TurnSyncOnHelper> weak_pointer_factory_{this};
 };
 
-#endif  // CHROME_BROWSER_UI_WEBUI_SIGNIN_DICE_TURN_SYNC_ON_HELPER_H_
+#endif  // CHROME_BROWSER_UI_WEBUI_SIGNIN_TURN_SYNC_ON_HELPER_H_
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.cc b/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc
similarity index 74%
rename from chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.cc
rename to chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc
index df4fc98..162be7c 100644
--- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.cc
+++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.h"
 
 #include "base/bind.h"
 #include "base/check.h"
@@ -51,30 +51,30 @@
 }
 
 // Converts SigninEmailConfirmationDialog::Action to
-// DiceTurnSyncOnHelper::SigninChoice and invokes |callback| on it.
-void OnEmailConfirmation(DiceTurnSyncOnHelper::SigninChoiceCallback callback,
+// TurnSyncOnHelper::SigninChoice and invokes |callback| on it.
+void OnEmailConfirmation(TurnSyncOnHelper::SigninChoiceCallback callback,
                          SigninEmailConfirmationDialog::Action action) {
   DCHECK(callback) << "This function should be called only once.";
   switch (action) {
     case SigninEmailConfirmationDialog::START_SYNC:
-      std::move(callback).Run(DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
+      std::move(callback).Run(TurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE);
       return;
     case SigninEmailConfirmationDialog::CREATE_NEW_USER:
-      std::move(callback).Run(DiceTurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE);
+      std::move(callback).Run(TurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE);
       return;
     case SigninEmailConfirmationDialog::CLOSE:
-      std::move(callback).Run(DiceTurnSyncOnHelper::SIGNIN_CHOICE_CANCEL);
+      std::move(callback).Run(TurnSyncOnHelper::SIGNIN_CHOICE_CANCEL);
       return;
   }
   NOTREACHED();
 }
 
 void OnProfileCheckComplete(const AccountInfo& account_info,
-                            DiceTurnSyncOnHelper::SigninChoiceCallback callback,
+                            TurnSyncOnHelper::SigninChoiceCallback callback,
                             base::WeakPtr<Browser> browser,
                             bool prompt_for_new_profile) {
   if (!browser) {
-    std::move(callback).Run(DiceTurnSyncOnHelper::SIGNIN_CHOICE_CANCEL);
+    std::move(callback).Run(TurnSyncOnHelper::SIGNIN_CHOICE_CANCEL);
     return;
   }
   ProfileAttributesEntry* entry =
@@ -84,50 +84,47 @@
   browser->signin_view_controller()->ShowModalEnterpriseConfirmationDialog(
       account_info, GenerateNewProfileColor(entry).color,
       base::BindOnce(
-          [](DiceTurnSyncOnHelper::SigninChoiceCallback callback,
-             Browser* browser, bool prompt_for_new_profile,
-             bool create_profile) {
+          [](TurnSyncOnHelper::SigninChoiceCallback callback, Browser* browser,
+             bool prompt_for_new_profile, bool create_profile) {
             browser->signin_view_controller()->CloseModalSignin();
             std::move(callback).Run(
                 create_profile
                     ? prompt_for_new_profile
-                          ? DiceTurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE
-                          : DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE
-                    : DiceTurnSyncOnHelper::SIGNIN_CHOICE_CANCEL);
+                          ? TurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE
+                          : TurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE
+                    : TurnSyncOnHelper::SIGNIN_CHOICE_CANCEL);
           },
           std::move(callback), browser.get(), prompt_for_new_profile));
 }
 
 }  // namespace
 
-DiceTurnSyncOnHelperDelegateImpl::DiceTurnSyncOnHelperDelegateImpl(
-    Browser* browser)
+TurnSyncOnHelperDelegateImpl::TurnSyncOnHelperDelegateImpl(Browser* browser)
     : browser_(browser), profile_(browser_->profile()) {
   DCHECK(browser);
   DCHECK(profile_);
   BrowserList::AddObserver(this);
 }
 
-DiceTurnSyncOnHelperDelegateImpl::~DiceTurnSyncOnHelperDelegateImpl() {
+TurnSyncOnHelperDelegateImpl::~TurnSyncOnHelperDelegateImpl() {
   BrowserList::RemoveObserver(this);
 }
 
-void DiceTurnSyncOnHelperDelegateImpl::ShowLoginError(
-    const SigninUIError& error) {
+void TurnSyncOnHelperDelegateImpl::ShowLoginError(const SigninUIError& error) {
   DCHECK(!error.IsOk());
-  DiceTurnSyncOnHelper::Delegate::ShowLoginErrorForBrowser(error, browser_);
+  TurnSyncOnHelper::Delegate::ShowLoginErrorForBrowser(error, browser_);
 }
 
-void DiceTurnSyncOnHelperDelegateImpl::
+void TurnSyncOnHelperDelegateImpl::
     ShouldEnterpriseConfirmationPromptForNewProfile(
         Profile* profile,
         base::OnceCallback<void(bool)> callback) {
   ui::CheckShouldPromptForNewProfile(profile, std::move(callback));
 }
 
-void DiceTurnSyncOnHelperDelegateImpl::ShowEnterpriseAccountConfirmation(
+void TurnSyncOnHelperDelegateImpl::ShowEnterpriseAccountConfirmation(
     const AccountInfo& account_info,
-    DiceTurnSyncOnHelper::SigninChoiceCallback callback) {
+    TurnSyncOnHelper::SigninChoiceCallback callback) {
   browser_ = EnsureBrowser(browser_, profile_);
   // Checking whether to show the prompt for a new profile is sometimes
   // asynchronous.
@@ -136,7 +133,7 @@
                                std::move(callback), browser_->AsWeakPtr()));
 }
 
-void DiceTurnSyncOnHelperDelegateImpl::ShowSyncConfirmation(
+void TurnSyncOnHelperDelegateImpl::ShowSyncConfirmation(
     base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
         callback) {
   DCHECK(callback);
@@ -147,7 +144,7 @@
   browser_->signin_view_controller()->ShowModalSyncConfirmationDialog();
 }
 
-void DiceTurnSyncOnHelperDelegateImpl::ShowSyncDisabledConfirmation(
+void TurnSyncOnHelperDelegateImpl::ShowSyncDisabledConfirmation(
     bool is_managed_account,
     base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
         callback) {
@@ -155,10 +152,10 @@
   ShowSyncConfirmation(std::move(callback));
 }
 
-void DiceTurnSyncOnHelperDelegateImpl::ShowMergeSyncDataConfirmation(
+void TurnSyncOnHelperDelegateImpl::ShowMergeSyncDataConfirmation(
     const std::string& previous_email,
     const std::string& new_email,
-    DiceTurnSyncOnHelper::SigninChoiceCallback callback) {
+    TurnSyncOnHelper::SigninChoiceCallback callback) {
   DCHECK(callback);
   browser_ = EnsureBrowser(browser_, profile_);
   browser_->signin_view_controller()->ShowModalSigninEmailConfirmationDialog(
@@ -166,17 +163,17 @@
       base::BindOnce(&OnEmailConfirmation, std::move(callback)));
 }
 
-void DiceTurnSyncOnHelperDelegateImpl::ShowSyncSettings() {
+void TurnSyncOnHelperDelegateImpl::ShowSyncSettings() {
   browser_ = EnsureBrowser(browser_, profile_);
   chrome::ShowSettingsSubPage(browser_, chrome::kSyncSetupSubPage);
 }
 
-void DiceTurnSyncOnHelperDelegateImpl::SwitchToProfile(Profile* new_profile) {
+void TurnSyncOnHelperDelegateImpl::SwitchToProfile(Profile* new_profile) {
   profile_ = new_profile;
   browser_ = nullptr;
 }
 
-void DiceTurnSyncOnHelperDelegateImpl::OnSyncConfirmationUIClosed(
+void TurnSyncOnHelperDelegateImpl::OnSyncConfirmationUIClosed(
     LoginUIService::SyncConfirmationUIClosedResult result) {
   DCHECK(sync_confirmation_callback_);
   // Treat closing the ui as an implicit ABORT_SYNC action.
@@ -186,7 +183,7 @@
   std::move(sync_confirmation_callback_).Run(result);
 }
 
-void DiceTurnSyncOnHelperDelegateImpl::OnBrowserRemoved(Browser* browser) {
+void TurnSyncOnHelperDelegateImpl::OnBrowserRemoved(Browser* browser) {
   if (browser == browser_)
     browser_ = nullptr;
 }
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.h b/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.h
similarity index 64%
rename from chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.h
rename to chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.h
index 2b94d623..d1fc2c2e 100644
--- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_delegate_impl.h
+++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.h
@@ -2,51 +2,50 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_DICE_TURN_SYNC_ON_HELPER_DELEGATE_IMPL_H_
-#define CHROME_BROWSER_UI_WEBUI_SIGNIN_DICE_TURN_SYNC_ON_HELPER_DELEGATE_IMPL_H_
+#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_TURN_SYNC_ON_HELPER_DELEGATE_IMPL_H_
+#define CHROME_BROWSER_UI_WEBUI_SIGNIN_TURN_SYNC_ON_HELPER_DELEGATE_IMPL_H_
 
 #include "base/callback_forward.h"
 #include "base/memory/raw_ptr.h"
 #include "base/scoped_observation.h"
 #include "chrome/browser/ui/browser_list_observer.h"
 #include "chrome/browser/ui/sync/profile_signin_confirmation_helper.h"
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 
 class Browser;
 class Profile;
 class SigninUIError;
 struct AccountInfo;
 
-// Default implementation for DiceTurnSyncOnHelper::Delegate.
-class DiceTurnSyncOnHelperDelegateImpl : public DiceTurnSyncOnHelper::Delegate,
-                                         public BrowserListObserver,
-                                         public LoginUIService::Observer {
+// Default implementation for TurnSyncOnHelper::Delegate.
+class TurnSyncOnHelperDelegateImpl : public TurnSyncOnHelper::Delegate,
+                                     public BrowserListObserver,
+                                     public LoginUIService::Observer {
  public:
-  explicit DiceTurnSyncOnHelperDelegateImpl(Browser* browser);
+  explicit TurnSyncOnHelperDelegateImpl(Browser* browser);
 
-  DiceTurnSyncOnHelperDelegateImpl(const DiceTurnSyncOnHelperDelegateImpl&) =
+  TurnSyncOnHelperDelegateImpl(const TurnSyncOnHelperDelegateImpl&) = delete;
+  TurnSyncOnHelperDelegateImpl& operator=(const TurnSyncOnHelperDelegateImpl&) =
       delete;
-  DiceTurnSyncOnHelperDelegateImpl& operator=(
-      const DiceTurnSyncOnHelperDelegateImpl&) = delete;
 
-  ~DiceTurnSyncOnHelperDelegateImpl() override;
+  ~TurnSyncOnHelperDelegateImpl() override;
 
  protected:
   void ShowEnterpriseAccountConfirmation(
       const AccountInfo& account_info,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) override;
+      TurnSyncOnHelper::SigninChoiceCallback callback) override;
   virtual void ShouldEnterpriseConfirmationPromptForNewProfile(
       Profile* profile,
       base::OnceCallback<void(bool)> callback);
 
  private:
-  // DiceTurnSyncOnHelper::Delegate:
+  // TurnSyncOnHelper::Delegate:
   void ShowLoginError(const SigninUIError& error) override;
   void ShowMergeSyncDataConfirmation(
       const std::string& previous_email,
       const std::string& new_email,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) override;
+      TurnSyncOnHelper::SigninChoiceCallback callback) override;
   void ShowSyncConfirmation(
       base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
           callback) override;
@@ -72,4 +71,4 @@
       scoped_login_ui_service_observation_{this};
 };
 
-#endif  // CHROME_BROWSER_UI_WEBUI_SIGNIN_DICE_TURN_SYNC_ON_HELPER_DELEGATE_IMPL_H_
+#endif  // CHROME_BROWSER_UI_WEBUI_SIGNIN_TURN_SYNC_ON_HELPER_DELEGATE_IMPL_H_
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc b/chrome/browser/ui/webui/signin/turn_sync_on_helper_unittest.cc
similarity index 85%
rename from chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
rename to chrome/browser/ui/webui/signin/turn_sync_on_helper_unittest.cc
index 6c113734..378dcb0 100644
--- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
+++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 
 #include <utility>
 
@@ -58,7 +58,7 @@
 using ::testing::AtLeast;
 using ::testing::Return;
 
-class DiceTurnSyncOnHelperTest;
+class TurnSyncOnHelperTest;
 
 namespace {
 
@@ -80,23 +80,22 @@
     Profile::Delegate* delegate);
 
 // Dummy delegate forwarding all the calls the test fixture.
-// Owned by the DiceTurnOnSyncHelper.
-class TestDiceTurnSyncOnHelperDelegate : public DiceTurnSyncOnHelper::Delegate {
+// Owned by the TurnOnSyncHelper.
+class TestTurnSyncOnHelperDelegate : public TurnSyncOnHelper::Delegate {
  public:
-  explicit TestDiceTurnSyncOnHelperDelegate(
-      DiceTurnSyncOnHelperTest* test_fixture);
-  ~TestDiceTurnSyncOnHelperDelegate() override;
+  explicit TestTurnSyncOnHelperDelegate(TurnSyncOnHelperTest* test_fixture);
+  ~TestTurnSyncOnHelperDelegate() override;
 
  private:
-  // DiceTurnSyncOnHelper::Delegate:
+  // TurnSyncOnHelper::Delegate:
   void ShowLoginError(const SigninUIError& error) override;
   void ShowMergeSyncDataConfirmation(
       const std::string& previous_email,
       const std::string& new_email,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) override;
+      TurnSyncOnHelper::SigninChoiceCallback callback) override;
   void ShowEnterpriseAccountConfirmation(
       const AccountInfo& account_info,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) override;
+      TurnSyncOnHelper::SigninChoiceCallback callback) override;
   void ShowSyncConfirmation(
       base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
           callback) override;
@@ -107,7 +106,7 @@
   void ShowSyncSettings() override;
   void SwitchToProfile(Profile* new_profile) override;
 
-  raw_ptr<DiceTurnSyncOnHelperTest> test_fixture_;
+  raw_ptr<TurnSyncOnHelperTest> test_fixture_;
 };
 
 // Simple ProfileManager creating testing profiles and allowing to register a
@@ -223,11 +222,9 @@
 
 }  // namespace
 
-class DiceTurnSyncOnHelperTest : public testing::Test {
+class TurnSyncOnHelperTest : public testing::Test {
  public:
-  DiceTurnSyncOnHelperTest()
-      : local_state_(TestingBrowserProcess::GetGlobal()) {
-  }
+  TurnSyncOnHelperTest() : local_state_(TestingBrowserProcess::GetGlobal()) {}
 
   void SetUp() override {
     EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
@@ -252,7 +249,7 @@
     EXPECT_FALSE(initial_device_id_.empty());
   }
 
-  ~DiceTurnSyncOnHelperTest() override {
+  ~TurnSyncOnHelperTest() override {
     DCHECK_GT(delegate_destroyed_, 0);
     ClearProfile();
     base::RunLoop().RunUntilIdle();
@@ -297,11 +294,11 @@
         SyncServiceFactory::GetForProfile(profile));
   }
 
-  DiceTurnSyncOnHelper* CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode mode) {
-    return new DiceTurnSyncOnHelper(
+  TurnSyncOnHelper* CreateTurnOnSyncHelper(
+      TurnSyncOnHelper::SigninAbortedMode mode) {
+    return new TurnSyncOnHelper(
         profile(), kAccessPoint, kSigninPromoAction, kSigninReason, account_id_,
-        mode, std::make_unique<TestDiceTurnSyncOnHelperDelegate>(this),
+        mode, std::make_unique<TestTurnSyncOnHelperDelegate>(this),
         base::DoNothing());
   }
 
@@ -332,7 +329,7 @@
 
   void SetExpectationsForSyncStartupCompletedForNextProfileCreated() {
     profile_manager()->NextProfileCreatedCallback(base::BindOnce(
-        &DiceTurnSyncOnHelperTest::SetExpectationsForSyncStartupCompleted,
+        &TurnSyncOnHelperTest::SetExpectationsForSyncStartupCompleted,
         base::Unretained(this)));
   }
 
@@ -401,7 +398,7 @@
     EXPECT_EQ(expected_sync_settings_shown_, sync_settings_shown_);
   }
 
-  // Functions called by the DiceTurnSyncOnHelper::Delegate:
+  // Functions called by the TurnSyncOnHelper::Delegate:
   void OnShowLoginError(const SigninUIError& error) {
     EXPECT_FALSE(sync_confirmation_shown_);
     EXPECT_FALSE(error.IsOk());
@@ -413,7 +410,7 @@
   void OnShowMergeSyncDataConfirmation(
       const std::string& previous_email,
       const std::string& new_email,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) {
+      TurnSyncOnHelper::SigninChoiceCallback callback) {
     EXPECT_FALSE(sync_confirmation_shown_);
     EXPECT_FALSE(previous_email.empty());
     EXPECT_FALSE(new_email.empty());
@@ -429,7 +426,7 @@
 
   void OnShowEnterpriseAccountConfirmation(
       const AccountInfo& account_info,
-      DiceTurnSyncOnHelper::SigninChoiceCallback callback) {
+      TurnSyncOnHelper::SigninChoiceCallback callback) {
     EXPECT_FALSE(sync_confirmation_shown_);
     EXPECT_FALSE(account_info.email.empty());
     EXPECT_TRUE(enterprise_confirmation_email_.empty())
@@ -496,10 +493,10 @@
   enum SyncDisabledConfirmation { kNotShown, kShownManaged, kShownNonManaged };
 
   // Delegate behavior.
-  DiceTurnSyncOnHelper::SigninChoice merge_data_choice_ =
-      DiceTurnSyncOnHelper::SIGNIN_CHOICE_CANCEL;
-  DiceTurnSyncOnHelper::SigninChoice enterprise_choice_ =
-      DiceTurnSyncOnHelper::SIGNIN_CHOICE_CANCEL;
+  TurnSyncOnHelper::SigninChoice merge_data_choice_ =
+      TurnSyncOnHelper::SIGNIN_CHOICE_CANCEL;
+  TurnSyncOnHelper::SigninChoice enterprise_choice_ =
+      TurnSyncOnHelper::SIGNIN_CHOICE_CANCEL;
   LoginUIService::SyncConfirmationUIClosedResult sync_confirmation_result_ =
       LoginUIService::SyncConfirmationUIClosedResult::ABORT_SYNC;
   bool run_delegate_callbacks_ = true;
@@ -544,41 +541,40 @@
   bool sync_settings_shown_ = false;
 };
 
-TestDiceTurnSyncOnHelperDelegate::TestDiceTurnSyncOnHelperDelegate(
-    DiceTurnSyncOnHelperTest* test_fixture)
+TestTurnSyncOnHelperDelegate::TestTurnSyncOnHelperDelegate(
+    TurnSyncOnHelperTest* test_fixture)
     : test_fixture_(test_fixture) {}
 
-TestDiceTurnSyncOnHelperDelegate::~TestDiceTurnSyncOnHelperDelegate() {
+TestTurnSyncOnHelperDelegate::~TestTurnSyncOnHelperDelegate() {
   test_fixture_->OnDelegateDestroyed();
 }
 
-void TestDiceTurnSyncOnHelperDelegate::ShowLoginError(
-    const SigninUIError& error) {
+void TestTurnSyncOnHelperDelegate::ShowLoginError(const SigninUIError& error) {
   test_fixture_->OnShowLoginError(error);
 }
 
-void TestDiceTurnSyncOnHelperDelegate::ShowMergeSyncDataConfirmation(
+void TestTurnSyncOnHelperDelegate::ShowMergeSyncDataConfirmation(
     const std::string& previous_email,
     const std::string& new_email,
-    DiceTurnSyncOnHelper::SigninChoiceCallback callback) {
+    TurnSyncOnHelper::SigninChoiceCallback callback) {
   test_fixture_->OnShowMergeSyncDataConfirmation(previous_email, new_email,
                                                  std::move(callback));
 }
 
-void TestDiceTurnSyncOnHelperDelegate::ShowEnterpriseAccountConfirmation(
+void TestTurnSyncOnHelperDelegate::ShowEnterpriseAccountConfirmation(
     const AccountInfo& account_info,
-    DiceTurnSyncOnHelper::SigninChoiceCallback callback) {
+    TurnSyncOnHelper::SigninChoiceCallback callback) {
   test_fixture_->OnShowEnterpriseAccountConfirmation(account_info,
                                                      std::move(callback));
 }
 
-void TestDiceTurnSyncOnHelperDelegate::ShowSyncConfirmation(
+void TestTurnSyncOnHelperDelegate::ShowSyncConfirmation(
     base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
         callback) {
   test_fixture_->OnShowSyncConfirmation(std::move(callback));
 }
 
-void TestDiceTurnSyncOnHelperDelegate::ShowSyncDisabledConfirmation(
+void TestTurnSyncOnHelperDelegate::ShowSyncDisabledConfirmation(
     bool is_managed_account,
     base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
         callback) {
@@ -586,32 +582,30 @@
                                                 std::move(callback));
 }
 
-void TestDiceTurnSyncOnHelperDelegate::ShowSyncSettings() {
+void TestTurnSyncOnHelperDelegate::ShowSyncSettings() {
   test_fixture_->OnShowSyncSettings();
 }
 
-void TestDiceTurnSyncOnHelperDelegate::SwitchToProfile(Profile* new_profile) {
+void TestTurnSyncOnHelperDelegate::SwitchToProfile(Profile* new_profile) {
   test_fixture_->SwitchToProfile(new_profile);
 }
 
 // Check that the invalid account is supported.
-TEST_F(DiceTurnSyncOnHelperTest, InvalidAccount) {
+TEST_F(TurnSyncOnHelperTest, InvalidAccount) {
   UseInvalidAccount();
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   base::RunLoop().RunUntilIdle();
   CheckDelegateCalls();
 }
 
 // Tests that the login error is displayed and that the account is kept.
-TEST_F(DiceTurnSyncOnHelperTest, CanOfferSigninErrorKeepAccount) {
+TEST_F(TurnSyncOnHelperTest, CanOfferSigninErrorKeepAccount) {
   // Set expectations.
   expected_login_error_ = SigninUIError::Other(kEmail);
   // Configure the test.
   profile()->GetPrefs()->SetBoolean(prefs::kSigninAllowed, false);
   // Signin flow.
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
   base::RunLoop().RunUntilIdle();
   // Check expectations.
   EXPECT_FALSE(
@@ -623,14 +617,13 @@
 // TODO(https://crbug.com/1260291): Enable this test on Lacros.
 #if !BUILDFLAG(IS_CHROMEOS_LACROS)
 // Tests that the login error is displayed and that the account is removed.
-TEST_F(DiceTurnSyncOnHelperTest, CanOfferSigninErrorRemoveAccount) {
+TEST_F(TurnSyncOnHelperTest, CanOfferSigninErrorRemoveAccount) {
   // Set expectations.
   expected_login_error_ = SigninUIError::Other(kEmail);
   // Configure the test.
   profile()->GetPrefs()->SetBoolean(prefs::kSigninAllowed, false);
   // Signin flow.
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   base::RunLoop().RunUntilIdle();
   // Check expectations.
   EXPECT_FALSE(
@@ -642,7 +635,7 @@
 
 // Tests that the sync disabled message is displayed and that the account is
 // removed upon the ABORT_SYNC action.
-TEST_F(DiceTurnSyncOnHelperTest, SyncDisabledAbortRemoveAccount) {
+TEST_F(TurnSyncOnHelperTest, SyncDisabledAbortRemoveAccount) {
   // Set expectations.
   expected_sync_disabled_confirmation_ = kShownNonManaged;
   SetExpectationsForSyncDisabled(profile());
@@ -653,8 +646,7 @@
   // Signin flow.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   base::RunLoop().RunUntilIdle();
   // Check expectations.
   CheckSyncAborted(/*has_primary_account=*/false);
@@ -663,7 +655,7 @@
 
 // Tests that the sync disabled message is displayed and that the account is
 // removed upon the ABORT_SYNC action (despite SigninAbortedMode::KEEP_ACCOUNT).
-TEST_F(DiceTurnSyncOnHelperTest, SyncDisabledAbortKeepAccount) {
+TEST_F(TurnSyncOnHelperTest, SyncDisabledAbortKeepAccount) {
   // Set expectations.
   expected_sync_disabled_confirmation_ = kShownNonManaged;
   SetExpectationsForSyncDisabled(profile());
@@ -674,8 +666,7 @@
   // Signin flow.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
   base::RunLoop().RunUntilIdle();
   // Check expectations.
   CheckSyncAborted(/*has_primary_account=*/false);
@@ -684,7 +675,7 @@
 
 // Tests that the sync disabled message is displayed and that the account is
 // kept upon the SYNC_WITH_DEFAULT_SETTINGS action.
-TEST_F(DiceTurnSyncOnHelperTest, SyncDisabledContinueKeepAccount) {
+TEST_F(TurnSyncOnHelperTest, SyncDisabledContinueKeepAccount) {
   // Set expectations.
   expected_sync_disabled_confirmation_ = kShownNonManaged;
   SetExpectationsForSyncDisabled(profile());
@@ -695,8 +686,7 @@
   // Signin flow.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   base::RunLoop().RunUntilIdle();
   // Check expectations.
   EXPECT_TRUE(
@@ -707,7 +697,7 @@
 
 // Tests that the sync disabled message is displayed and that the account is
 // kept upon the SYNC_WITH_DEFAULT_SETTINGS action.
-TEST_F(DiceTurnSyncOnHelperTest, SyncDisabledManagedContinueKeepAccount) {
+TEST_F(TurnSyncOnHelperTest, SyncDisabledManagedContinueKeepAccount) {
   // Reset the account info to be an enterprise account.
   UseEnterpriseAccount();
   // Set expectations.
@@ -720,8 +710,7 @@
   // Signin flow.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   base::RunLoop().RunUntilIdle();
   // Check expectations.
   EXPECT_TRUE(
@@ -733,7 +722,7 @@
 // TODO(https://crbug.com/1260291): Enable this test on Lacros.
 #if !BUILDFLAG(IS_CHROMEOS_LACROS)
 // Aborts the flow after the cross account dialog.
-TEST_F(DiceTurnSyncOnHelperTest, CrossAccountAbort) {
+TEST_F(TurnSyncOnHelperTest, CrossAccountAbort) {
   // Set expectations.
   expected_merge_data_previous_email_ = kPreviousEmail;
   expected_merge_data_new_email_ = kEmail;
@@ -741,8 +730,7 @@
   profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername,
                                    kPreviousEmail);
   // Signin flow.
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // Check expectations.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
@@ -751,7 +739,7 @@
 }
 
 // Aborts the flow after the cross account dialog.
-TEST_F(DiceTurnSyncOnHelperTest, CrossAccountAbortAlreadyManaged) {
+TEST_F(TurnSyncOnHelperTest, CrossAccountAbortAlreadyManaged) {
   // Set expectations.
   expected_merge_data_previous_email_ = kPreviousEmail;
   expected_merge_data_new_email_ = kEmail;
@@ -762,8 +750,7 @@
   user_policy_signin_service()->set_client_id("bar");
   chrome::enterprise_util::SetUserAcceptedAccountManagement(profile(), true);
   // Signin flow.
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // Check expectations.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
@@ -773,41 +760,39 @@
 #endif
 
 // Merge data after the cross account dialog.
-TEST_F(DiceTurnSyncOnHelperTest, CrossAccountContinue) {
+TEST_F(TurnSyncOnHelperTest, CrossAccountContinue) {
   // Set expectations.
   expected_merge_data_previous_email_ = kPreviousEmail;
   expected_merge_data_new_email_ = kEmail;
   expected_sync_confirmation_shown_ = true;
   SetExpectationsForSyncStartupCompleted(profile());
   // Configure the test.
-  merge_data_choice_ = DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE;
+  merge_data_choice_ = TurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE;
   profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername,
                                    kPreviousEmail);
   // Signin flow.
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // Check expectations.
   CheckSyncAborted(/*has_primary_account=*/false);
   CheckDelegateCalls();
 }
 
 // Merge data after the cross account dialog.
-TEST_F(DiceTurnSyncOnHelperTest, CrossAccountContinueAlreadyManaged) {
+TEST_F(TurnSyncOnHelperTest, CrossAccountContinueAlreadyManaged) {
   // Set expectations.
   expected_merge_data_previous_email_ = kPreviousEmail;
   expected_merge_data_new_email_ = kEmail;
   expected_sync_confirmation_shown_ = true;
   SetExpectationsForSyncStartupCompleted(profile());
   // Configure the test.
-  merge_data_choice_ = DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE;
+  merge_data_choice_ = TurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE;
   profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername,
                                    kPreviousEmail);
   user_policy_signin_service()->set_dm_token("foo");
   user_policy_signin_service()->set_client_id("bar");
   chrome::enterprise_util::SetUserAcceptedAccountManagement(profile(), true);
   // Signin flow.
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // Check expectations.
   // This was already a signed-in and managed enterprise account so we keep the
   // user signed-in, overriding SigninAbortedMode::REMOVE_ACCOUNT.
@@ -818,7 +803,7 @@
 // TODO(https://crbug.com/1260291): Enable these tests on Lacros.
 #if !BUILDFLAG(IS_CHROMEOS_LACROS)
 // Create a new profile after the cross account dialog and show the signin page.
-TEST_F(DiceTurnSyncOnHelperTest, CrossAccountNewProfile) {
+TEST_F(TurnSyncOnHelperTest, CrossAccountNewProfile) {
   // Set expectations.
   expected_merge_data_previous_email_ = kPreviousEmail;
   expected_merge_data_new_email_ = kEmail;
@@ -826,12 +811,11 @@
   expected_sync_confirmation_shown_ = true;
   SetExpectationsForSyncStartupCompletedForNextProfileCreated();
   // Configure the test.
-  merge_data_choice_ = DiceTurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE;
+  merge_data_choice_ = TurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE;
   profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername,
                                    kPreviousEmail);
   // Signin flow.
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
   // Check expectations.
   base::RunLoop().RunUntilIdle();  // Profile creation is asynchronous.
   EXPECT_FALSE(
@@ -843,15 +827,14 @@
 }
 
 // Abort after the enterprise confirmation prompt.
-TEST_F(DiceTurnSyncOnHelperTest, EnterpriseConfirmationAbort) {
+TEST_F(TurnSyncOnHelperTest, EnterpriseConfirmationAbort) {
   // Set expectations.
   expected_enterprise_confirmation_email_ = kEmail;
   // Configure the test.
   user_policy_signin_service()->set_dm_token("foo");
   user_policy_signin_service()->set_client_id("bar");
   // Signin flow.
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // Check expectations.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
@@ -861,17 +844,16 @@
 #endif
 
 // Continue after the enterprise confirmation prompt.
-TEST_F(DiceTurnSyncOnHelperTest, DISABLED_EnterpriseConfirmationContinue) {
+TEST_F(TurnSyncOnHelperTest, DISABLED_EnterpriseConfirmationContinue) {
   // Set expectations.
   expected_enterprise_confirmation_email_ = kEmail;
   expected_sync_confirmation_shown_ = true;
   // Configure the test.
   user_policy_signin_service()->set_dm_token("foo");
   user_policy_signin_service()->set_client_id("bar");
-  enterprise_choice_ = DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE;
+  enterprise_choice_ = TurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE;
   // Signin flow.
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // Check expectations.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
@@ -882,7 +864,7 @@
 // TODO(https://crbug.com/1260291): Enable this test on Lacros.
 #if !BUILDFLAG(IS_CHROMEOS_LACROS)
 // Continue with a new profile after the enterprise confirmation prompt.
-TEST_F(DiceTurnSyncOnHelperTest, EnterpriseConfirmationNewProfile) {
+TEST_F(TurnSyncOnHelperTest, EnterpriseConfirmationNewProfile) {
   // Set expectations.
   expected_enterprise_confirmation_email_ = kEmail;
   expected_switched_to_new_profile_ = true;
@@ -891,10 +873,9 @@
   // Configure the test.
   user_policy_signin_service()->set_dm_token("foo");
   user_policy_signin_service()->set_client_id("bar");
-  enterprise_choice_ = DiceTurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE;
+  enterprise_choice_ = TurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE;
   // Signin flow.
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // Check expectations.
   base::RunLoop().RunUntilIdle();  // Profile creation is asynchronous.
   EXPECT_FALSE(
@@ -905,7 +886,7 @@
 
 // Test that the unconsented primary account is kept if the user creates a new
 // account and cancels sync activation.
-TEST_F(DiceTurnSyncOnHelperTest, SignedInAccountUndoSyncKeepAccount) {
+TEST_F(TurnSyncOnHelperTest, SignedInAccountUndoSyncKeepAccount) {
   // Set expectations.
   expected_enterprise_confirmation_email_ = kEnterpriseEmail;
   expected_switched_to_new_profile_ = true;
@@ -916,14 +897,13 @@
   // Configure the test.
   user_policy_signin_service()->set_dm_token("foo");
   user_policy_signin_service()->set_client_id("bar");
-  enterprise_choice_ = DiceTurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE;
+  enterprise_choice_ = TurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE;
   UseEnterpriseAccount();
   identity_manager()->GetPrimaryAccountMutator()->SetPrimaryAccount(
       account_id(), signin::ConsentLevel::kSignin);
 
   // Signin flow.
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
   // Check expectations.
   base::RunLoop().RunUntilIdle();  // Profile creation is asynchronous.
   EXPECT_FALSE(
@@ -941,7 +921,7 @@
 
 // Test that the unconsented primary account is kept if the user creates a new
 // account and cancels sync activation.
-TEST_F(DiceTurnSyncOnHelperTest, SignedInAccountUndoSyncRemoveAccount) {
+TEST_F(TurnSyncOnHelperTest, SignedInAccountUndoSyncRemoveAccount) {
   // Set expectations.
   expected_enterprise_confirmation_email_ = kEnterpriseEmail;
   expected_sync_confirmation_shown_ = true;
@@ -951,14 +931,13 @@
   // Configure the test.
   user_policy_signin_service()->set_dm_token("foo");
   user_policy_signin_service()->set_client_id("bar");
-  enterprise_choice_ = DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE;
+  enterprise_choice_ = TurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE;
   UseEnterpriseAccount();
   identity_manager()->GetPrimaryAccountMutator()->SetPrimaryAccount(
       account_id(), signin::ConsentLevel::kSignin);
 
   // Signin flow.
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // This was already a signed-in and managed enterprise account so we keep the
   // user signed-in, overriding SigninAbortedMode::REMOVE_ACCOUNT.
   CheckSyncAborted(/*has_primary_account=*/true);
@@ -967,7 +946,7 @@
 #endif
 
 // Tests that the sync confirmation is shown and the user can abort.
-TEST_F(DiceTurnSyncOnHelperTest, UndoSync) {
+TEST_F(TurnSyncOnHelperTest, UndoSync) {
   // Set expectations.
   expected_sync_confirmation_shown_ = true;
   SetExpectationsForSyncStartupCompleted(profile());
@@ -976,15 +955,14 @@
   // Signin flow.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // Check expectations.
   CheckSyncAborted(/*has_primary_account=*/false);
   CheckDelegateCalls();
 }
 
 // Tests that the sync settings page is shown.
-TEST_F(DiceTurnSyncOnHelperTest, ConfigureSync) {
+TEST_F(TurnSyncOnHelperTest, ConfigureSync) {
   // Set expectations.
   expected_sync_confirmation_shown_ = true;
   expected_sync_settings_shown_ = true;
@@ -1000,8 +978,7 @@
   // Signin flow.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // Check expectations.
   EXPECT_TRUE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
@@ -1010,7 +987,7 @@
 }
 
 // Tests that the user is signed in and Sync configuration is complete.
-TEST_F(DiceTurnSyncOnHelperTest, StartSync) {
+TEST_F(TurnSyncOnHelperTest, StartSync) {
   // Set expectations.
   expected_sync_confirmation_shown_ = true;
   SetExpectationsForSyncStartupCompleted(profile());
@@ -1023,8 +1000,7 @@
   // Signin flow.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // Check expectations.
   EXPECT_TRUE(identity_manager()->HasAccountWithRefreshToken(account_id()));
   EXPECT_EQ(account_id(), identity_manager()->GetPrimaryAccountId(
@@ -1035,7 +1011,7 @@
 // Tests that the user is signed in and Sync configuration is complete.
 // Also tests that turning sync on enables URL-keyed anonymized data collection.
 // Regression test for http://crbug.com/812546
-TEST_F(DiceTurnSyncOnHelperTest, ShowSyncDialogForEndConsumerAccount) {
+TEST_F(TurnSyncOnHelperTest, ShowSyncDialogForEndConsumerAccount) {
   // Set expectations.
   expected_sync_confirmation_shown_ = true;
   sync_confirmation_result_ = LoginUIService::SyncConfirmationUIClosedResult::
@@ -1054,8 +1030,7 @@
   // Signin flow.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
 
   // Check expectations.
   EXPECT_TRUE(identity_manager()->HasAccountWithRefreshToken(account_id()));
@@ -1068,7 +1043,7 @@
 // For users on a cloud managed device, tests that the user is signed in only
 // after Sync engine starts.
 // Regression test for http://crbug.com/812546
-TEST_F(DiceTurnSyncOnHelperTest,
+TEST_F(TurnSyncOnHelperTest,
        ShowSyncDialogBlockedUntilSyncStartupCompletedForCloudManagedDevices) {
   // Simulate a managed browser.
   policy::ScopedManagementServiceOverrideForTesting browser_management(
@@ -1082,8 +1057,8 @@
   // Signin flow.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  DiceTurnSyncOnHelper* dice_sync_starter = CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  TurnSyncOnHelper* sync_starter = CreateTurnOnSyncHelper(
+      TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
 
   // Check that the primary account was set with IdentityManager, but the sync
   // confirmation dialog was not yet shown.
@@ -1099,14 +1074,14 @@
       SetFirstSetupComplete(syncer::SyncFirstSetupCompleteSource::BASIC_FLOW));
   sync_confirmation_result_ = LoginUIService::SyncConfirmationUIClosedResult::
       SYNC_WITH_DEFAULT_SETTINGS;
-  dice_sync_starter->SyncStartupCompleted();
+  sync_starter->SyncStartupCompleted();
   CheckDelegateCalls();
 }
 
 // For enterprise user, tests that the user is signed in only after Sync engine
 // starts.
 // Regression test for http://crbug.com/812546
-TEST_F(DiceTurnSyncOnHelperTest,
+TEST_F(TurnSyncOnHelperTest,
        ShowSyncDialogBlockedUntilSyncStartupCompletedForEnterpriseAccount) {
   // Reset the account info to be an enterprise account.
   UseEnterpriseAccount();
@@ -1118,8 +1093,8 @@
   // Signin flow.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  DiceTurnSyncOnHelper* dice_sync_starter = CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  TurnSyncOnHelper* sync_starter = CreateTurnOnSyncHelper(
+      TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
 
   // Check that the primary account was set with IdentityManager, but the sync
   // confirmation dialog was not yet shown.
@@ -1135,14 +1110,14 @@
       SetFirstSetupComplete(syncer::SyncFirstSetupCompleteSource::BASIC_FLOW));
   sync_confirmation_result_ = LoginUIService::SyncConfirmationUIClosedResult::
       SYNC_WITH_DEFAULT_SETTINGS;
-  dice_sync_starter->SyncStartupCompleted();
+  sync_starter->SyncStartupCompleted();
   CheckDelegateCalls();
 }
 
 // For enterprise user, tests that the user is signed in only after Sync engine
 // fails to start.
 // Regression test for http://crbug.com/812546
-TEST_F(DiceTurnSyncOnHelperTest,
+TEST_F(TurnSyncOnHelperTest,
        ShowSyncDialogBlockedUntilSyncStartupFailedForEnterpriseAccount) {
   // Reset the account info to be an enterprise account.
   UseEnterpriseAccount();
@@ -1154,8 +1129,8 @@
   // Signin flow.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  DiceTurnSyncOnHelper* dice_sync_starter = CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  TurnSyncOnHelper* sync_starter = CreateTurnOnSyncHelper(
+      TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
 
   // Check that the primary account was added to the token service and in the
   // sign-in manager.
@@ -1171,14 +1146,14 @@
       SetFirstSetupComplete(syncer::SyncFirstSetupCompleteSource::BASIC_FLOW));
   sync_confirmation_result_ = LoginUIService::SyncConfirmationUIClosedResult::
       SYNC_WITH_DEFAULT_SETTINGS;
-  dice_sync_starter->SyncStartupFailed();
+  sync_starter->SyncStartupFailed();
   CheckDelegateCalls();
 }
 
 // For users on a cloud managed device, tests that the user is signed in only
 // after Sync engine fails to start.
 // Regression test for http://crbug.com/812546
-TEST_F(DiceTurnSyncOnHelperTest,
+TEST_F(TurnSyncOnHelperTest,
        ShowSyncDialogBlockedUntilSyncStartupFailedForCloudManagedDevices) {
   // Simulate a managed platform.
   policy::ScopedManagementServiceOverrideForTesting platform_management(
@@ -1192,8 +1167,8 @@
   // Signin flow.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  DiceTurnSyncOnHelper* dice_sync_starter = CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  TurnSyncOnHelper* sync_starter = CreateTurnOnSyncHelper(
+      TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
 
   // Check that the primary account was set with IdentityManager, but the sync
   // confirmation dialog was not yet shown.
@@ -1209,12 +1184,12 @@
       SetFirstSetupComplete(syncer::SyncFirstSetupCompleteSource::BASIC_FLOW));
   sync_confirmation_result_ = LoginUIService::SyncConfirmationUIClosedResult::
       SYNC_WITH_DEFAULT_SETTINGS;
-  dice_sync_starter->SyncStartupFailed();
+  sync_starter->SyncStartupFailed();
   CheckDelegateCalls();
 }
 
 // Checks that the profile can be deleted in the middle of the flow.
-TEST_F(DiceTurnSyncOnHelperTest, ProfileDeletion) {
+TEST_F(TurnSyncOnHelperTest, ProfileDeletion) {
   run_delegate_callbacks_ = false;  // Delegate is hanging.
 
   // Show the enterprise confirmation dialog.
@@ -1222,10 +1197,9 @@
   expected_sync_confirmation_shown_ = true;
   user_policy_signin_service()->set_dm_token("foo");
   user_policy_signin_service()->set_client_id("bar");
-  enterprise_choice_ = DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE;
+  enterprise_choice_ = TurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE;
   // Signin flow.
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
 
   // Delegate is now hanging at the enterprise confirmation dialog.
   // Dialog has been shown.
@@ -1237,16 +1211,15 @@
   // Delete the profile.
   ClearProfile();
 
-  // DiceTurnSyncOnHelper was destroyed.
+  // TurnSyncOnHelper was destroyed.
   EXPECT_EQ(1, delegate_destroyed());
 }
 
 // Checks that an existing instance is deleted when a new one is created.
-TEST_F(DiceTurnSyncOnHelperTest, AbortExisting) {
+TEST_F(TurnSyncOnHelperTest, AbortExisting) {
   // Create a first instance, stuck on policy requests.
   user_policy_signin_service()->set_is_hanging(true);
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT);
   // Check that it did not complete.
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
@@ -1259,8 +1232,7 @@
   sync_confirmation_result_ = LoginUIService::SyncConfirmationUIClosedResult::
       SYNC_WITH_DEFAULT_SETTINGS;
   SetExpectationsForSyncStartupCompleted(profile());
-  CreateDiceTurnOnSyncHelper(
-      DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
+  CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT);
   // Check that it completed.
   CheckDelegateCalls();
   EXPECT_TRUE(
diff --git a/chrome/browser/url_param_filter/OWNERS b/chrome/browser/url_param_filter/OWNERS
new file mode 100644
index 0000000..9e04438
--- /dev/null
+++ b/chrome/browser/url_param_filter/OWNERS
@@ -0,0 +1,3 @@
+bcb@chromium.org
+bcl@chromium.org
+mreichhoff@chromium.org
\ No newline at end of file
diff --git a/chrome/browser/url_param_filter/url_param_filter_classification.proto b/chrome/browser/url_param_filter/url_param_filter_classification.proto
new file mode 100644
index 0000000..0fdceed
--- /dev/null
+++ b/chrome/browser/url_param_filter/url_param_filter_classification.proto
@@ -0,0 +1,28 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto2";
+
+option optimize_for = LITE_RUNTIME;
+
+package url_param_filter;
+
+message FilterParameter {
+  optional string name = 1;  // required, eg. the "foo" in "?foo=bar"
+}
+
+message FilterClassification {
+  enum SiteRole {
+    SITE_ROLE_UNKNOWN = 0;
+    SOURCE = 1;
+    DESTINATION = 2;
+  }
+  optional string site = 1;         // eTLD+1, required
+  optional SiteRole site_role = 2;  // required
+  repeated FilterParameter parameters = 3;
+}
+
+message FilterClassifications {
+  repeated FilterClassification classifications = 1;
+}
diff --git a/chrome/browser/url_param_filter/url_param_filterer.cc b/chrome/browser/url_param_filter/url_param_filterer.cc
new file mode 100644
index 0000000..76ccef84
--- /dev/null
+++ b/chrome/browser/url_param_filter/url_param_filterer.cc
@@ -0,0 +1,108 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/url_param_filter/url_param_filterer.h"
+
+#include <vector>
+
+#include "base/strings/strcat.h"
+#include "base/strings/string_util.h"
+#include "chrome/browser/url_param_filter/url_param_filter_classification.pb.h"
+#include "net/base/escape.h"
+#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
+#include "net/base/url_util.h"
+#include "url/gurl.h"
+
+namespace url_param_filter {
+
+namespace {
+// Get the ETLD+1 of the URL, which means any subdomain is treated equivalently.
+std::string GetEtldPlusOne(const GURL& gurl) {
+  return net::registry_controlled_domains::GetDomainAndRegistry(
+      gurl, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
+}
+
+// Add the params classified as requiring filtering into the given parameter
+// set.
+void AddParams(std::set<std::string>& parameter_set,
+               url_param_filter::FilterClassification classification) {
+  for (auto i : classification.parameters()) {
+    parameter_set.insert(i.name());
+  }
+}
+
+// Filter a given URL according to the passed-in classifications, optionally
+// checking any encoded, nested URLs.
+GURL FilterUrl(const GURL& source_url,
+               const GURL& destination_url,
+               const ClassificationMap& source_classification_map,
+               const ClassificationMap& destination_classification_map,
+               bool check_nested) {
+  GURL result = GURL{destination_url};
+
+  std::string source_etld_plus1 = GetEtldPlusOne(source_url);
+  std::string destination_etld_plus1 = GetEtldPlusOne(destination_url);
+
+  std::set<std::string> blocked_parameters;
+  // Check whether source eTLD+1 has params classified as requiring filtering.
+  // If so, and the params are present on the destination URL, or any nested
+  // URLs, remove them.
+  auto source_classification_result =
+      source_classification_map.find(source_etld_plus1);
+  if (source_classification_result != source_classification_map.end()) {
+    AddParams(blocked_parameters, source_classification_result->second);
+  }
+  auto destination_classification_result =
+      destination_classification_map.find(destination_etld_plus1);
+  if (destination_classification_result !=
+      destination_classification_map.end()) {
+    AddParams(blocked_parameters, destination_classification_result->second);
+  }
+  // Return quickly if there are no parameters we care about.
+  if (blocked_parameters.size() == 0) {
+    return result;
+  }
+
+  std::vector<std::string> query_parts;
+  for (net::QueryIterator it(result); !it.IsAtEnd(); it.Advance()) {
+    const std::string key = std::string{it.GetKey()};
+    // If we don't find the given param in our set of blocked parameters, we can
+    // add it to the result safely.
+    if (blocked_parameters.find(base::ToLowerASCII(key)) ==
+        blocked_parameters.end()) {
+      std::string value = std::string{it.GetValue()};
+      if (check_nested) {
+        GURL nested = GURL{net::UnescapeBinaryURLComponent(value)};
+        if (nested.is_valid()) {
+          GURL modified =
+              FilterUrl(destination_url, nested, source_classification_map,
+                        destination_classification_map, false);
+          // If a nested URL contains a param we must filter, do so now.
+          if (nested != modified) {
+            value =
+                net::EscapeQueryParamValue(modified.spec(), /*use_plus=*/false);
+          }
+        }
+      }
+      query_parts.push_back(base::StrCat({key, "=", value}));
+    }
+  }
+
+  std::string new_query = base::JoinString(query_parts, "&");
+  GURL::Replacements replacements;
+  replacements.SetQueryStr(new_query);
+  result = result.ReplaceComponents(replacements);
+  return result;
+}
+}  // anonymous namespace
+
+GURL FilterUrl(const GURL& source_url,
+               const GURL& destination_url,
+               const ClassificationMap& source_classification_map,
+               const ClassificationMap& destination_classification_map) {
+  return FilterUrl(source_url, destination_url, source_classification_map,
+                   destination_classification_map, true);
+}
+
+}  // namespace url_param_filter
diff --git a/chrome/browser/url_param_filter/url_param_filterer.h b/chrome/browser/url_param_filter/url_param_filterer.h
new file mode 100644
index 0000000..4eae5c9
--- /dev/null
+++ b/chrome/browser/url_param_filter/url_param_filterer.h
@@ -0,0 +1,24 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_URL_PARAM_FILTER_URL_PARAM_FILTERER_H_
+#define CHROME_BROWSER_URL_PARAM_FILTER_URL_PARAM_FILTERER_H_
+
+#include <unordered_map>
+#include "chrome/browser/url_param_filter/url_param_filter_classification.pb.h"
+#include "url/gurl.h"
+
+namespace url_param_filter {
+using ClassificationMap =
+    std::unordered_map<std::string, url_param_filter::FilterClassification>;
+
+// Filter the destination URL according to the parameter classifications for the
+// source and destination URLs.
+GURL FilterUrl(const GURL& source_url,
+               const GURL& destination_url,
+               const ClassificationMap& source_classification_map,
+               const ClassificationMap& destination_classification_map);
+
+}  // namespace url_param_filter
+#endif  // CHROME_BROWSER_URL_PARAM_FILTER_URL_PARAM_FILTERER_H_
diff --git a/chrome/browser/url_param_filter/url_param_filterer_unittest.cc b/chrome/browser/url_param_filter/url_param_filterer_unittest.cc
new file mode 100644
index 0000000..6cbbf08
--- /dev/null
+++ b/chrome/browser/url_param_filter/url_param_filterer_unittest.cc
@@ -0,0 +1,239 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/url_param_filter/url_param_filterer.h"
+
+#include <string>
+
+#include "chrome/browser/url_param_filter/url_param_filter_classification.pb.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class UrlParamFiltererTest : public ::testing::Test {};
+
+url_param_filter::ClassificationMap CreateClassificationMap(
+    std::map<std::string, std::vector<std::string>> source) {
+  url_param_filter::ClassificationMap result;
+  for (auto i : source) {
+    url_param_filter::FilterClassification classification;
+    for (auto j : i.second) {
+      url_param_filter::FilterParameter* parameter =
+          classification.add_parameters();
+      parameter->set_name(j);
+    }
+    result[i.first] = classification;
+  }
+  return result;
+}
+TEST_F(UrlParamFiltererTest, FilterUrlEmptyClassifications) {
+  GURL source = GURL{"http://source.xyz"};
+  GURL expected = GURL{"https://destination.xyz?nochange=asdf"};
+  // If no classifications are passed in, don't modify the destination URL.
+  GURL result = url_param_filter::FilterUrl(
+      source, expected, url_param_filter::ClassificationMap(),
+      url_param_filter::ClassificationMap());
+  ASSERT_EQ(result, expected);
+}
+
+TEST_F(UrlParamFiltererTest, FilterUrlNoChanges) {
+  GURL source = GURL{"http://source.xyz"};
+  GURL expected = GURL{"https://destination.xyz?nochange=asdf"};
+  url_param_filter::ClassificationMap source_classification_map =
+      CreateClassificationMap({{"source.xyz", {"plzblock"}}});
+  url_param_filter::ClassificationMap destination_classification_map =
+      CreateClassificationMap({{"destination.xyz", {"plzblock1"}}});
+
+  // If classifications are passed in, but the destination URL doesn't contain
+  // any blocked params, don't modify it.
+  GURL result =
+      url_param_filter::FilterUrl(source, expected, source_classification_map,
+                                  destination_classification_map);
+  ASSERT_EQ(result, expected);
+}
+
+TEST_F(UrlParamFiltererTest, FilterUrlSourceBlocked) {
+  GURL source = GURL{"https://source.xyz"};
+  GURL destination = GURL{"https://destination.xyz?plzblock=123&nochange=asdf"};
+  url_param_filter::ClassificationMap source_classification_map =
+      CreateClassificationMap({{"source.xyz", {"plzblock"}}});
+
+  // Navigations from source.xyz with a param called plzblock should have that
+  // param removed, regardless of destination.
+  GURL expected = GURL{"https://destination.xyz?nochange=asdf"};
+  GURL result = url_param_filter::FilterUrl(
+      source, destination, source_classification_map,
+      url_param_filter::ClassificationMap());
+  ASSERT_EQ(result, expected);
+}
+
+TEST_F(UrlParamFiltererTest, FilterUrlMultipleSourceBlocked) {
+  GURL source = GURL{"https://source.xyz"};
+  GURL destination =
+      GURL{"https://destination.xyz?plzblock=123&plzblock1=321&nochange=asdf"};
+  url_param_filter::ClassificationMap source_classification_map =
+      CreateClassificationMap({{"source.xyz", {"plzblock", "plzblock1"}}});
+
+  // Navigations from source.xyz with a param called plzblock or plzblock1
+  // should have those params removed, regardless of destination.
+  GURL expected = GURL{"https://destination.xyz?nochange=asdf"};
+  GURL result = url_param_filter::FilterUrl(
+      source, destination, source_classification_map,
+      url_param_filter::ClassificationMap());
+  ASSERT_EQ(result, expected);
+}
+
+TEST_F(UrlParamFiltererTest, FilterUrlDestinationBlocked) {
+  GURL source = GURL{"https://source.xyz"};
+  GURL destination = GURL{"https://destination.xyz?plzblock=123&nochange=asdf"};
+  url_param_filter::ClassificationMap destination_classification_map =
+      CreateClassificationMap({{"destination.xyz", {"plzblock"}}});
+
+  // Navigations to destination.xyz with a param called plzblock should have
+  // that param removed, regardless of source.
+  GURL expected = GURL{"https://destination.xyz?nochange=asdf"};
+  GURL result = url_param_filter::FilterUrl(
+      source, destination, url_param_filter::ClassificationMap(),
+      destination_classification_map);
+  ASSERT_EQ(result, expected);
+}
+
+TEST_F(UrlParamFiltererTest, FilterUrlMultipleDestinationBlocked) {
+  GURL source = GURL{"https://source.xyz"};
+  GURL destination =
+      GURL{"https://destination.xyz?plzblock=123&plzblock1=321&nochange=asdf"};
+  url_param_filter::ClassificationMap destination_classification_map =
+      CreateClassificationMap({{"destination.xyz", {"plzblock", "plzblock1"}}});
+
+  // Navigations to destination.xyz with a param called plzblock and/or
+  // plzblock1 should have those param removed, regardless of source.
+  GURL expected = GURL{"https://destination.xyz?nochange=asdf"};
+  GURL result = url_param_filter::FilterUrl(
+      source, destination, url_param_filter::ClassificationMap(),
+      destination_classification_map);
+  ASSERT_EQ(result, expected);
+}
+
+TEST_F(UrlParamFiltererTest, FilterUrlSourceAndDestinationBlocked) {
+  GURL source = GURL{"https://source.xyz"};
+  GURL destination =
+      GURL{"https://destination.xyz?plzblock=123&plzblock1=321&nochange=asdf"};
+  url_param_filter::ClassificationMap source_classification_map =
+      CreateClassificationMap({{"source.xyz", {"plzblock"}}});
+  url_param_filter::ClassificationMap destination_classification_map =
+      CreateClassificationMap({{"destination.xyz", {"plzblock1"}}});
+
+  // Both source and destination have associated URL param filtering rules. Only
+  // nochange should remain.
+  GURL expected = GURL{"https://destination.xyz?nochange=asdf"};
+  GURL result = url_param_filter::FilterUrl(source, destination,
+                                            source_classification_map,
+                                            destination_classification_map);
+  ASSERT_EQ(result, expected);
+}
+
+TEST_F(UrlParamFiltererTest,
+       FilterUrlSourceAndDestinationBlockedCheckOrderingPreserved) {
+  GURL source = GURL{"https://source.xyz"};
+  GURL destination = GURL{
+      "https://"
+      "destination.xyz?plzblock=123&plzblock1=321&nochange=asdf&laternochange="
+      "fdsa"};
+  url_param_filter::ClassificationMap source_classification_map =
+      CreateClassificationMap({{"source.xyz", {"plzblock"}}});
+  url_param_filter::ClassificationMap destination_classification_map =
+      CreateClassificationMap({{"destination.xyz", {"plzblock1"}}});
+
+  // Both source and destination have associated URL param filtering rules. Only
+  // nochange should remain.
+  GURL expected =
+      GURL{"https://destination.xyz?nochange=asdf&laternochange=fdsa"};
+  GURL result = url_param_filter::FilterUrl(source, destination,
+                                            source_classification_map,
+                                            destination_classification_map);
+  ASSERT_EQ(result, expected);
+}
+
+TEST_F(UrlParamFiltererTest, FilterUrlSubdomainsApplied) {
+  GURL source = GURL{"https://subdomain.source.xyz"};
+  GURL destination = GURL{
+      "https://"
+      "subdomain.destination.xyz?plzblock=123&plzblock1=321&nochange=asdf"};
+  url_param_filter::ClassificationMap source_classification_map =
+      CreateClassificationMap({{"source.xyz", {"plzblock"}}});
+  url_param_filter::ClassificationMap destination_classification_map =
+      CreateClassificationMap({{"destination.xyz", {"plzblock1"}}});
+
+  GURL expected = GURL{"https://subdomain.destination.xyz?nochange=asdf"};
+  GURL result = url_param_filter::FilterUrl(source, destination,
+                                            source_classification_map,
+                                            destination_classification_map);
+  ASSERT_EQ(result, expected);
+}
+
+TEST_F(UrlParamFiltererTest, FilterUrlCaseIgnored) {
+  GURL source = GURL{"https://source.xyz"};
+  GURL destination =
+      GURL{"https://destination.xyz?PlZbLoCk=123&PLZBLOCK1=321&nochange=asdf"};
+  url_param_filter::ClassificationMap source_classification_map =
+      CreateClassificationMap({{"source.xyz", {"plzblock"}}});
+  url_param_filter::ClassificationMap destination_classification_map =
+      CreateClassificationMap({{"destination.xyz", {"plzblock1"}}});
+
+  // The disallowed params PlZbLoCk and PLZBLOCK1 should be removed.
+  GURL expected = GURL{"https://destination.xyz?nochange=asdf"};
+  GURL result = url_param_filter::FilterUrl(source, destination,
+                                            source_classification_map,
+                                            destination_classification_map);
+  ASSERT_EQ(result, expected);
+}
+
+TEST_F(UrlParamFiltererTest, FilterUrlWithNestedUrl) {
+  GURL source = GURL{"https://source.xyz"};
+  GURL destination = GURL{
+      "https://"
+      "subdomain.source.xyz?destination=https%3A%2F%2Fdestination.xyz%2F%"
+      "3Fplzblock1%"
+      "3D123%26nochange%3Dasdf&PLZBLOCK1=321&nochange=asdf"};
+  url_param_filter::ClassificationMap source_classification_map =
+      CreateClassificationMap({{"source.xyz", {"plzblock"}}});
+  url_param_filter::ClassificationMap destination_classification_map =
+      CreateClassificationMap(
+          {{"destination.xyz", {"plzblock1"}}, {"source.xyz", {"plzblock1"}}});
+
+  // The nested URL pattern is commonly observed; we do not want the parameter
+  // to leak.
+  GURL expected = GURL{
+      "https://"
+      "subdomain.source.xyz?destination=https%3A%2F%2Fdestination.xyz%2F%"
+      "3Fnochange%"
+      "3Dasdf&nochange=asdf"};
+  GURL result = url_param_filter::FilterUrl(source, destination,
+                                            source_classification_map,
+                                            destination_classification_map);
+  ASSERT_EQ(result, expected);
+}
+
+TEST_F(UrlParamFiltererTest, FilterUrlWithNestedUrlNotNeedingFiltering) {
+  GURL source = GURL{"https://source.xyz"};
+  GURL destination = GURL{
+      "https://"
+      "subdomain.source.xyz?destination=https%3A%2F%2Fdestination.xyz%2F%"
+      "3Fnochange%"
+      "3Dasdf&PLZBLOCK1=321&nochange=asdf"};
+  url_param_filter::ClassificationMap source_classification_map =
+      CreateClassificationMap({{"source.xyz", {"plzblock"}}});
+  url_param_filter::ClassificationMap destination_classification_map =
+      CreateClassificationMap(
+          {{"destination.xyz", {"plzblock1"}}, {"source.xyz", {"plzblock1"}}});
+
+  // The nested URL does not have filtered parameters and should be left alone.
+  GURL expected = GURL{
+      "https://"
+      "subdomain.source.xyz?destination=https%3A%2F%2Fdestination.xyz%2F%"
+      "3Fnochange%"
+      "3Dasdf&nochange=asdf"};
+  GURL result = url_param_filter::FilterUrl(source, destination,
+                                            source_classification_map,
+                                            destination_classification_map);
+  ASSERT_EQ(result, expected);
+}
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
index a84fccf8..af2d07f 100644
--- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
+++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
@@ -195,6 +195,10 @@
   }
 }
 
+bool IsNoteTakingWebApp(const web_app::WebApp& web_app) {
+  return web_app.note_taking_new_note_url().is_valid();
+}
+
 }  // namespace
 
 void UninstallImpl(WebAppProvider* provider,
@@ -590,7 +594,11 @@
   // Add the intent filters for PWAs.
   base::Extend(app->intent_filters,
                apps_util::CreateWebAppIntentFilters(
-                   *web_app, registrar().GetAppScope(web_app->app_id())));
+                   web_app->app_id(), IsNoteTakingWebApp(*web_app),
+                   registrar().GetAppScope(web_app->app_id()),
+                   registrar().GetAppShareTarget(web_app->app_id()),
+                   provider_->os_integration_manager().GetEnabledFileHandlers(
+                       web_app->app_id())));
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   if (web_app->app_id() == crostini::kCrostiniTerminalSystemAppId) {
@@ -1143,6 +1151,14 @@
   return is_shutting_down_;
 }
 
+void WebAppPublisherHelper::OnWebAppFileHandlerApprovalStateChanged(
+    const AppId& app_id) {
+  const WebApp* web_app = GetWebApp(app_id);
+  if (web_app && Accepts(app_id)) {
+    delegate_->PublishWebApp(ConvertWebApp(web_app));
+  }
+}
+
 void WebAppPublisherHelper::OnWebAppInstalled(const AppId& app_id) {
   const WebApp* web_app = GetWebApp(app_id);
   if (web_app && Accepts(app_id)) {
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.h b/chrome/browser/web_applications/app_service/web_app_publisher_helper.h
index 56f69c7..e254012 100644
--- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.h
+++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.h
@@ -273,6 +273,7 @@
                                base::StringPiece old_name) override;
   void OnWebAppWillBeUninstalled(const AppId& app_id) override;
   void OnAppRegistrarDestroyed() override;
+  void OnWebAppFileHandlerApprovalStateChanged(const AppId& app_id) override;
   void OnWebAppLocallyInstalledStateChanged(const AppId& app_id,
                                             bool is_locally_installed) override;
   void OnWebAppLastLaunchTimeChanged(
diff --git a/chrome/browser/web_applications/app_service/web_apps_publisher_host_browsertest.cc b/chrome/browser/web_applications/app_service/web_apps_publisher_host_browsertest.cc
index 98b5c2d6..2203458b 100644
--- a/chrome/browser/web_applications/app_service/web_apps_publisher_host_browsertest.cc
+++ b/chrome/browser/web_applications/app_service/web_apps_publisher_host_browsertest.cc
@@ -20,6 +20,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/test/bind.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/values.h"
 #include "chrome/browser/apps/app_service/app_icon/app_icon_factory.h"
@@ -130,6 +131,49 @@
   return content::EvalJs(web_contents, script);
 }
 
+// Returns whether there are file view filters among the given list of intent
+// filters.
+bool HasFileViewFilters(
+    const std::vector<apps::mojom::IntentFilterPtr>& intent_filters) {
+  for (const auto& intent_filter : intent_filters) {
+    bool has_action_view = false;
+    bool has_mime_type = false;
+    bool has_file_extension = false;
+
+    for (const auto& condition : intent_filter->conditions) {
+      switch (condition->condition_type) {
+        case apps::mojom::ConditionType::kAction:
+          if (condition->condition_values.size() == 1 &&
+              condition->condition_values.back()->value ==
+                  apps_util::kIntentActionView) {
+            has_action_view = true;
+          }
+          break;
+        case apps::mojom::ConditionType::kFile:
+          for (const auto& condition_value : condition->condition_values) {
+            if (condition_value->match_type ==
+                apps::mojom::PatternMatchType::kMimeType) {
+              has_mime_type = true;
+            } else if (condition_value->match_type ==
+                       apps::mojom::PatternMatchType::kFileExtension) {
+              has_file_extension = true;
+            }
+          }
+          break;
+        default:
+          // NOOP
+          break;
+      }
+    }
+
+    if (has_action_view && (has_mime_type || has_file_extension)) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
 }  // namespace
 
 class WebAppsPublisherHostBrowserTest : public WebAppControllerBrowserTest {
@@ -928,4 +972,41 @@
   EXPECT_EQ("_sample.mp4", ReadTextContent(web_contents, "video_filename"));
 }
 
+// Regression test for crbug.com/1266642
+IN_PROC_BROWSER_TEST_F(WebAppsPublisherHostBrowserTest,
+                       PublishOnlyEnabledFileHandlers) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  auto app_id = InstallWebAppFromManifest(
+      browser(),
+      embedded_test_server()->GetURL("/web_app_file_handling/basic_app.html"));
+
+  // Have to call it explicitly due to usage of
+  // OsIntegrationManager::ScopedSuppressForTesting
+  provider()
+      .os_integration_manager()
+      .file_handler_manager_for_testing()
+      .EnableAndRegisterOsFileHandlers(app_id);
+
+  MockAppPublisher mock_app_publisher;
+  WebAppsPublisherHost web_apps_publisher_host(profile());
+  web_apps_publisher_host.SetPublisherForTesting(&mock_app_publisher);
+  web_apps_publisher_host.Init();
+  mock_app_publisher.Wait();
+  EXPECT_EQ(mock_app_publisher.get_deltas().size(), 1U);
+
+  EXPECT_TRUE(HasFileViewFilters(
+      mock_app_publisher.get_deltas().back()->intent_filters));
+
+  EXPECT_EQ(ApiApprovalState::kRequiresPrompt,
+            provider().registrar().GetAppFileHandlerApprovalState(app_id));
+  provider().sync_bridge().SetAppFileHandlerApprovalState(
+      app_id, ApiApprovalState::kDisallowed);
+
+  mock_app_publisher.Wait();
+  EXPECT_EQ(mock_app_publisher.get_deltas().size(), 2U);
+
+  EXPECT_FALSE(HasFileViewFilters(
+      mock_app_publisher.get_deltas().back()->intent_filters));
+}
+
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_file_handler_manager.cc b/chrome/browser/web_applications/web_app_file_handler_manager.cc
index dadeb3e4..37b1aa5 100644
--- a/chrome/browser/web_applications/web_app_file_handler_manager.cc
+++ b/chrome/browser/web_applications/web_app_file_handler_manager.cc
@@ -236,8 +236,9 @@
 
 bool WebAppFileHandlerManager::ShouldOsIntegrationBeEnabled(
     const AppId& app_id) const {
-  return GetRegistrar() &&
-         GetRegistrar()->ExpectThatFileHandlersAreRegisteredWithOs(app_id);
+  return !ShouldRegisterFileHandlersWithOs() ||
+         (GetRegistrar() &&
+          GetRegistrar()->ExpectThatFileHandlersAreRegisteredWithOs(app_id));
 }
 
 const WebAppRegistrar* WebAppFileHandlerManager::GetRegistrar() const {
diff --git a/chrome/browser/web_applications/web_app_file_handler_manager_unittest.cc b/chrome/browser/web_applications/web_app_file_handler_manager_unittest.cc
index b0b399e..947962f 100644
--- a/chrome/browser/web_applications/web_app_file_handler_manager_unittest.cc
+++ b/chrome/browser/web_applications/web_app_file_handler_manager_unittest.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/web_applications/test/fake_web_app_registry_controller.h"
 #include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/browser/web_applications/test/web_app_test_utils.h"
+#include "chrome/browser/web_applications/web_app_file_handler_registration.h"
 #include "components/services/app_service/public/cpp/file_handler.h"
 #include "testing/gmock/include/gmock/gmock-matchers.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -199,6 +200,11 @@
 };
 
 TEST_F(WebAppFileHandlerManagerTest, FileHandlersAreNotAvailableUnlessEnabled) {
+  // TODO(crbug/1288442): re-enable this test
+  if (!ShouldRegisterFileHandlersWithOs()) {
+    GTEST_SKIP();
+  }
+
   file_handler_manager().InstallFileHandler(app_id(),
                                             GURL("https://app.site/handle-foo"),
                                             {{"application/foo", {".foo"}}},
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index bfa6823..a94fc202 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1643716582-7dca657287268f61f1b1cd5b30b9ce2a59909105.profdata
+chrome-linux-main-1643738083-2aa85f3bba9b0b5fb301707a94a45137748d6646.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 6f094c73..edd40f9f 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1643716582-b9883d2b9fee52c8faae9a4330519c7928b33041.profdata
+chrome-win32-main-1643727305-b6f154e2ecb7077c3c091c586b1c3058491bccf0.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 0094350..3626cfb 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1643716582-33f00b1fa5916ab55291dc24da9d26fe4366d2e4.profdata
+chrome-win64-main-1643727305-1e6ebae9350bff56d95ac27e45d9cf5eb4bb0aad.profdata
diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json
index 44fef6f..8681c4c6 100644
--- a/chrome/common/extensions/api/_permission_features.json
+++ b/chrome/common/extensions/api/_permission_features.json
@@ -466,12 +466,12 @@
   "dependencies": ["behavior:imprivata_extension"],
   "extension_types": ["extension","login_screen_extension"],
   "location": "policy",
-  "platforms": ["chromeos"]
+  "platforms": ["chromeos", "lacros"]
   }, {
     "channel": "stable",
     "extension_types": ["extension","login_screen_extension"],
     "location": "policy",
-    "platforms": ["chromeos"],
+    "platforms": ["chromeos", "lacros"],
     "allowlist": [
       "7FE4A999359A456C4B0FB7B7AD85CEA29CA50519", // Login screen APIs test extension
       "3F5995FE79A861F019C6F093BEF98D73FA9D3A5F"  // Login screen APIs in-sesesion test extension
diff --git a/chrome/common/extensions/api/api_sources.gni b/chrome/common/extensions/api/api_sources.gni
index f80c7f36..0bbe9359 100644
--- a/chrome/common/extensions/api/api_sources.gni
+++ b/chrome/common/extensions/api/api_sources.gni
@@ -80,6 +80,7 @@
     "enterprise_platform_keys.idl",
     "enterprise_platform_keys_internal.idl",
     "file_browser_handler_internal.json",
+    "login.idl",
     "login_state.idl",
     "platform_keys_internal.idl",
     "platform_keys.idl",
@@ -105,7 +106,6 @@
     "file_system_provider_internal.idl",
     "input_ime.json",
     "input_method_private.json",
-    "login.idl",
     "login_screen_storage.idl",
     "login_screen_ui.idl",
     "speech_recognition_private.idl",
diff --git a/chrome/common/extensions/api/login.idl b/chrome/common/extensions/api/login.idl
index e1bf896e..6d4c6b51 100644
--- a/chrome/common/extensions/api/login.idl
+++ b/chrome/common/extensions/api/login.idl
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 // Use the <code>chrome.login</code> API to launch and exit user sessions.
-[platforms=("chromeos"),
+[platforms=("chromeos", "lacros"),
  implemented_in="chrome/browser/chromeos/extensions/login_screen/login/login_api.h"]
 namespace login {
   callback VoidCallback = void ();
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn
index e9026db1..f664cf0 100644
--- a/chrome/renderer/BUILD.gn
+++ b/chrome/renderer/BUILD.gn
@@ -254,7 +254,6 @@
     deps += [
       "//components/pdf/common",
       "//components/pdf/renderer",
-      "//pdf:features",
     ]
 
     if (is_linux || is_chromeos) {
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index b91adcc7..86e10b0 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -205,8 +205,6 @@
 #include "chrome/renderer/pdf/chrome_pdf_internal_plugin_delegate.h"
 #include "components/pdf/common/internal_plugin_helpers.h"
 #include "components/pdf/renderer/internal_plugin_renderer_helpers.h"
-#include "components/pdf/renderer/pdf_find_in_page.h"
-#include "pdf/pdf_features.h"
 #endif  // BUILDFLAG(ENABLE_PDF)
 
 #if BUILDFLAG(ENABLE_PLUGINS)
@@ -712,14 +710,6 @@
   }
 #endif
 
-#if BUILDFLAG(ENABLE_PDF)
-  if (base::FeatureList::IsEnabled(chrome_pdf::features::kPdfUnseasoned)) {
-    associated_interfaces->AddInterface(
-        base::BindRepeating(&pdf::PdfFindInPageFactory::BindReceiver,
-                            render_frame->GetRoutingID()));
-  }
-#endif
-
 #if BUILDFLAG(IS_WIN)
   if (render_frame->IsMainFrame()) {
     associated_interfaces->AddInterface(base::BindRepeating(
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 802bd74..b63fec3 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1103,7 +1103,6 @@
       "//chrome/browser/apps/app_service:test_support",
       "//chrome/browser/breadcrumbs:browser_tests",
       "//chrome/browser/browsing_data:constants",
-      "//chrome/browser/commerce:feature_list",
       "//chrome/browser/continuous_search:browser_tests",
       "//chrome/browser/devtools",
       "//chrome/browser/devtools:test_support",
@@ -1164,13 +1163,13 @@
       "//components/cast_channel",
       "//components/cbor",
       "//components/certificate_transparency",
+      "//components/commerce/core:feature_list",
       "//components/constrained_window",
       "//components/content_settings/browser",
       "//components/content_settings/common:mojom",
       "//components/cookie_config",
       "//components/country_codes",
       "//components/crash/content/browser/error_reporting:mock_crash_endpoint",
-      "//components/data_reduction_proxy/core/browser:test_support",
       "//components/dom_distiller/content/browser",
       "//components/dom_distiller/content/browser:test_support",
       "//components/dom_distiller/content/renderer",
@@ -1547,9 +1546,6 @@
       "../browser/content_settings/sound_content_setting_observer_browsertest.cc",
       "../browser/crash_recovery_browsertest.cc",
       "../browser/custom_handlers/protocol_handler_registry_browsertest.cc",
-      "../browser/data_saver/data_saver_browsertest.cc",
-      "../browser/data_saver/data_saver_holdback_browsertest.cc",
-      "../browser/data_saver/data_saver_webapis_browsertest.cc",
       "../browser/device_api/managed_configuration_api_browsertest.cc",
       "../browser/devtools/device/adb/adb_client_socket_browsertest.cc",
       "../browser/devtools/device/adb/mock_adb_server.cc",
@@ -4551,7 +4547,6 @@
     "../browser/content_settings/page_specific_content_settings_unittest.cc",
     "../browser/content_settings/sound_content_setting_observer_unittest.cc",
     "../browser/custom_handlers/chrome_protocol_handler_registry_unittest.cc",
-    "../browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_unittest.cc",
     "../browser/download/bubble/download_display_controller_unittest.cc",
     "../browser/download/chrome_download_manager_delegate_unittest.cc",
     "../browser/download/deferred_client_wrapper_unittest.cc",
@@ -4866,6 +4861,7 @@
     "../browser/ui/webui/local_state/local_state_ui_unittest.cc",
     "../browser/ui/webui/log_web_ui_url_unittest.cc",
     "../browser/update_client/chrome_update_query_params_delegate_unittest.cc",
+    "../browser/url_param_filter/url_param_filterer_unittest.cc",
     "../browser/visibility_timer_tab_helper_unittest.cc",
     "../browser/vr/vr_tab_helper_unittest.cc",
     "../browser/webid/federated_identity_active_session_permission_context_unittest.cc",
@@ -5207,10 +5203,10 @@
     "//chrome/browser:buildflags",
     "//chrome/browser:permissions_proto",
     "//chrome/browser:theme_properties",
+    "//chrome/browser:url_param_filter_classification_proto",
     "//chrome/browser/breadcrumbs",
     "//chrome/browser/breadcrumbs:unit_tests",
     "//chrome/browser/browsing_data:constants",
-    "//chrome/browser/commerce:feature_list",
     "//chrome/browser/commerce/shopping_list:unit_tests",
     "//chrome/browser/devtools",
     "//chrome/browser/feature_guide/notifications:unit_tests",
@@ -5277,6 +5273,7 @@
     "//components/captive_portal/core:buildflags",
     "//components/cast_channel:cast_channel",
     "//components/cast_channel:test_support",
+    "//components/commerce/core:feature_list",
     "//components/component_updater:test_support",
     "//components/content_settings/browser",
     "//components/content_settings/browser:test_support",
@@ -5285,7 +5282,6 @@
     "//components/country_codes",
     "//components/custom_handlers",
     "//components/custom_handlers:test_support",
-    "//components/data_reduction_proxy/core/browser:test_support",
     "//components/download/public/background_service/test:test_support",
     "//components/drive",
     "//components/drive:test_support",
@@ -5738,7 +5734,7 @@
   if (is_win || is_mac || (is_linux || is_chromeos_lacros)) {
     sources += [
       "../browser/ui/profile_picker_unittest.cc",
-      "../browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc",
+      "../browser/ui/webui/signin/turn_sync_on_helper_unittest.cc",
     ]
   }
 
@@ -7960,6 +7956,8 @@
     # including CrashKeys in reports.
     sources -= [ "../common/crash_keys_unittest.cc" ]
 
+    sources += [ "../browser/fuchsia/element_manager_impl_unittest.cc" ]
+
     data += [ "//testing/buildbot/filters/fuchsia.unit_tests.filter" ]
 
     additional_manifest_fragments = [
@@ -8086,7 +8084,6 @@
       "//chrome/app:command_ids",
       "//chrome/browser",
       "//chrome/browser:browser_process",
-      "//chrome/browser/commerce:feature_list",
       "//chrome/browser/devtools",
       "//chrome/browser/profiles:profile",
       "//chrome/browser/ui",
@@ -8109,6 +8106,7 @@
       "//components/bookmarks/browser",
       "//components/captive_portal/content",
       "//components/captive_portal/core:buildflags",
+      "//components/commerce/core:feature_list",
       "//components/content_settings/core/browser",
       "//components/embedder_support",
       "//components/feature_engagement",
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index f9b26f9..12dfd56 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -6952,19 +6952,7 @@
     ]
   },
   "DataCompressionProxyEnabled": {
-    "os": [
-      "android"
-    ],
-    "policy_pref_mapping_tests": [
-      {
-        "policies": {
-          "DataCompressionProxyEnabled": false
-        },
-        "prefs": {
-          "spdy_proxy.enabled": {}
-        }
-      }
-    ]
+    "reason_for_missing_test": "Policy was removed"
   },
   "ForceEphemeralProfiles": {
     "reason_for_missing_test": "TODO(crbug.com/1213429) add test case"
@@ -18005,5 +17993,44 @@
         }
       }
     ]
+  },
+  "WindowPlacementAlwaysAllowed": {
+    "os": [
+      "win",
+      "linux",
+      "mac",
+      "chromeos_ash",
+      "chromeos_lacros"
+    ],
+    "policy_pref_mapping_tests": [
+      {
+        "policies": {},
+        "prefs": {
+          "window_placement_always_allowed": {
+            "default_value": false
+          }
+        }
+      },
+      {
+        "policies": {
+          "WindowPlacementAlwaysAllowed": false
+        },
+        "prefs": {
+          "window_placement_always_allowed": {
+            "value": false
+          }
+        }
+      },
+      {
+        "policies": {
+          "WindowPlacementAlwaysAllowed": true
+        },
+        "prefs": {
+          "window_placement_always_allowed": {
+            "value": true
+          }
+        }
+      }
+    ]
   }
 }
diff --git a/chrome/test/data/webui/chromeos/firmware_update/BUILD.gn b/chrome/test/data/webui/chromeos/firmware_update/BUILD.gn
index 6b90edc..f3fa299 100644
--- a/chrome/test/data/webui/chromeos/firmware_update/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/firmware_update/BUILD.gn
@@ -71,6 +71,7 @@
     "//ash/webui/firmware_update_ui/resources:update_card",
     "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
     "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
+    "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [ "$externs_path/mocha-2.5.js" ]
 }
diff --git a/chrome/test/data/webui/chromeos/firmware_update/firmware_update_test.js b/chrome/test/data/webui/chromeos/firmware_update/firmware_update_test.js
index 02f791f4..748065f 100644
--- a/chrome/test/data/webui/chromeos/firmware_update/firmware_update_test.js
+++ b/chrome/test/data/webui/chromeos/firmware_update/firmware_update_test.js
@@ -12,6 +12,7 @@
 import {getUpdateProvider, setUpdateControllerForTesting, setUpdateProviderForTesting} from 'chrome://accessory-update/mojo_interface_provider.js';
 import {mojoString16ToString} from 'chrome://accessory-update/mojo_utils.js';
 import {UpdateCardElement} from 'chrome://accessory-update/update_card.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {flushTasks} from '../../test_util.js';
@@ -161,7 +162,8 @@
     assertEquals(UpdateState.kUpdating, getUpdateState());
     const fakeFirmwareUpdate = getFirmwareUpdateFromDialog();
     assertEquals(
-        `Updating ${mojoString16ToString(fakeFirmwareUpdate.deviceName)}`,
+        loadTimeData.getStringF(
+            'updating', mojoString16ToString(fakeFirmwareUpdate.deviceName)),
         getUpdateDialogTitle().innerText.trim());
     // Allow firmware update to complete.
     await controller.getUpdateCompletedPromiseForTesting();
@@ -169,8 +171,9 @@
     assertEquals(UpdateState.kSuccess, getUpdateState());
     assertTrue(getUpdateDialog().open);
     assertEquals(
-        `Your ${
-            mojoString16ToString(fakeFirmwareUpdate.deviceName)} is up to date`,
+        loadTimeData.getStringF(
+            'deviceUpToDate',
+            mojoString16ToString(fakeFirmwareUpdate.deviceName)),
         getUpdateDialogTitle().innerText.trim());
   });
 
@@ -187,7 +190,8 @@
     assertEquals(UpdateState.kUpdating, getUpdateState());
     const fakeFirmwareUpdate = getFirmwareUpdateFromDialog();
     assertEquals(
-        `Updating ${mojoString16ToString(fakeFirmwareUpdate.deviceName)}`,
+        loadTimeData.getStringF(
+            'updating', mojoString16ToString(fakeFirmwareUpdate.deviceName)),
         getUpdateDialogTitle().innerText.trim());
     // Allow firmware update to complete.
     await controller.getUpdateCompletedPromiseForTesting();
@@ -195,8 +199,9 @@
     assertEquals(UpdateState.kFailed, getUpdateState());
     assertTrue(getUpdateDialog().open);
     assertEquals(
-        `Failed to update ${
-            mojoString16ToString(fakeFirmwareUpdate.deviceName)}`,
+        loadTimeData.getStringF(
+            'updateFailedTitleText',
+            mojoString16ToString(fakeFirmwareUpdate.deviceName)),
         getUpdateDialogTitle().innerText.trim());
   });
 
@@ -215,7 +220,8 @@
     assertEquals(UpdateState.kUpdating, getUpdateState());
     const fakeUpdate = getFirmwareUpdateFromDialog();
     assertEquals(
-        `Updating ${mojoString16ToString(fakeUpdate.deviceName)}`,
+        loadTimeData.getStringF(
+            'updating', mojoString16ToString(fakeUpdate.deviceName)),
         getUpdateDialogTitle().innerText.trim());
     // Allow firmware update to complete.
     await controller.getUpdateCompletedPromiseForTesting();
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index 9d3dba6..537c00d 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -2614,11 +2614,14 @@
       <message name="IDS_FIRMWARE_UPDATE_BUTTON_A11Y_LABEL" desc="A11y Label for button to start the firmware update.">
         Update <ph name="DEVICE_NAME">$1<ex>Logitech keyboard</ex></ph>
       </message>
+      <message name="IDS_FIRMWARE_OK_BUTTON_TEXT" desc="Label for button shown when an install fails.">
+        OK
+      </message>
       <message name="IDS_FIRMWARE_UPDATING_TEXT" desc="Label for showing that a device is being updated.">
-        Updating <ph name="DEVICE_NAME">$1<ex>Logitech keyboard</ex></ph>
+        Updating firmware on <ph name="DEVICE_NAME">$1<ex>Logitech keyboard</ex></ph>
       </message>
       <message name="IDS_FIRMWARE_DEVICE_UP_TO_DATE_TEXT" desc="Label for when a device is up to date.">
-        Your <ph name="DEVICE_NAME">$1<ex>Logitech keyboard</ex></ph> is up to date
+        Your <ph name="DEVICE_NAME">$1<ex>Logitech keyboard</ex></ph> is now up to date
       </message>
       <message name="IDS_FIRMWARE_HAS_BEEN_UPDATED_TEXT" desc="Label for displaying which version the device has been updated to.">
         Firmware <ph name="DEVICE_NAME">$1<ex>Logitech keyboard</ex></ph> has been updated to version <ph name="VERSION">$2<ex>2.0.12</ex></ph>
@@ -2627,29 +2630,28 @@
         While the firmware is updating, do not unplug this external device or shut down your computer. You can minimize this window. This update may take a few minutes and your external device may not work during this time.
       </message>
       <message name="IDS_FIRMWARE_INSTALLING_TEXT" desc="Label that displays what percentage of the update has been installed.">
-        Installing - <ph name="PERCENTAGE_VALUE">$1<ex>94</ex></ph>%
+        Updating (<ph name="PERCENTAGE_VALUE">$1<ex>94</ex></ph>% complete)
       </message>
       <message name="IDS_FIRMWARE_UP_TO_DATE_TEXT" desc="Label shown when no firmware updates are available.">
-        All peripherals are up to date
+        All firmware is up to date
       </message>
       <message name="IDS_FIRMWARE_VERSION_TEXT" desc="Label for the update's version.">
         Version <ph name="VERSION">$1<ex>3.0.2</ex></ph>
       </message>
-      <!-- TODO(michaelcheco): Update strings after UX review. -->
-      <message translateable="false" name="IDS_FIRMWARE_RESTARTING_TITLE_TEXT" desc="Label for showing that a device is being restarted.">
+      <message name="IDS_FIRMWARE_RESTARTING_TITLE_TEXT" desc="Label for showing that a device is being restarted.">
         Restarting <ph name="DEVICE_NAME">$1<ex>Logitech keyboard</ex></ph>
       </message>
-      <message translateable="false" name="IDS_FIRMWARE_RESTARTING_BODY_TEXT" desc="Label for communicating information about what actions a user can take during a device restart.">
-        Your device is restarting, you can minimize window but do not unplug your device. This may take a few minutes.
+      <message name="IDS_FIRMWARE_RESTARTING_BODY_TEXT" desc="Label for communicating information about what actions a user can take during a device restart.">
+        While restarting, do not unplug this external device or shut down your computer. You can minimize this window. This may take a few minutes and your external device may not work during this time.
       </message>
-      <message translateable="false" name="IDS_FIRMWARE_RESTARTING_FOOTER_TEXT" desc="Label shown when a device is being restarted.">
-        Restarting ...
+      <message name="IDS_FIRMWARE_RESTARTING_FOOTER_TEXT" desc="Label shown when a device is being restarted.">
+        Restarting...
       </message>
-      <message translateable="false" name="IDS_FIRMWARE_UPDATE_FAILED_TITLE_TEXT" desc="Label shown when an update fails.">
-        Failed to update <ph name="DEVICE_NAME">$1<ex>Logitech keyboard</ex></ph>
+      <message name="IDS_FIRMWARE_UPDATE_FAILED_TITLE_TEXT" desc="Label shown when an update fails.">
+        Can't update <ph name="DEVICE_NAME">$1<ex>Logitech keyboard</ex></ph>
       </message>
-      <message translateable="false" name="IDS_FIRMWARE_UPDATE_FAILED_BODY_TEXT" desc="Label for communicating information about why an update failed.">
-        Update failed
+      <message name="IDS_FIRMWARE_UPDATE_FAILED_BODY_TEXT" desc="Label for communicating information about why an update failed.">
+        Something went wrong. Try again.
       </message>
       <message name="IDS_CONFIRMATION_TITLE_TEXT" desc="Label for the confirmation dialog title.">
         Update firmware on <ph name="DEVICE_NAME">$1<ex>Logitech keyboard</ex></ph>
diff --git a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_DEVICE_UP_TO_DATE_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_DEVICE_UP_TO_DATE_TEXT.png.sha1
index 416a2c461..3b1b1dc 100644
--- a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_DEVICE_UP_TO_DATE_TEXT.png.sha1
+++ b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_DEVICE_UP_TO_DATE_TEXT.png.sha1
@@ -1 +1 @@
-eeb9a317e7c1a463aa7e50401202e7a1c57c626e
\ No newline at end of file
+3db61c5d1f8c66e4b58e760594467bd7fb0adbb0
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_INSTALLING_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_INSTALLING_TEXT.png.sha1
index 947663d..9b72817a 100644
--- a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_INSTALLING_TEXT.png.sha1
+++ b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_INSTALLING_TEXT.png.sha1
@@ -1 +1 @@
-547ccff2209eb9e2e7c7a0886563ab0b3d6d0712
\ No newline at end of file
+910e681614d7fa39b77032008a72090bf5f7b90f
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_OK_BUTTON_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_OK_BUTTON_TEXT.png.sha1
new file mode 100644
index 0000000..cec99b6
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_OK_BUTTON_TEXT.png.sha1
@@ -0,0 +1 @@
+267ede65d3fff8874d404ddb0ea621f0d9d65b31
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_RESTARTING_BODY_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_RESTARTING_BODY_TEXT.png.sha1
new file mode 100644
index 0000000..7cb09fc
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_RESTARTING_BODY_TEXT.png.sha1
@@ -0,0 +1 @@
+18d57dfc046a38e0004085ae743852d5a1d958a1
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_RESTARTING_FOOTER_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_RESTARTING_FOOTER_TEXT.png.sha1
new file mode 100644
index 0000000..7cb09fc
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_RESTARTING_FOOTER_TEXT.png.sha1
@@ -0,0 +1 @@
+18d57dfc046a38e0004085ae743852d5a1d958a1
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_RESTARTING_TITLE_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_RESTARTING_TITLE_TEXT.png.sha1
new file mode 100644
index 0000000..7cb09fc
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_RESTARTING_TITLE_TEXT.png.sha1
@@ -0,0 +1 @@
+18d57dfc046a38e0004085ae743852d5a1d958a1
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UPDATE_FAILED_BODY_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UPDATE_FAILED_BODY_TEXT.png.sha1
new file mode 100644
index 0000000..cec99b6
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UPDATE_FAILED_BODY_TEXT.png.sha1
@@ -0,0 +1 @@
+267ede65d3fff8874d404ddb0ea621f0d9d65b31
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UPDATE_FAILED_TITLE_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UPDATE_FAILED_TITLE_TEXT.png.sha1
new file mode 100644
index 0000000..cec99b6
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UPDATE_FAILED_TITLE_TEXT.png.sha1
@@ -0,0 +1 @@
+267ede65d3fff8874d404ddb0ea621f0d9d65b31
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UPDATING_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UPDATING_TEXT.png.sha1
index 947663d..9b72817a 100644
--- a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UPDATING_TEXT.png.sha1
+++ b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UPDATING_TEXT.png.sha1
@@ -1 +1 @@
-547ccff2209eb9e2e7c7a0886563ab0b3d6d0712
\ No newline at end of file
+910e681614d7fa39b77032008a72090bf5f7b90f
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UP_TO_DATE_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UP_TO_DATE_TEXT.png.sha1
index 1abc3aa..6d07865 100644
--- a/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UP_TO_DATE_TEXT.png.sha1
+++ b/chromeos/chromeos_strings_grd/IDS_FIRMWARE_UP_TO_DATE_TEXT.png.sha1
@@ -1 +1 @@
-9c92a6bebf3322c3f093d75188aada094ff64c8f
\ No newline at end of file
+21d284f26efbeb38eea8cf6c1374ce618fe77bf4
\ No newline at end of file
diff --git a/chromeos/crosapi/mojom/BUILD.gn b/chromeos/crosapi/mojom/BUILD.gn
index 095fe31f..d07345dc 100644
--- a/chromeos/crosapi/mojom/BUILD.gn
+++ b/chromeos/crosapi/mojom/BUILD.gn
@@ -41,6 +41,7 @@
     "kiosk_session_service.mojom",
     "launcher_search.mojom",
     "local_printer.mojom",
+    "login.mojom",
     "login_state.mojom",
     "message_center.mojom",
     "metrics_reporting.mojom",
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom
index 4a3740f3..a0e139a 100644
--- a/chromeos/crosapi/mojom/crosapi.mojom
+++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -34,6 +34,7 @@
 import "chromeos/crosapi/mojom/keystore_service.mojom";
 import "chromeos/crosapi/mojom/launcher_search.mojom";
 import "chromeos/crosapi/mojom/local_printer.mojom";
+import "chromeos/crosapi/mojom/login.mojom";
 import "chromeos/crosapi/mojom/login_state.mojom";
 import "chromeos/crosapi/mojom/policy_service.mojom";
 import "chromeos/crosapi/mojom/message_center.mojom";
@@ -94,8 +95,8 @@
 // please note the milestone when you added it, to help us reason about
 // compatibility between the client applications and older ash-chrome binaries.
 //
-// Next version: 63
-// Next method id: 67
+// Next version: 64
+// Next method id: 68
 [Stable, Uuid="8b79c34f-2bf8-4499-979a-b17cac522c1e",
  RenamedFrom="crosapi.mojom.AshChromeService"]
 interface Crosapi {
@@ -274,6 +275,10 @@
   // Added in M91.
   [MinVersion=25] BindLocalPrinter@30(pending_receiver<LocalPrinter> receiver);
 
+  // Binds the login service.
+  // Added in M99.
+  [MinVersion=63] BindLogin@67(pending_receiver<Login> receiver);
+
   // Binds the login state service.
   [MinVersion=57] BindLoginState@61(pending_receiver<LoginState> receiver);
 
diff --git a/chromeos/crosapi/mojom/login.mojom b/chromeos/crosapi/mojom/login.mojom
new file mode 100644
index 0000000..2f9eaf4f
--- /dev/null
+++ b/chromeos/crosapi/mojom/login.mojom
@@ -0,0 +1,65 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module crosapi.mojom;
+
+// This API allows Lacros to call the chrome.login extension API.
+[Stable, Uuid="639e9f04-981f-46d1-91da-583c2958265b"]
+interface Login {
+  // Launches a managed guest session if one is set up via the admin console.
+  // If there are several managed guest sessions set up, it will launch the
+  // first available one.
+  // If a password is provided, the Managed Guest Session will be lockable and
+  // can be unlocked by providing the same password to
+  // |UnlockManagedGuestSession()|.
+  LaunchManagedGuestSession@0(string? password) => (string? error);
+
+  // Exits the current session. If |data_for_next_login_attempt| is provided,
+  // stores data which can be read by |FetchDataForNextLoginAttempt()|.
+  ExitCurrentSession@1(string? data_for_next_login_attempt) => (string? error);
+
+  // Reads the |data_for_next_login_attempt| set by |ExitCurrentSession()|.
+  // Clears the previously stored data after reading so it can only be read
+  // once.
+  FetchDataForNextLoginAttempt@2() => (string data);
+
+  // Locks a managed guest session if it was launched with a password from
+  // |LaunchManagedGuestSession()|.
+  LockManagedGuestSession@3() => (string? error);
+
+  // Unlocks a managed guest session which was launched by
+  // |LaunchManagedGuestSession()| with a password. The session will unlock if
+  // |password| matches the one provided to |LaunchManagedGuestSession()|.
+  UnlockManagedGuestSession@4(string password) => (string? error);
+
+  // Starts a ChromeOS Managed Guest Session which will host the shared user
+  // sessions. An initial shared session is entered with |password| as the
+  // password. When this shared session is locked, it can only be unlocked by
+  // calling |UnlockSharedSession()| with the same password.
+  LaunchSharedManagedGuestSession@5(string password) => (string? error);
+
+  // Enters the shared session with the given password. If the session is
+  // locked, it can only be unlocked by calling |UnlockSharedSession()| with
+  // the same password.
+  // Fails if  there is already a shared session running. Can only be called
+  // from the lock screen.
+  EnterSharedSession@6(string password) => (string? error);
+
+  // Unlocks the shared session with the provided password. Fails if the
+  // password does not match the one provided to
+  // |LaunchSharedManagedGuestSession()| or |EnterSharedSession()|.
+  // Fails if  there is no existing shared session. Can only be called from the
+  // lock screen.
+  UnlockSharedSession@7(string password) => (string? error);
+
+  // Ends the shared session. Security- and privacy-sensitive data in the
+  // session will be cleaned up on a best effort basis.
+  // Can be called from both the lock screen or in session.
+  // Fails if there is no existing shared session.
+  EndSharedSession@8() => (string? error);
+
+  // Sets data for the next login attempt. The data can be retrieved by
+  // calling |FetchDataForNextLoginAttempt()|.
+  SetDataForNextLoginAttempt@9(string data_for_next_login_attempt) => ();
+};
diff --git a/chromeos/lacros/lacros_service.cc b/chromeos/lacros/lacros_service.cc
index 7e4fa9b5..f4b9092 100644
--- a/chromeos/lacros/lacros_service.cc
+++ b/chromeos/lacros/lacros_service.cc
@@ -43,6 +43,7 @@
 #include "chromeos/crosapi/mojom/kiosk_session_service.mojom.h"
 #include "chromeos/crosapi/mojom/launcher_search.mojom.h"
 #include "chromeos/crosapi/mojom/local_printer.mojom.h"
+#include "chromeos/crosapi/mojom/login.mojom.h"
 #include "chromeos/crosapi/mojom/login_state.mojom.h"
 #include "chromeos/crosapi/mojom/message_center.mojom.h"
 #include "chromeos/crosapi/mojom/metrics_reporting.mojom.h"
@@ -294,6 +295,8 @@
   ConstructRemote<crosapi::mojom::LocalPrinter,
                   &crosapi::mojom::Crosapi::BindLocalPrinter,
                   Crosapi::MethodMinVersions::kBindLocalPrinterMinVersion>();
+  ConstructRemote<crosapi::mojom::Login, &crosapi::mojom::Crosapi::BindLogin,
+                  Crosapi::MethodMinVersions::kBindLoginMinVersion>();
   ConstructRemote<crosapi::mojom::LoginState,
                   &crosapi::mojom::Crosapi::BindLoginState,
                   Crosapi::MethodMinVersions::kBindLoginStateMinVersion>();
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt
index e3c4b79..e9c4cfa 100644
--- a/chromeos/profiles/orderfile.newest.txt
+++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@
-chromeos-chrome-orderfile-field-99-4827.0-1643020945-benchmark-99.0.4844.11-r1.orderfile.xz
+chromeos-chrome-orderfile-field-99-4827.0-1643020945-benchmark-99.0.4844.13-r1.orderfile.xz
diff --git a/chromeos/services/tts/google_tts_stream.cc b/chromeos/services/tts/google_tts_stream.cc
index aa5413417..09f8d70 100644
--- a/chromeos/services/tts/google_tts_stream.cc
+++ b/chromeos/services/tts/google_tts_stream.cc
@@ -70,7 +70,8 @@
 }
 
 GoogleTtsStream::~GoogleTtsStream() {
-  libchrometts_.GoogleTtsShutdown();
+  if (!is_in_process_teardown_)
+    libchrometts_.GoogleTtsShutdown();
 }
 
 bool GoogleTtsStream::IsBound() const {
diff --git a/chromeos/services/tts/google_tts_stream.h b/chromeos/services/tts/google_tts_stream.h
index c6c88dba..5c87b72 100644
--- a/chromeos/services/tts/google_tts_stream.h
+++ b/chromeos/services/tts/google_tts_stream.h
@@ -26,6 +26,10 @@
 
   bool IsBound() const;
 
+  void set_is_in_process_teardown(bool value) {
+    is_in_process_teardown_ = value;
+  }
+
  private:
   // mojom::GoogleTtsStream:
   void InstallVoice(const std::string& voice_name,
@@ -58,6 +62,9 @@
   // Plays raw tts audio samples.
   TtsPlayer tts_player_;
 
+  // Whether the tts service process is tearing down.
+  bool is_in_process_teardown_ = false;
+
   base::WeakPtrFactory<GoogleTtsStream> weak_factory_{this};
 };
 
diff --git a/chromeos/services/tts/tts_service.cc b/chromeos/services/tts/tts_service.cc
index 5766b335..6dc2be6a 100644
--- a/chromeos/services/tts/tts_service.cc
+++ b/chromeos/services/tts/tts_service.cc
@@ -68,8 +68,11 @@
   if ((!google_tts_stream_ || !google_tts_stream_->IsBound()) &&
       (!playback_tts_stream_ || !playback_tts_stream_->IsBound())) {
     service_receiver_.reset();
-    if (!keep_process_alive_for_testing_)
+    if (!keep_process_alive_for_testing_) {
+      if (google_tts_stream_)
+        google_tts_stream_->set_is_in_process_teardown(true);
       exit(0);
+    }
   }
 }
 
diff --git a/components/BUILD.gn b/components/BUILD.gn
index 8fbb593..a22845f5 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -400,7 +400,6 @@
       deps += [
         "//components/crash/content/browser:unit_tests",
         "//components/crash/core/app:unit_tests",
-        "//components/data_reduction_proxy/core/browser:unit_tests",
       ]
     }
 
diff --git a/components/autofill/core/browser/autofill_client.cc b/components/autofill/core/browser/autofill_client.cc
index 1481edf..9dadbb7d 100644
--- a/components/autofill/core/browser/autofill_client.cc
+++ b/components/autofill/core/browser/autofill_client.cc
@@ -8,6 +8,7 @@
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autofill_ablation_study.h"
 #include "components/autofill/core/browser/payments/credit_card_access_manager.h"
+#include "components/autofill/core/browser/payments/virtual_card_enrollment_manager.h"
 #include "components/autofill/core/browser/single_field_form_fill_router.h"
 #include "components/autofill/core/browser/ui/suggestion.h"
 #include "components/version_info/channel.h"
@@ -82,6 +83,14 @@
   return nullptr;
 }
 
+void AutofillClient::ShowVirtualCardEnrollDialog(
+    const raw_ptr<VirtualCardEnrollmentFields> virtual_card_enrollment_fields,
+    base::OnceClosure accept_virtual_card_callback,
+    base::OnceClosure decline_virtual_card_callback) {
+  // This is overridden by platform subclasses. Currently only
+  // ChromeAutofillClient (Chrome Desktop and Clank) implements this.
+}
+
 #if !BUILDFLAG(IS_IOS)
 std::unique_ptr<webauthn::InternalAuthenticator>
 AutofillClient::CreateCreditCardInternalAuthenticator(
diff --git a/components/autofill/core/browser/autofill_client.h b/components/autofill/core/browser/autofill_client.h
index b2896b8..a6fd229c 100644
--- a/components/autofill/core/browser/autofill_client.h
+++ b/components/autofill/core/browser/autofill_client.h
@@ -78,6 +78,7 @@
 class SingleFieldFormFillRouter;
 class StrikeDatabase;
 struct Suggestion;
+struct VirtualCardEnrollmentFields;
 class VirtualCardEnrollmentManager;
 enum class WebauthnDialogCallbackType;
 enum class WebauthnDialogState;
@@ -419,6 +420,12 @@
   virtual raw_ptr<VirtualCardEnrollmentManager>
   GetVirtualCardEnrollmentManager();
 
+  // Shows a dialog for the user to enroll in a virtual card.
+  virtual void ShowVirtualCardEnrollDialog(
+      const raw_ptr<VirtualCardEnrollmentFields> virtual_card_enrollment_fields,
+      base::OnceClosure accept_virtual_card_callback,
+      base::OnceClosure decline_virtual_card_callback);
+
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
   // Returns the list of allowed merchants and BIN ranges for virtual cards.
   virtual std::vector<std::string> GetAllowedMerchantsForVirtualCards() = 0;
diff --git a/components/autofill/core/browser/form_data_importer.h b/components/autofill/core/browser/form_data_importer.h
index a5eae552..eeb80950 100644
--- a/components/autofill/core/browser/form_data_importer.h
+++ b/components/autofill/core/browser/form_data_importer.h
@@ -56,7 +56,7 @@
   FormDataImporter(const FormDataImporter&) = delete;
   FormDataImporter& operator=(const FormDataImporter&) = delete;
 
-  ~FormDataImporter();
+  virtual ~FormDataImporter();
 
   // Imports the form data, submitted by the user, into
   // |personal_data_manager_|. If a new credit card was detected and
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager.cc b/components/autofill/core/browser/payments/credit_card_save_manager.cc
index 478437f..3b6a1b7f 100644
--- a/components/autofill/core/browser/payments/credit_card_save_manager.cc
+++ b/components/autofill/core/browser/payments/credit_card_save_manager.cc
@@ -35,6 +35,7 @@
 #include "components/autofill/core/browser/metrics/autofill_metrics.h"
 #include "components/autofill/core/browser/payments/payments_client.h"
 #include "components/autofill/core/browser/payments/payments_util.h"
+#include "components/autofill/core/browser/payments/virtual_card_enrollment_manager.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/strike_database.h"
 #include "components/autofill/core/browser/validation.h"
@@ -335,6 +336,29 @@
     // |personal_data_manager_|. PDM uses this information to update the avatar
     // button UI.
     personal_data_manager_->OnCreditCardSaved(/*is_local_card=*/false);
+
+    if (base::FeatureList::IsEnabled(
+            features::kAutofillEnableUpdateVirtualCardEnrollment)) {
+      // After a card is successfully saved to the server, we can now offer
+      // the user to enroll it as a virtual card. |upload_card_response_details|
+      // has fields in the response that will be required for server requests in
+      // the virtual card enrollment flow, so we set them here and start the
+      // flow.
+      if (upload_card_response_details.virtual_card_enrollment_state ==
+          CreditCard::VirtualCardEnrollmentState::UNENROLLED_AND_ELIGIBLE) {
+        DCHECK(!upload_card_response_details.card_art_url.is_empty());
+        DCHECK(upload_card_response_details.instrument_id.has_value());
+        raw_ptr<CreditCard> uploaded_card = &upload_request_.card;
+        uploaded_card->set_card_art_url(
+            upload_card_response_details.card_art_url);
+        uploaded_card->set_virtual_card_enrollment_state(
+            upload_card_response_details.virtual_card_enrollment_state);
+        uploaded_card->set_instrument_id(
+            upload_card_response_details.instrument_id.value());
+        client_->GetVirtualCardEnrollmentManager()->OfferVirtualCardEnroll(
+            uploaded_card, VirtualCardEnrollmentSource::kUpstream);
+      }
+    }
   } else if (show_save_prompt_.has_value() && show_save_prompt_.value()) {
     // If the upload failed and the bubble was actually shown (NOT just the
     // icon), count that as a strike against offering upload in the future.
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
index 06c4436..eb12f8e 100644
--- a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
@@ -346,6 +346,7 @@
   scoped_refptr<AutofillWebDataService> database_;
   MockPersonalDataManager personal_data_;
   syncer::TestSyncService sync_service_;
+  // TODO(crbug.com/1291003): Refactor to use the real CreditCardSaveManager.
   // Ends up getting owned (and destroyed) by TestFormDataImporter:
   raw_ptr<TestCreditCardSaveManager> credit_card_save_manager_;
   // Ends up getting owned (and destroyed) by TestAutofillClient:
@@ -5191,4 +5192,57 @@
       AutofillMetrics::UPLOAD_NOT_OFFERED_INVALID_LEGAL_MESSAGE);
 }
 
+// Tests that the fields in the card are set correctly and virtual card
+// enrollment is offered when a card becomes eligible after upload.
+TEST_F(CreditCardSaveManagerTest, OnDidUploadCard_VirtualCardEnrollment) {
+  for (CreditCard::VirtualCardEnrollmentState enrollment_state :
+       {CreditCard::VirtualCardEnrollmentState::UNENROLLED,
+        CreditCard::VirtualCardEnrollmentState::UNENROLLED_AND_ELIGIBLE,
+        CreditCard::VirtualCardEnrollmentState::ENROLLED}) {
+    for (bool is_update_virtual_card_enrollment_enabled : {true, false}) {
+      base::test::ScopedFeatureList feature_list;
+      if (is_update_virtual_card_enrollment_enabled) {
+        feature_list.InitAndEnableFeature(
+            features::kAutofillEnableUpdateVirtualCardEnrollment);
+      } else {
+        feature_list.InitAndDisableFeature(
+            features::kAutofillEnableUpdateVirtualCardEnrollment);
+      }
+      payments::PaymentsClient::UploadCardResponseDetails
+          upload_card_response_details;
+      upload_card_response_details.card_art_url =
+          GURL("https://www.example.com/");
+      upload_card_response_details.instrument_id = 3;
+      upload_card_response_details.virtual_card_enrollment_state =
+          enrollment_state;
+
+      credit_card_save_manager_->set_upload_request_card(test::GetCreditCard());
+      credit_card_save_manager_->OnDidUploadCard(
+          AutofillClient::PaymentsRpcResult::kSuccess,
+          upload_card_response_details);
+
+      CreditCard uploaded_card =
+          credit_card_save_manager_->upload_request()->card;
+
+      // The condition inside of this if-statement is true if virtual card
+      // enrollment should be offered.
+      if (is_update_virtual_card_enrollment_enabled &&
+          enrollment_state ==
+              CreditCard::VirtualCardEnrollmentState::UNENROLLED_AND_ELIGIBLE) {
+        EXPECT_EQ(uploaded_card.card_art_url(),
+                  upload_card_response_details.card_art_url);
+        EXPECT_EQ(uploaded_card.instrument_id(),
+                  upload_card_response_details.instrument_id);
+        EXPECT_EQ(uploaded_card.virtual_card_enrollment_state(),
+                  upload_card_response_details.virtual_card_enrollment_state);
+      } else {
+        EXPECT_TRUE(uploaded_card.card_art_url().is_empty());
+        EXPECT_EQ(uploaded_card.instrument_id(), 0);
+        EXPECT_EQ(uploaded_card.virtual_card_enrollment_state(),
+                  CreditCard::VirtualCardEnrollmentState::UNSPECIFIED);
+      }
+    }
+  }
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/payments/payments_client.cc b/components/autofill/core/browser/payments/payments_client.cc
index 9d546a1..d77b83e 100644
--- a/components/autofill/core/browser/payments/payments_client.cc
+++ b/components/autofill/core/browser/payments/payments_client.cc
@@ -700,9 +700,10 @@
 
     const absl::optional<int> instrument_id =
         response.FindIntKey("instrument_id");
-    upload_card_response_details_.instrument_id =
-        instrument_id.has_value() ? static_cast<int64_t>(instrument_id.value())
-                                  : 0;
+    if (instrument_id.has_value()) {
+      upload_card_response_details_.instrument_id =
+          static_cast<int64_t>(instrument_id.value());
+    }
 
     const auto* virtual_card_metadata = response.FindKeyOfType(
         "virtual_card_metadata", base::Value::Type::DICTIONARY);
diff --git a/components/autofill/core/browser/payments/payments_client.h b/components/autofill/core/browser/payments/payments_client.h
index 5f74501..3070434 100644
--- a/components/autofill/core/browser/payments/payments_client.h
+++ b/components/autofill/core/browser/payments/payments_client.h
@@ -287,8 +287,9 @@
     // |instrument_id| is used by the server as an identifier for the card that
     // was uploaded. Currently, we have it in the UploadCardResponseDetails so
     // that we can send it in the GetDetailsForEnrollRequest in the virtual card
-    // enrollment flow.
-    int64_t instrument_id = 0;
+    // enrollment flow. Should never be empty, if using this field use DCHECKs
+    // to ensure it is populated.
+    absl::optional<int64_t> instrument_id;
     // |virtual_card_enrollment_state| is used to determine whether we want to
     // pursue further action with the credit card that was uploaded regarding
     // virtual card enrollment. For example, if the state is
@@ -302,7 +303,8 @@
     // art. Since chrome sync does not instantly sync the card art with the url,
     // the actual card art image might not always be present. Flows that use
     // |card_art_url| need to make sure they handle the case where the image has
-    // not been synced yet.
+    // not been synced yet. For virtual card eligible cards this should not be
+    // empty. If using this field use DCHECKs to ensure it is populated.
     GURL card_art_url;
   };
 
diff --git a/components/autofill/core/browser/payments/payments_client_unittest.cc b/components/autofill/core/browser/payments/payments_client_unittest.cc
index 8f8b622..c61e1b57 100644
--- a/components/autofill/core/browser/payments/payments_client_unittest.cc
+++ b/components/autofill/core/browser/payments/payments_client_unittest.cc
@@ -1159,7 +1159,7 @@
   ReturnResponse(net::HTTP_OK, "{}");
   EXPECT_EQ(AutofillClient::PaymentsRpcResult::kSuccess, result_);
   EXPECT_TRUE(upload_card_response_details_.server_id.empty());
-  EXPECT_TRUE(upload_card_response_details_.instrument_id == 0);
+  EXPECT_FALSE(upload_card_response_details_.instrument_id.has_value());
   EXPECT_TRUE(upload_card_response_details_.virtual_card_enrollment_state ==
               CreditCard::VirtualCardEnrollmentState::UNSPECIFIED);
   EXPECT_TRUE(upload_card_response_details_.card_art_url.is_empty());
diff --git a/components/autofill/core/browser/payments/test_credit_card_save_manager.cc b/components/autofill/core/browser/payments/test_credit_card_save_manager.cc
index 703cc37..7d97e7b 100644
--- a/components/autofill/core/browser/payments/test_credit_card_save_manager.cc
+++ b/components/autofill/core/browser/payments/test_credit_card_save_manager.cc
@@ -42,6 +42,16 @@
   upload_request_.card.SetNumber(credit_card_number);
 }
 
+void TestCreditCardSaveManager::set_upload_request_card(
+    const CreditCard& card) {
+  upload_request_.card = std::move(card);
+}
+
+raw_ptr<payments::PaymentsClient::UploadRequestDetails>
+TestCreditCardSaveManager::upload_request() {
+  return &upload_request_;
+}
+
 void TestCreditCardSaveManager::OnDidUploadCard(
     AutofillClient::PaymentsRpcResult result,
     const payments::PaymentsClient::UploadCardResponseDetails&
diff --git a/components/autofill/core/browser/payments/test_credit_card_save_manager.h b/components/autofill/core/browser/payments/test_credit_card_save_manager.h
index ef4b361..4d54f6c 100644
--- a/components/autofill/core/browser/payments/test_credit_card_save_manager.h
+++ b/components/autofill/core/browser/payments/test_credit_card_save_manager.h
@@ -44,6 +44,10 @@
 
   void set_upload_request_card_number(const std::u16string& credit_card_number);
 
+  void set_upload_request_card(const CreditCard& card);
+
+  raw_ptr<payments::PaymentsClient::UploadRequestDetails> upload_request();
+
  private:
   void OnDidUploadCard(
       AutofillClient::PaymentsRpcResult result,
@@ -54,6 +58,8 @@
   bool credit_card_was_uploaded_ = false;
 
   FRIEND_TEST_ALL_PREFIXES(CreditCardSaveManagerTest,
+                           OnDidUploadCard_VirtualCardEnrollment);
+  FRIEND_TEST_ALL_PREFIXES(CreditCardSaveManagerTest,
                            UploadCreditCard_NumStrikesLoggedOnUploadNotSuccess);
 };
 
diff --git a/components/autofill/core/browser/payments/virtual_card_enrollment_manager.cc b/components/autofill/core/browser/payments/virtual_card_enrollment_manager.cc
index 6f36ea7..b51c01b1 100644
--- a/components/autofill/core/browser/payments/virtual_card_enrollment_manager.cc
+++ b/components/autofill/core/browser/payments/virtual_card_enrollment_manager.cc
@@ -119,17 +119,13 @@
     return;
   }
 
-  // The controller will only expect one |legal_message_lines| vector, so we
-  // need to combine all of the legal message lines we receive from the server.
-  std::vector<LegalMessageLine> legal_message_lines;
-  legal_message_lines.reserve(response.google_legal_message.size() +
-                              response.issuer_legal_message.size());
-  base::ranges::copy(response.google_legal_message,
-                     std::back_inserter(legal_message_lines));
-  base::ranges::copy(response.issuer_legal_message,
-                     std::back_inserter(legal_message_lines));
-  state_.virtual_card_enrollment_fields.legal_message_lines =
-      std::move(legal_message_lines);
+  state_.virtual_card_enrollment_fields.google_legal_message =
+      std::move(response.google_legal_message);
+  // Issuer legal message is empty for some issuers.
+  if (!response.issuer_legal_message.empty()) {
+    state_.virtual_card_enrollment_fields.issuer_legal_message =
+        std::move(response.issuer_legal_message);
+  }
 
   // The |vcn_context_token| will be used by the server to link the previous
   // GetDetailsForEnrollRequest to the future UpdateVirtualCardEnrollmentRequest
@@ -153,8 +149,14 @@
 }
 
 void VirtualCardEnrollmentManager::ShowVirtualCardEnrollmentBubble() {
-  // TODO(crbug.com/1281695): Link backend components to
-  //  VirtualCardEnrollmentBubble here.
+  autofill_client_->ShowVirtualCardEnrollDialog(
+      &(state_.virtual_card_enrollment_fields),
+      base::BindOnce(
+          &VirtualCardEnrollmentManager::OnVirtualCardEnrollmentBubbleAccepted,
+          weak_ptr_factory_.GetWeakPtr()),
+      base::BindOnce(
+          &VirtualCardEnrollmentManager::OnVirtualCardEnrollmentBubbleCancelled,
+          weak_ptr_factory_.GetWeakPtr()));
 }
 
 void VirtualCardEnrollmentManager::OnVirtualCardEnrollmentBubbleAccepted() {
diff --git a/components/autofill/core/browser/payments/virtual_card_enrollment_manager.h b/components/autofill/core/browser/payments/virtual_card_enrollment_manager.h
index 61bf085..f206d43 100644
--- a/components/autofill/core/browser/payments/virtual_card_enrollment_manager.h
+++ b/components/autofill/core/browser/payments/virtual_card_enrollment_manager.h
@@ -37,9 +37,12 @@
   // Raw pointer to the image for the card art. The |card_art_image| object is
   // owned by PersonalDataManager.
   raw_ptr<gfx::Image> card_art_image = nullptr;
-  // The legal message lines for the footer of the
-  // VirtualCardEnrollmentBubble.
-  LegalMessageLines legal_message_lines;
+  // The Google-specific legal messages that the user must accept before
+  // opting-in to virtual card enrollment.
+  LegalMessageLines google_legal_message;
+  // The Issuer-specific legal messages that the user must accept before
+  // opting-in to virtual card enrollment. Empty for some issuers.
+  LegalMessageLines issuer_legal_message;
   // The source for which the VirtualCardEnrollmentBubble will be shown.
   VirtualCardEnrollmentSource virtual_card_enrollment_source =
       VirtualCardEnrollmentSource::kNone;
diff --git a/components/autofill/core/browser/payments/virtual_card_enrollment_manager_unittest.cc b/components/autofill/core/browser/payments/virtual_card_enrollment_manager_unittest.cc
index 840698c..1f46b80 100644
--- a/components/autofill/core/browser/payments/virtual_card_enrollment_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/virtual_card_enrollment_manager_unittest.cc
@@ -160,10 +160,10 @@
 
   payments::PaymentsClient::GetDetailsForEnrollmentResponseDetails response;
   response.vcn_context_token = kTestVcnContextToken;
-  response.issuer_legal_message = {
-      TestLegalMessageLine("issuer_test_legal_message_line")};
   response.google_legal_message = {
-      TestLegalMessageLine("google_test_legal_message_line")};
+      TestLegalMessageLine("google_test_legal_message")};
+  response.issuer_legal_message = {
+      TestLegalMessageLine("issuer_test_legal_message")};
   virtual_card_enrollment_manager_->OnDidGetDetailsForEnrollResponse(
       AutofillClient::PaymentsRpcResult::kSuccess, response);
 
@@ -171,9 +171,9 @@
   EXPECT_EQ(state->vcn_context_token, response.vcn_context_token);
   VirtualCardEnrollmentFields virtual_card_enrollment_fields =
       state->virtual_card_enrollment_fields;
-  EXPECT_EQ(virtual_card_enrollment_fields.legal_message_lines[0].text(),
+  EXPECT_EQ(virtual_card_enrollment_fields.google_legal_message[0].text(),
             response.google_legal_message[0].text());
-  EXPECT_EQ(virtual_card_enrollment_fields.legal_message_lines[1].text(),
+  EXPECT_EQ(virtual_card_enrollment_fields.issuer_legal_message[0].text(),
             response.issuer_legal_message[0].text());
   EXPECT_TRUE(virtual_card_enrollment_fields.card_art_image != nullptr);
 }
diff --git a/components/autofill/core/browser/test_autofill_client.cc b/components/autofill/core/browser/test_autofill_client.cc
index 5841391..cb9fcf6 100644
--- a/components/autofill/core/browser/test_autofill_client.cc
+++ b/components/autofill/core/browser/test_autofill_client.cc
@@ -119,6 +119,11 @@
 
 void TestAutofillClient::OnUnmaskVerificationResult(PaymentsRpcResult result) {}
 
+raw_ptr<VirtualCardEnrollmentManager>
+TestAutofillClient::GetVirtualCardEnrollmentManager() {
+  return form_data_importer_->GetVirtualCardEnrollmentManager();
+}
+
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
 std::vector<std::string>
 TestAutofillClient::GetAllowedMerchantsForVirtualCards() {
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h
index ac4eb3cd..aff29bc 100644
--- a/components/autofill/core/browser/test_autofill_client.h
+++ b/components/autofill/core/browser/test_autofill_client.h
@@ -76,7 +76,8 @@
                         UnmaskCardReason reason,
                         base::WeakPtr<CardUnmaskDelegate> delegate) override;
   void OnUnmaskVerificationResult(PaymentsRpcResult result) override;
-
+  raw_ptr<VirtualCardEnrollmentManager> GetVirtualCardEnrollmentManager()
+      override;
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
   std::vector<std::string> GetAllowedMerchantsForVirtualCards() override;
   std::vector<std::string> GetAllowedBinRangesForVirtualCards() override;
@@ -282,7 +283,7 @@
   std::unique_ptr<PrefService> prefs_;
   std::unique_ptr<TestStrikeDatabase> test_strike_database_;
   std::unique_ptr<payments::PaymentsClient> payments_client_;
-  std::unique_ptr<FormDataImporter> form_data_importer_;
+  std::unique_ptr<TestFormDataImporter> form_data_importer_;
   GURL form_origin_;
   ukm::SourceId source_id_ = -1;
 
diff --git a/components/autofill/core/browser/test_form_data_importer.h b/components/autofill/core/browser/test_form_data_importer.h
index 0125a8c..775deefc9 100644
--- a/components/autofill/core/browser/test_form_data_importer.h
+++ b/components/autofill/core/browser/test_form_data_importer.h
@@ -22,6 +22,7 @@
       const std::string& app_locale,
       std::unique_ptr<LocalCardMigrationManager> local_card_migration_manager =
           nullptr);
+  ~TestFormDataImporter() override = default;
 };
 
 }  // namespace autofill
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index c02f810..2c442c5 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "5.7",
-  "log_list_timestamp": "2022-01-31T01:34:29Z",
+  "version": "5.8",
+  "log_list_timestamp": "2022-02-01T01:37:38Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/commerce/OWNERS b/components/commerce/OWNERS
index a991d86..3104d54 100644
--- a/components/commerce/OWNERS
+++ b/components/commerce/OWNERS
@@ -1,3 +1,4 @@
 ayman@chromium.org
 davidjm@chromium.org
+mdjones@chromium.org
 wychen@chromium.org
diff --git a/components/commerce/core/BUILD.gn b/components/commerce/core/BUILD.gn
index f8900661..755cba0 100644
--- a/components/commerce/core/BUILD.gn
+++ b/components/commerce/core/BUILD.gn
@@ -8,6 +8,19 @@
   import("//build/config/android/rules.gni")
 }
 
+source_set("feature_list") {
+  sources = [
+    "commerce_feature_list.cc",
+    "commerce_feature_list.h",
+  ]
+
+  deps = [
+    "//base",
+    "//third_party/re2:re2",
+    "//url:url",
+  ]
+}
+
 static_library("metrics") {
   sources = [
     "metrics/metrics_utils.cc",
diff --git a/components/commerce/core/DEPS b/components/commerce/core/DEPS
index f0be4f7..e362c20 100644
--- a/components/commerce/core/DEPS
+++ b/components/commerce/core/DEPS
@@ -1,5 +1,5 @@
 include_rules = [
   "+components/optimization_guide",
   "+components/prefs",
+  "+third_party/re2",
 ]
-
diff --git a/chrome/browser/commerce/commerce_feature_list.cc b/components/commerce/core/commerce_feature_list.cc
similarity index 96%
rename from chrome/browser/commerce/commerce_feature_list.cc
rename to components/commerce/core/commerce_feature_list.cc
index 1513c1d..f87d7c9 100644
--- a/chrome/browser/commerce/commerce_feature_list.cc
+++ b/components/commerce/core/commerce_feature_list.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/commerce/commerce_feature_list.h"
+#include "components/commerce/core/commerce_feature_list.h"
 
 #include "base/feature_list.h"
 #include "base/metrics/field_trial_params.h"
diff --git a/chrome/browser/commerce/commerce_feature_list.h b/components/commerce/core/commerce_feature_list.h
similarity index 87%
rename from chrome/browser/commerce/commerce_feature_list.h
rename to components/commerce/core/commerce_feature_list.h
index de416062..70076061 100644
--- a/chrome/browser/commerce/commerce_feature_list.h
+++ b/components/commerce/core/commerce_feature_list.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_COMMERCE_COMMERCE_FEATURE_LIST_H_
-#define CHROME_BROWSER_COMMERCE_COMMERCE_FEATURE_LIST_H_
+#ifndef COMPONENTS_COMMERCE_CORE_COMMERCE_FEATURE_LIST_H_
+#define COMPONENTS_COMMERCE_CORE_COMMERCE_FEATURE_LIST_H_
 
 #include "base/feature_list.h"
 #include "base/metrics/field_trial_params.h"
@@ -30,4 +30,4 @@
 bool IsCouponWithCodeEnabled();
 }  // namespace commerce
 
-#endif  // CHROME_BROWSER_COMMERCE_COMMERCE_FEATURE_LIST_H_
+#endif  // COMPONENTS_COMMERCE_CORE_COMMERCE_FEATURE_LIST_H_
diff --git a/components/data_reduction_proxy/core/browser/BUILD.gn b/components/data_reduction_proxy/core/browser/BUILD.gn
index 1d7225f..8b2208f6 100644
--- a/components/data_reduction_proxy/core/browser/BUILD.gn
+++ b/components/data_reduction_proxy/core/browser/BUILD.gn
@@ -8,10 +8,6 @@
 
 browser_sources = [
   "data_reduction_proxy_metrics.h",
-  "data_reduction_proxy_prefs.cc",
-  "data_reduction_proxy_prefs.h",
-  "data_reduction_proxy_service.cc",
-  "data_reduction_proxy_service.h",
   "data_reduction_proxy_settings.cc",
   "data_reduction_proxy_settings.h",
 ]
@@ -54,44 +50,3 @@
     defines += [ "USE_GOOGLE_API_KEYS_FOR_AUTH_KEY" ]
   }
 }
-
-static_library("test_support") {
-  testonly = true
-  sources = [
-    "data_reduction_proxy_settings_test_utils.cc",
-    "data_reduction_proxy_settings_test_utils.h",
-    "data_reduction_proxy_test_utils.cc",
-    "data_reduction_proxy_test_utils.h",
-  ]
-
-  public_deps = [ ":browser" ]
-  deps = [
-    "//base",
-    "//components/data_reduction_proxy/core/common",
-    "//components/prefs:test_support",
-    "//net",
-    "//net:test_support",
-    "//services/network:test_support",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-}
-
-source_set("unit_tests") {
-  testonly = true
-  sources = [ "data_reduction_proxy_settings_unittest.cc" ]
-
-  deps = [
-    ":browser",
-    ":test_support",
-    "//base",
-    "//base/test:test_support",
-    "//build:chromeos_buildflags",
-    "//components/prefs:test_support",
-    "//components/variations:test_support",
-    "//net:test_support",
-    "//services/network:test_support",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-}
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.cc
deleted file mode 100644
index c319332..0000000
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h"
-
-#include <memory>
-
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
-#include "components/pref_registry/pref_registry_syncable.h"
-#include "components/prefs/pref_registry_simple.h"
-#include "components/prefs/pref_service.h"
-#include "components/prefs/scoped_user_pref_update.h"
-
-namespace data_reduction_proxy {
-
-// Make sure any changes here that have the potential to impact android_webview
-// are reflected in RegisterSimpleProfilePrefs.
-void RegisterSyncableProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
-  registry->RegisterBooleanPref(prefs::kDataSaverEnabled, false);
-  registry->RegisterBooleanPref(prefs::kDataReductionProxyWasEnabledBefore,
-                                false);
-
-  registry->RegisterInt64Pref(prefs::kDataReductionProxyLastEnabledTime, 0L);
-}
-
-void RegisterSimpleProfilePrefs(PrefRegistrySimple* registry) {
-  registry->RegisterBooleanPref(
-      prefs::kDataReductionProxyWasEnabledBefore, false);
-
-  RegisterPrefs(registry);
-}
-
-// Add any new data reduction proxy prefs to the |pref_map_| or the
-// |list_pref_map_| in Init() of DataReductionProxyCompressionStats.
-void RegisterPrefs(PrefRegistrySimple* registry) {
-  registry->RegisterInt64Pref(prefs::kDataReductionProxyLastEnabledTime, 0L);
-}
-
-}  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h
deleted file mode 100644
index 0801cb3..0000000
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_PREFS_H_
-#define COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_PREFS_H_
-
-namespace user_prefs {
-class PrefRegistrySyncable;
-}
-
-class PrefRegistrySimple;
-
-namespace data_reduction_proxy {
-
-// Registers the data reduction proxy's profile prefs on platforms that use
-// syncable prefs.
-void RegisterSyncableProfilePrefs(
-    user_prefs::PrefRegistrySyncable* registry);
-
-// Registers the data reduction proxy's profile prefs on platforms that do not
-// use syncable prefs.
-void RegisterSimpleProfilePrefs(PrefRegistrySimple* registry);
-
-// Registers local state, i.e., profile-agnostic prefs for the data
-// reduction proxy.
-void RegisterPrefs(PrefRegistrySimple* registry);
-
-}  // namespace data_reduction_proxy
-
-#endif  // COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_PREFS_H_
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc
deleted file mode 100644
index 9ddd68a..0000000
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/files/file_path.h"
-#include "base/json/json_reader.h"
-#include "base/location.h"
-#include "base/metrics/field_trial_params.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/task/sequenced_task_runner.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/task/task_runner_util.h"
-#include "base/time/default_clock.h"
-#include "base/time/time.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
-#include "components/prefs/pref_service.h"
-
-namespace data_reduction_proxy {
-
-DataReductionProxyService::DataReductionProxyService(
-    DataReductionProxySettings* settings,
-    PrefService* prefs)
-    : settings_(settings), prefs_(prefs) {
-  DCHECK(settings);
-}
-
-DataReductionProxyService::~DataReductionProxyService() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-}
-
-void DataReductionProxyService::Shutdown() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  weak_factory_.InvalidateWeakPtrs();
-}
-
-void DataReductionProxyService::SetUnreachable(bool unreachable) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  settings_->SetUnreachable(unreachable);
-}
-
-void DataReductionProxyService::SetInt64Pref(const std::string& pref_path,
-                                             int64_t value) {
-  if (prefs_)
-    prefs_->SetInt64(pref_path, value);
-}
-
-void DataReductionProxyService::SetStringPref(const std::string& pref_path,
-                                              const std::string& value) {
-  if (prefs_)
-    prefs_->SetString(pref_path, value);
-}
-
-base::WeakPtr<DataReductionProxyService>
-DataReductionProxyService::GetWeakPtr() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return weak_factory_.GetWeakPtr();
-}
-
-double DataReductionProxyService::GetSaveDataSavingsPercentEstimate(
-    const std::string& origin) const {
-  return 0;
-}
-
-}  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h
deleted file mode 100644
index 0d7f5c0..0000000
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_SERVICE_H_
-#define COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_SERVICE_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-
-#include "base/callback.h"
-#include "base/files/file_path.h"
-#include "base/gtest_prod_util.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/sequence_checker.h"
-#include "base/values.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h"
-#include "net/nqe/effective_connection_type.h"
-
-class PrefService;
-
-namespace data_reduction_proxy {
-
-class DataReductionProxySettings;
-
-// Contains and initializes all Data Reduction Proxy objects that have a
-// lifetime based on the UI thread.
-class DataReductionProxyService {
- public:
-  // The caller must ensure that |settings|, |prefs|, |request_context|, and
-  // |io_task_runner| remain alive for the lifetime of the
-  // |DataReductionProxyService| instance. |prefs| may be null. This instance
-  // will take ownership of |compression_stats|.
-  // TODO(jeremyim): DataReductionProxyService should own
-  // DataReductionProxySettings and not vice versa.
-  DataReductionProxyService(DataReductionProxySettings* settings,
-                            PrefService* prefs);
-
-  DataReductionProxyService(const DataReductionProxyService&) = delete;
-  DataReductionProxyService& operator=(const DataReductionProxyService&) =
-      delete;
-
-  virtual ~DataReductionProxyService();
-
-  void Shutdown();
-
-  // Records whether the Data Reduction Proxy is unreachable or not.
-  void SetUnreachable(bool unreachable);
-
-  // Stores an int64_t value in |prefs_|.
-  void SetInt64Pref(const std::string& pref_path, int64_t value);
-
-  // Stores a string value in |prefs_|.
-  void SetStringPref(const std::string& pref_path, const std::string& value);
-
-  void SetSettingsForTesting(DataReductionProxySettings* settings) {
-    settings_ = settings;
-  }
-
-  // Returns the percentage of data savings estimate provided by save-data for
-  // an origin.
-  double GetSaveDataSavingsPercentEstimate(const std::string& origin) const;
-
-  base::WeakPtr<DataReductionProxyService> GetWeakPtr();
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxyConfigServiceClientTest,
-                           MultipleAuthFailures);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxyConfigServiceClientTest,
-                           ValidatePersistedClientConfig);
-
-  raw_ptr<DataReductionProxySettings> settings_;
-
-  // A prefs service for storing data.
-  raw_ptr<PrefService> prefs_;
-
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  base::WeakPtrFactory<DataReductionProxyService> weak_factory_{this};
-};
-
-}  // namespace data_reduction_proxy
-
-#endif  // COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_SERVICE_H_
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc
index 2c337bf..099bd76 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc
@@ -13,13 +13,7 @@
 #include "base/time/clock.h"
 #include "base/time/default_clock.h"
 #include "build/build_config.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
-#include "components/prefs/pref_member.h"
-#include "components/prefs/pref_service.h"
-#include "net/base/network_change_notifier.h"
-#include "net/http/http_request_headers.h"
 
 namespace {
 
@@ -30,202 +24,28 @@
       data_reduction_proxy::switches::kEnableDataReductionProxy);
 }
 
-// Key of the UMA DataReductionProxy.StartupState histogram.
-const char kUMAProxyStartupStateHistogram[] = "DataReductionProxy.StartupState";
-
-void RecordSettingsEnabledState(
-    data_reduction_proxy::DataReductionSettingsEnabledAction action) {
-  UMA_HISTOGRAM_ENUMERATION(
-      "DataReductionProxy.EnabledState", action,
-      data_reduction_proxy::DATA_REDUCTION_SETTINGS_ACTION_BOUNDARY);
-}
-
-// Record the number of days since data reduction proxy was enabled by the
-// user.
-void RecordDaysSinceEnabledMetric(int days_since_enabled) {
-  UMA_HISTOGRAM_CUSTOM_COUNTS("DataReductionProxy.DaysSinceEnabled",
-                              days_since_enabled, 0, 365 * 10, 100);
-}
-
 }  // namespace
 
 namespace data_reduction_proxy {
 
 DataReductionProxySettings::DataReductionProxySettings(
     bool is_off_the_record_profile)
-    : unreachable_(false),
-      prefs_(nullptr),
-      clock_(base::DefaultClock::GetInstance()),
-      is_off_the_record_profile_(is_off_the_record_profile) {
+    : is_off_the_record_profile_(is_off_the_record_profile) {
   DCHECK(!is_off_the_record_profile_);
 }
 
 DataReductionProxySettings::~DataReductionProxySettings() = default;
 
-void DataReductionProxySettings::InitDataReductionProxySettings(
-    PrefService* prefs,
-    std::unique_ptr<DataReductionProxyService> data_reduction_proxy_service) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(prefs);
-  DCHECK(data_reduction_proxy_service);
-  prefs_ = prefs;
-  data_reduction_proxy_service_ = std::move(data_reduction_proxy_service);
-  RecordDataReductionInit();
-
-  registrar_.Init(prefs_);
-  registrar_.Add(
-      prefs::kDataSaverEnabled,
-      base::BindRepeating(&DataReductionProxySettings::OnProxyEnabledPrefChange,
-                          base::Unretained(this)));
-}
-
-void DataReductionProxySettings::SetCallbackToRegisterSyntheticFieldTrial(
-    const SyntheticFieldTrialRegistrationCallback&
-        on_data_reduction_proxy_enabled) {
-  register_synthetic_field_trial_ = on_data_reduction_proxy_enabled;
-  RegisterDataReductionProxyFieldTrial();
-}
+void DataReductionProxySettings::InitDataReductionProxySettings() {}
 
 // static
 bool DataReductionProxySettings::IsDataSaverEnabledByUser(
-    bool is_off_the_record_profile,
-    PrefService* prefs) {
+    bool is_off_the_record_profile) {
   if (is_off_the_record_profile)
     return false;
   if (ShouldForceEnableDataReductionProxy())
     return true;
-
-#if BUILDFLAG(IS_ANDROID)
-  return prefs && prefs->GetBoolean(prefs::kDataSaverEnabled);
-#else
   return false;
-#endif
-}
-
-// static
-void DataReductionProxySettings::SetDataSaverEnabledForTesting(
-    PrefService* prefs,
-    bool enabled) {
-  // Set the command line so that |IsDataSaverEnabledByUser| returns as expected
-  // on all platforms.
-  base::CommandLine* cmd = base::CommandLine::ForCurrentProcess();
-  if (enabled) {
-    cmd->AppendSwitch(switches::kEnableDataReductionProxy);
-  } else {
-    cmd->RemoveSwitch(switches::kEnableDataReductionProxy);
-  }
-
-  // Set the pref so that all the pref change callbacks run.
-  prefs->SetBoolean(prefs::kDataSaverEnabled, enabled);
-}
-
-bool DataReductionProxySettings::IsDataReductionProxyEnabled() const {
-  return IsDataSaverEnabledByUser(is_off_the_record_profile_,
-                                  GetOriginalProfilePrefs());
-}
-
-bool DataReductionProxySettings::CanUseDataReductionProxy(
-    const GURL& url) const {
-  return url.is_valid() && url.scheme() == url::kHttpScheme &&
-         IsDataReductionProxyEnabled();
-}
-
-bool DataReductionProxySettings::IsDataReductionProxyManaged() {
-  const PrefService::Preference* pref =
-      GetOriginalProfilePrefs()->FindPreference(prefs::kDataSaverEnabled);
-  return pref && pref->IsManaged();
-}
-
-void DataReductionProxySettings::SetDataReductionProxyEnabled(bool enabled) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  if (GetOriginalProfilePrefs()->GetBoolean(prefs::kDataSaverEnabled) !=
-      enabled) {
-    GetOriginalProfilePrefs()->SetBoolean(prefs::kDataSaverEnabled, enabled);
-    OnProxyEnabledPrefChange();
-  }
-}
-
-void DataReductionProxySettings::SetUnreachable(bool unreachable) {
-  unreachable_ = unreachable;
-}
-
-bool DataReductionProxySettings::IsDataReductionProxyUnreachable() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return unreachable_;
-}
-
-PrefService* DataReductionProxySettings::GetOriginalProfilePrefs() const {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return prefs_;
-}
-
-base::Time DataReductionProxySettings::GetLastEnabledTime() const {
-  PrefService* prefs = GetOriginalProfilePrefs();
-  int64_t last_enabled_time =
-      prefs->GetInt64(prefs::kDataReductionProxyLastEnabledTime);
-  if (last_enabled_time <= 0)
-    return base::Time();
-  return base::Time::FromInternalValue(last_enabled_time);
-}
-
-void DataReductionProxySettings::RegisterDataReductionProxyFieldTrial() {
-  register_synthetic_field_trial_.Run(
-      "SyntheticDataReductionProxySetting",
-      IsDataReductionProxyEnabled() ? "Enabled" : "Disabled");
-}
-
-void DataReductionProxySettings::OnProxyEnabledPrefChange() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  if (!register_synthetic_field_trial_.is_null()) {
-    RegisterDataReductionProxyFieldTrial();
-  }
-  MaybeActivateDataReductionProxy(false);
-
-  bool enabled = IsDataReductionProxyEnabled();
-  for (auto& observer : observers_)
-    observer.OnDataSaverEnabledChanged(enabled);
-}
-
-void DataReductionProxySettings::MaybeActivateDataReductionProxy(
-    bool at_startup) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  PrefService* prefs = GetOriginalProfilePrefs();
-  // Do nothing if prefs have not been initialized. This allows unit testing
-  // of profile related code without having to initialize data reduction proxy
-  // related prefs.
-  if (!prefs)
-    return;
-
-  bool enabled = IsDataSaverEnabledByUser(is_off_the_record_profile_, prefs);
-
-  if (enabled && at_startup) {
-    const auto last_enabled_time = GetLastEnabledTime();
-    if (!last_enabled_time.is_null()) {
-      // Record the metric only if the time when data reduction proxy was
-      // enabled is available.
-      RecordDaysSinceEnabledMetric(
-          (clock_->Now() - last_enabled_time).InDays());
-    }
-  }
-
-  if (enabled &&
-      !prefs->GetBoolean(prefs::kDataReductionProxyWasEnabledBefore)) {
-    prefs->SetBoolean(prefs::kDataReductionProxyWasEnabledBefore, true);
-  }
-  if (!at_startup) {
-    if (IsDataReductionProxyEnabled()) {
-      RecordSettingsEnabledState(DATA_REDUCTION_SETTINGS_ACTION_OFF_TO_ON);
-
-      // Data reduction proxy has been enabled by the user. Record the number of
-      // days since the data reduction proxy has been enabled as zero, and
-      // store the current time in the pref.
-      prefs->SetInt64(prefs::kDataReductionProxyLastEnabledTime,
-                      clock_->Now().ToInternalValue());
-      RecordDaysSinceEnabledMetric(0);
-    } else {
-      RecordSettingsEnabledState(DATA_REDUCTION_SETTINGS_ACTION_ON_TO_OFF);
-    }
-  }
 }
 
 void DataReductionProxySettings::AddDataReductionProxySettingsObserver(
@@ -240,17 +60,4 @@
   observers_.RemoveObserver(observer);
 }
 
-// Metrics methods
-void DataReductionProxySettings::RecordDataReductionInit() const {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  RecordStartupState(IsDataReductionProxyEnabled() ? PROXY_ENABLED
-                                                   : PROXY_DISABLED);
-}
-
-void DataReductionProxySettings::RecordStartupState(
-    ProxyStartupState state) const {
-  UMA_HISTOGRAM_ENUMERATION(kUMAProxyStartupStateHistogram, state,
-                            PROXY_STARTUP_STATE_COUNT);
-}
-
 }  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h
index 914b0806..c1729d5 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h
@@ -5,10 +5,6 @@
 #ifndef COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_SETTINGS_H_
 #define COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_SETTINGS_H_
 
-#include <stdint.h>
-
-#include <memory>
-
 #include "base/callback.h"
 #include "base/compiler_specific.h"
 #include "base/gtest_prod_util.h"
@@ -16,40 +12,10 @@
 #include "base/observer_list.h"
 #include "base/threading/thread_checker.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h"
-#include "components/prefs/pref_change_registrar.h"
-#include "components/prefs/pref_member.h"
-#include "net/http/http_request_headers.h"
 #include "url/gurl.h"
 
-class PrefService;
-
-namespace base {
-class Clock;
-}
-
 namespace data_reduction_proxy {
 
-class DataReductionProxyService;
-
-// Values of the UMA DataReductionProxy.StartupState histogram.
-// This enum must remain synchronized with DataReductionProxyStartupState
-// in metrics/histograms/histograms.xml.
-enum ProxyStartupState {
-  PROXY_NOT_AVAILABLE = 0,
-  PROXY_DISABLED,
-  PROXY_ENABLED,
-  PROXY_STARTUP_STATE_COUNT,
-};
-
-// Values of the UMA DataReductionProxy.EnabledState histogram.
-// This enum must remain synchronized with DataReductionProxyEnabledState
-// in metrics/histograms/histograms.xml.
-enum DataReductionSettingsEnabledAction {
-  DATA_REDUCTION_SETTINGS_ACTION_OFF_TO_ON = 0,
-  DATA_REDUCTION_SETTINGS_ACTION_ON_TO_OFF,
-  DATA_REDUCTION_SETTINGS_ACTION_BOUNDARY,
-};
-
 // Classes may derive from |DataReductionProxySettingsObserver| and register as
 // an observer of |DataReductionProxySettings| to get notified when the proxy
 // request headers change or when the DRPSettings class is initialized.
@@ -64,9 +30,6 @@
 // be called from there.
 class DataReductionProxySettings {
  public:
-  using SyntheticFieldTrialRegistrationCallback =
-      base::RepeatingCallback<bool(base::StringPiece, base::StringPiece)>;
-
   explicit DataReductionProxySettings(bool is_off_the_record_profile);
 
   DataReductionProxySettings(const DataReductionProxySettings&) = delete;
@@ -78,62 +41,16 @@
   // Initializes the Data Reduction Proxy with the profile prefs. The caller
   // must ensure that all parameters remain alive for the lifetime of the
   // |DataReductionProxySettings| instance.
-  void InitDataReductionProxySettings(
-      PrefService* prefs,
-      std::unique_ptr<DataReductionProxyService> data_reduction_proxy_service);
-
-  // Sets the |register_synthetic_field_trial_| callback and runs to register
-  // the DataReductionProxyEnabled synthetic field trial.
-  void SetCallbackToRegisterSyntheticFieldTrial(
-      const SyntheticFieldTrialRegistrationCallback&
-          on_data_reduction_proxy_enabled);
+  void InitDataReductionProxySettings();
 
   // Returns true if the Data Saver feature is enabled by the user on Android.
   // This checks only the Data Saver prefs on Android or forcing flag on any
   // platform. Does not check any holdback experiments. Note that this may be
   // different from the value of |IsDataReductionProxyEnabled|.
-  static bool IsDataSaverEnabledByUser(bool is_off_the_record_profile,
-                                       PrefService* prefs);
+  static bool IsDataSaverEnabledByUser(bool is_off_the_record_profile);
 
   // Enables or disables Data Saver, regardless of platform.
-  static void SetDataSaverEnabledForTesting(PrefService* prefs, bool enabled);
-
-  // Returns true if the Data Reduction HTTP Proxy is enabled. Note that this
-  // may be different from the value of |IsDataSaverEnabledByUser|.
-  bool IsDataReductionProxyEnabled() const;
-
-  // Returns true if the proxy can be used for the given url. This method does
-  // not take into account the proxy config or proxy retry list, so it can
-  // return true even when the proxy will not be used. Specifically, if
-  // another proxy configuration overrides use of data reduction proxy, or
-  // if data reduction proxy is in proxy retry list, then data reduction proxy
-  // will not be used, but this method will still return true. If this method
-  // returns false, then we are guaranteed that data reduction proxy will not be
-  // used.
-  bool CanUseDataReductionProxy(const GURL& url) const;
-
-  // Returns true if the proxy is managed by an adminstrator's policy.
-  bool IsDataReductionProxyManaged();
-
-  // Enables or disables the data reduction proxy.
-  void SetDataReductionProxyEnabled(bool enabled);
-
-  // Records that the data reduction proxy is unreachable or not.
-  void SetUnreachable(bool unreachable);
-
-  // Returns whether the data reduction proxy is unreachable. Returns true
-  // if no request has successfully completed through proxy, even though atleast
-  // some of them should have.
-  bool IsDataReductionProxyUnreachable();
-
-  // Configures data reduction proxy. |at_startup| is true when this method is
-  // called in response to creating or loading a new profile.
-  void MaybeActivateDataReductionProxy(bool at_startup);
-
-  // Returns the time LiteMode was last enabled. This is reset whenever LiteMode
-  // is disabled and re-enabled from settings. Null time is returned when
-  // LiteMode has never been enabled.
-  base::Time GetLastEnabledTime() const;
+  static void SetDataSaverEnabledForTesting(bool enabled);
 
   // Adds an observer that is notified every time the proxy request headers
   // change.
@@ -145,78 +62,7 @@
   void RemoveDataReductionProxySettingsObserver(
       DataReductionProxySettingsObserver* observer);
 
-  DataReductionProxyService* data_reduction_proxy_service() {
-    return data_reduction_proxy_service_.get();
-  }
-
- protected:
-  void InitPrefMembers();
-
-  // Virtualized for unit test support.
-  virtual PrefService* GetOriginalProfilePrefs() const;
-
-  // Metrics method. Subclasses should override if they wish to provide
-  // alternatives.
-  virtual void RecordDataReductionInit() const;
-
-  // Virtualized for mocking. Records UMA specifying whether the proxy was
-  // enabled or disabled at startup.
-  virtual void RecordStartupState(
-      data_reduction_proxy::ProxyStartupState state) const;
-
  private:
-  friend class DataReductionProxySettingsTestBase;
-  friend class DataReductionProxySettingsTest;
-  friend class DataReductionProxyTestContext;
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           TestResetDataReductionStatistics);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           TestIsProxyEnabledOrManaged);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           TestCanUseDataReductionProxy);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest, TestContentLengths);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           TestGetDailyContentLengths);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           TestMaybeActivateDataReductionProxy);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           TestOnProxyEnabledPrefChange);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           TestInitDataReductionProxyOn);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           TestInitDataReductionProxyOff);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           CheckInitMetricsWhenNotAllowed);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           TestSettingsEnabledStateHistograms);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           TestDaysSinceEnabled);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           TestDaysSinceEnabledWithTestClock);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           TestDaysSinceEnabledExistingUser);
-  FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsTest,
-                           TestDaysSinceSavingsCleared);
-
-  // Registers the trial "SyntheticDataReductionProxySetting" with the group
-  // "Enabled" or "Disabled". Indicates whether the proxy is turned on or not.
-  void RegisterDataReductionProxyFieldTrial();
-
-  void OnProxyEnabledPrefChange();
-
-  bool unreachable_;
-
-  std::unique_ptr<DataReductionProxyService> data_reduction_proxy_service_;
-
-  raw_ptr<PrefService> prefs_;
-
-  PrefChangeRegistrar registrar_;
-
-  SyntheticFieldTrialRegistrationCallback register_synthetic_field_trial_;
-
-  // Should not be null.
-  raw_ptr<base::Clock> clock_;
-
   // Observers to notify when the proxy request headers change or |this| is
   // initialized.
   base::ObserverList<DataReductionProxySettingsObserver>::Unchecked observers_;
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.cc
deleted file mode 100644
index a0ede42..0000000
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.h"
-
-#include <stdint.h>
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_piece.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
-#include "components/prefs/pref_registry_simple.h"
-#include "components/prefs/scoped_user_pref_update.h"
-#include "components/prefs/testing_pref_service.h"
-
-using testing::_;
-using testing::AnyNumber;
-using testing::Return;
-
-namespace {
-
-const char kProxy[] = "proxy";
-
-}  // namespace
-
-namespace data_reduction_proxy {
-
-DataReductionProxySettingsTestBase::DataReductionProxySettingsTestBase() {}
-
-DataReductionProxySettingsTestBase::~DataReductionProxySettingsTestBase() {}
-
-// testing::Test implementation:
-void DataReductionProxySettingsTestBase::SetUp() {
-  test_context_ =
-      DataReductionProxyTestContext::Builder()
-          .WithMockConfig()
-          .WithMockDataReductionProxyService()
-          .SkipSettingsInitialization()
-          .Build();
-
-  test_context_->SetDataReductionProxyEnabled(false);
-  TestingPrefServiceSimple* pref_service = test_context_->pref_service();
-  pref_service->registry()->RegisterDictionaryPref(kProxy);
-  pref_service->SetBoolean(prefs::kDataReductionProxyWasEnabledBefore, false);
-
-  ResetSettings(nullptr);
-}
-
-template <class C>
-void DataReductionProxySettingsTestBase::ResetSettings(base::Clock* clock) {
-  MockDataReductionProxySettings<C>* settings =
-      new MockDataReductionProxySettings<C>();
-  if (settings_) {
-    settings->data_reduction_proxy_service_ =
-        std::move(settings_->data_reduction_proxy_service_);
-  } else {
-    settings->data_reduction_proxy_service_ = test_context_->TakeService();
-  }
-  settings->data_reduction_proxy_service_->SetSettingsForTesting(settings);
-  settings->prefs_ = test_context_->pref_service();
-  if (clock)
-    settings->clock_ = clock;
-  EXPECT_CALL(*settings, GetOriginalProfilePrefs())
-      .Times(AnyNumber())
-      .WillRepeatedly(Return(test_context_->pref_service()));
-  EXPECT_CALL(*settings, GetLocalStatePrefs())
-      .Times(AnyNumber())
-      .WillRepeatedly(Return(test_context_->pref_service()));
-  settings_.reset(settings);
-}
-
-// Explicitly generate required instantiations.
-template void DataReductionProxySettingsTestBase::ResetSettings<
-    DataReductionProxySettings>(base::Clock* clock);
-
-void DataReductionProxySettingsTestBase::CheckOnPrefChange(
-    bool enabled,
-    bool expected_enabled,
-    bool managed) {
-  if (managed) {
-    test_context_->pref_service()->SetManagedPref(
-        prefs::kDataSaverEnabled, std::make_unique<base::Value>(enabled));
-  } else {
-    test_context_->SetDataReductionProxyEnabled(enabled);
-  }
-  test_context_->RunUntilIdle();
-  // Never expect the proxy to be restricted for pref change tests.
-}
-
-void DataReductionProxySettingsTestBase::InitDataReductionProxy(
-    bool enabled_at_startup) {
-  settings_->InitDataReductionProxySettings(
-      test_context_->pref_service(),
-      std::move(settings_->data_reduction_proxy_service_));
-  settings_->SetCallbackToRegisterSyntheticFieldTrial(base::BindRepeating(
-      &DataReductionProxySettingsTestBase::OnSyntheticFieldTrialRegistration,
-      base::Unretained(this)));
-
-  test_context_->RunUntilIdle();
-}
-
-void DataReductionProxySettingsTestBase::CheckDataReductionProxySyntheticTrial(
-    bool enabled) {
-  EXPECT_EQ(enabled ? "Enabled" : "Disabled",
-      synthetic_field_trials_["SyntheticDataReductionProxySetting"]);
-}
-
-bool DataReductionProxySettingsTestBase::OnSyntheticFieldTrialRegistration(
-    base::StringPiece trial_name,
-    base::StringPiece group_name) {
-  synthetic_field_trials_[std::string(trial_name)] = std::string(group_name);
-  return true;
-}
-
-}  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.h
deleted file mode 100644
index 939bf810..0000000
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_SETTINGS_TEST_UTILS_H_
-#define COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_SETTINGS_TEST_UTILS_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/message_loop/message_pump_type.h"
-#include "base/strings/string_piece.h"
-#include "base/task/single_thread_task_executor.h"
-#include "base/time/clock.h"
-#include "base/time/time.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
-#include "components/prefs/testing_pref_service.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-class PrefService;
-
-namespace data_reduction_proxy {
-
-class DataReductionProxyTestContext;
-
-template <class C>
-class MockDataReductionProxySettings : public C {
- public:
-  MockDataReductionProxySettings<C>() : C(false) {}
-  MOCK_CONST_METHOD0(GetOriginalProfilePrefs, PrefService*());
-  MOCK_METHOD0(GetLocalStatePrefs, PrefService*());
-  MOCK_CONST_METHOD1(RecordStartupState, void(ProxyStartupState state));
-};
-
-class DataReductionProxySettingsTestBase : public testing::Test {
- public:
-  static void AddTestProxyToCommandLine();
-
-  DataReductionProxySettingsTestBase();
-  ~DataReductionProxySettingsTestBase() override;
-
-  void AddProxyToCommandLine();
-
-  void SetUp() override;
-
-  template <class C>
-  void ResetSettings(base::Clock* clock);
-  virtual void ResetSettings(base::Clock* clock) = 0;
-
-  void CheckMaybeActivateDataReductionProxy(bool initially_enabled,
-                                            bool request_succeeded,
-                                            bool expected_enabled,
-                                            bool expected_restricted,
-                                            bool expected_fallback_restricted);
-  void CheckOnPrefChange(bool enabled, bool expected_enabled, bool managed);
-  void InitWithStatisticsPrefs();
-  void InitDataReductionProxy(bool enabled_at_startup);
-  void CheckDataReductionProxySyntheticTrial(bool enabled);
-  bool OnSyntheticFieldTrialRegistration(base::StringPiece trial_name,
-                                         base::StringPiece group_name);
-
- protected:
-  base::SingleThreadTaskExecutor io_task_executor_{base::MessagePumpType::IO};
-  std::unique_ptr<DataReductionProxyTestContext> test_context_;
-  std::unique_ptr<DataReductionProxySettings> settings_;
-  std::map<std::string, std::string> synthetic_field_trials_;
-};
-
-// Test implementations should be subclasses of an instantiation of this
-// class parameterized for whatever DataReductionProxySettings class
-// is being tested.
-template <class C>
-class ConcreteDataReductionProxySettingsTest
-    : public DataReductionProxySettingsTestBase {
- public:
-  typedef MockDataReductionProxySettings<C> MockSettings;
-  void ResetSettings(base::Clock* clock) override {
-    return DataReductionProxySettingsTestBase::ResetSettings<C>(clock);
-  }
-};
-
-}  // namespace data_reduction_proxy
-
-#endif  // COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_SETTINGS_TEST_UTILS_H_
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_unittest.cc
deleted file mode 100644
index b65659fd..0000000
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_unittest.cc
+++ /dev/null
@@ -1,268 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/command_line.h"
-#include "base/metrics/field_trial.h"
-#include "base/metrics/histogram_samples.h"
-#include "base/test/metrics/histogram_tester.h"
-#include "base/test/mock_entropy_provider.h"
-#include "base/test/simple_test_clock.h"
-#include "base/test/task_environment.h"
-#include "base/time/clock.h"
-#include "base/time/default_clock.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
-#include "components/prefs/pref_registry_simple.h"
-#include "net/base/proxy_server.h"
-#include "net/http/http_util.h"
-#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
-#include "services/network/test/test_url_loader_factory.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace data_reduction_proxy {
-
-class DataReductionProxySettingsTest
-    : public ConcreteDataReductionProxySettingsTest<
-          DataReductionProxySettings> {
- public:
-  void CheckMaybeActivateDataReductionProxy(bool initially_enabled,
-                                            bool request_succeeded,
-                                            bool expected_enabled,
-                                            bool expected_restricted,
-                                            bool expected_fallback_restricted) {
-    test_context_->SetDataReductionProxyEnabled(initially_enabled);
-    settings_->MaybeActivateDataReductionProxy(false);
-    test_context_->RunUntilIdle();
-  }
-};
-
-TEST(DataReductionProxySettingsStandaloneTest, TestIsProxyEnabledOrManaged) {
-  base::test::SingleThreadTaskEnvironment task_environment{
-      base::test::SingleThreadTaskEnvironment::MainThreadType::IO};
-  std::unique_ptr<DataReductionProxyTestContext> drp_test_context =
-      DataReductionProxyTestContext::Builder()
-          .WithMockConfig()
-          .WithMockDataReductionProxyService()
-          .SkipSettingsInitialization()
-          .Build();
-
-  drp_test_context->InitSettings();
-
-  DataReductionProxySettings* settings = drp_test_context->settings();
-
-  drp_test_context->SetDataReductionProxyEnabled(true);
-  EXPECT_TRUE(settings->IsDataReductionProxyEnabled());
-  EXPECT_FALSE(settings->IsDataReductionProxyManaged());
-
-  drp_test_context->SetDataReductionProxyEnabled(false);
-  EXPECT_FALSE(settings->IsDataReductionProxyEnabled());
-  EXPECT_FALSE(settings->IsDataReductionProxyManaged());
-
-  drp_test_context->SetDataReductionProxyEnabled(false);
-  drp_test_context->pref_service()->SetManagedPref(
-      prefs::kDataSaverEnabled, std::make_unique<base::Value>(false));
-  EXPECT_FALSE(settings->IsDataReductionProxyEnabled());
-  EXPECT_TRUE(settings->IsDataReductionProxyManaged());
-
-  drp_test_context->SetDataReductionProxyEnabled(true);
-  drp_test_context->pref_service()->SetManagedPref(
-      prefs::kDataSaverEnabled, std::make_unique<base::Value>(true));
-  EXPECT_TRUE(settings->IsDataReductionProxyEnabled());
-  EXPECT_TRUE(settings->IsDataReductionProxyManaged());
-
-  drp_test_context->RunUntilIdle();
-}
-
-
-TEST_F(DataReductionProxySettingsTest, TestMaybeActivateDataReductionProxy) {
-  // Initialize the pref member in |settings_| without the usual callback
-  // so it won't trigger MaybeActivateDataReductionProxy when the pref value
-  // is set.
-
-  // TODO(bengr): Test enabling/disabling while a secure proxy check is
-  // outstanding.
-  // The proxy is enabled and unrestricted initially.
-  // Request succeeded but with bad response, expect proxy to be restricted.
-  CheckMaybeActivateDataReductionProxy(true, true, true, true, false);
-  // Request succeeded with valid response, expect proxy to be unrestricted.
-  CheckMaybeActivateDataReductionProxy(true, true, true, false, false);
-  // Request failed, expect proxy to be enabled but restricted.
-  CheckMaybeActivateDataReductionProxy(true, false, true, true, false);
-  // The proxy is disabled initially. No secure proxy checks should take place,
-  // and so the state should not change.
-  CheckMaybeActivateDataReductionProxy(false, true, false, false, false);
-}
-
-TEST_F(DataReductionProxySettingsTest, TestInitDataReductionProxyOn) {
-  MockSettings* settings = static_cast<MockSettings*>(settings_.get());
-  EXPECT_CALL(*settings, RecordStartupState(PROXY_ENABLED));
-
-  test_context_->SetDataReductionProxyEnabled(true);
-  InitDataReductionProxy(true);
-  CheckDataReductionProxySyntheticTrial(true);
-}
-
-TEST_F(DataReductionProxySettingsTest, TestInitDataReductionProxyOff) {
-  // InitDataReductionProxySettings with the preference off will directly call
-  // LogProxyState.
-  MockSettings* settings = static_cast<MockSettings*>(settings_.get());
-  EXPECT_CALL(*settings, RecordStartupState(PROXY_DISABLED));
-
-  test_context_->SetDataReductionProxyEnabled(false);
-  InitDataReductionProxy(false);
-  CheckDataReductionProxySyntheticTrial(false);
-}
-
-TEST_F(DataReductionProxySettingsTest, TestEnableProxyFromCommandLine) {
-  MockSettings* settings = static_cast<MockSettings*>(settings_.get());
-  EXPECT_CALL(*settings, RecordStartupState(PROXY_ENABLED));
-
-  base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      switches::kEnableDataReductionProxy);
-  InitDataReductionProxy(true);
-  CheckDataReductionProxySyntheticTrial(true);
-}
-
-TEST_F(DataReductionProxySettingsTest, TestSetDataReductionProxyEnabled) {
-  MockSettings* settings = static_cast<MockSettings*>(settings_.get());
-  EXPECT_CALL(*settings, RecordStartupState(PROXY_ENABLED));
-  test_context_->SetDataReductionProxyEnabled(true);
-  InitDataReductionProxy(true);
-
-  test_context_->SetDataReductionProxyEnabled(false);
-  test_context_->RunUntilIdle();
-  CheckDataReductionProxySyntheticTrial(false);
-
-  test_context_->SetDataReductionProxyEnabled(true);
-  test_context_->RunUntilIdle();
-  CheckDataReductionProxySyntheticTrial(true);
-}
-
-TEST_F(DataReductionProxySettingsTest, TestSettingsEnabledStateHistograms) {
-  const char kUMAEnabledState[] = "DataReductionProxy.EnabledState";
-  base::HistogramTester histogram_tester;
-
-  // No settings state histograms should be recorded during startup.
-  test_context_->RunUntilIdle();
-  histogram_tester.ExpectTotalCount(kUMAEnabledState, 0);
-
-  test_context_->SetDataReductionProxyEnabled(true);
-  settings_->MaybeActivateDataReductionProxy(false);
-  test_context_->RunUntilIdle();
-  histogram_tester.ExpectBucketCount(
-      kUMAEnabledState, DATA_REDUCTION_SETTINGS_ACTION_OFF_TO_ON, 1);
-  histogram_tester.ExpectBucketCount(
-      kUMAEnabledState, DATA_REDUCTION_SETTINGS_ACTION_ON_TO_OFF, 0);
-
-  test_context_->SetDataReductionProxyEnabled(false);
-  settings_->MaybeActivateDataReductionProxy(false);
-  test_context_->RunUntilIdle();
-  histogram_tester.ExpectBucketCount(
-      kUMAEnabledState, DATA_REDUCTION_SETTINGS_ACTION_OFF_TO_ON, 1);
-  histogram_tester.ExpectBucketCount(
-      kUMAEnabledState, DATA_REDUCTION_SETTINGS_ACTION_ON_TO_OFF, 1);
-}
-
-// Verify that the UMA metric and the pref is recorded correctly when the user
-// enables the data reduction proxy.
-TEST_F(DataReductionProxySettingsTest, TestDaysSinceEnabledWithTestClock) {
-  const char kUMAEnabledState[] = "DataReductionProxy.DaysSinceEnabled";
-  base::SimpleTestClock clock;
-  clock.Advance(base::Days(1));
-  ResetSettings(&clock);
-
-  base::Time last_enabled_time = clock.Now();
-
-  {
-    base::HistogramTester histogram_tester;
-
-    test_context_->RunUntilIdle();
-    histogram_tester.ExpectTotalCount(kUMAEnabledState, 0);
-
-    // Enable data reduction proxy. The metric should be recorded.
-    test_context_->SetDataReductionProxyEnabled(true);
-    settings_->MaybeActivateDataReductionProxy(false);
-    test_context_->RunUntilIdle();
-
-    last_enabled_time = clock.Now();
-
-    EXPECT_EQ(
-        last_enabled_time,
-        base::Time::FromInternalValue(test_context_->pref_service()->GetInt64(
-            prefs::kDataReductionProxyLastEnabledTime)));
-    histogram_tester.ExpectUniqueSample(kUMAEnabledState, 0, 1);
-  }
-
-  {
-    // Simulate turning off and on of data reduction proxy while Chromium is
-    // running.
-    test_context_->SetDataReductionProxyEnabled(false);
-    settings_->MaybeActivateDataReductionProxy(false);
-    clock.Advance(base::Days(1));
-    last_enabled_time = clock.Now();
-
-    test_context_->SetDataReductionProxyEnabled(true);
-    base::HistogramTester histogram_tester;
-    settings_->MaybeActivateDataReductionProxy(false /* at_startup */);
-    test_context_->RunUntilIdle();
-    histogram_tester.ExpectUniqueSample(kUMAEnabledState, 0, 1);
-    EXPECT_EQ(
-        last_enabled_time,
-        base::Time::FromInternalValue(test_context_->pref_service()->GetInt64(
-            prefs::kDataReductionProxyLastEnabledTime)));
-  }
-
-  {
-    // Advance clock by a random number of days.
-    int advance_clock_days = 42;
-    clock.Advance(base::Days(advance_clock_days));
-    base::HistogramTester histogram_tester;
-    // Simulate Chromium start up. Data reduction proxy was enabled
-    // |advance_clock_days| ago.
-    settings_->MaybeActivateDataReductionProxy(true /* at_startup */);
-    test_context_->RunUntilIdle();
-    histogram_tester.ExpectUniqueSample(kUMAEnabledState, advance_clock_days,
-                                        1);
-    EXPECT_EQ(
-        last_enabled_time,
-        base::Time::FromInternalValue(test_context_->pref_service()->GetInt64(
-            prefs::kDataReductionProxyLastEnabledTime)));
-  }
-}
-
-// Verify that the pref and the UMA metric are not recorded for existing users
-// that already have data reduction proxy on.
-TEST(DataReductionProxySettingsStandaloneTest,
-     TestDaysSinceEnabledExistingUser) {
-  base::test::SingleThreadTaskEnvironment task_environment{
-      base::test::SingleThreadTaskEnvironment::MainThreadType::IO};
-  std::unique_ptr<DataReductionProxyTestContext> drp_test_context =
-      DataReductionProxyTestContext::Builder()
-          .WithMockConfig()
-          .WithMockDataReductionProxyService()
-          .SkipSettingsInitialization()
-          .Build();
-
-  drp_test_context->InitSettings();
-
-  base::HistogramTester histogram_tester;
-
-  // Simulate Chromium startup with data reduction proxy already enabled.
-  drp_test_context->settings()->MaybeActivateDataReductionProxy(
-      true /* at_startup */);
-  drp_test_context->RunUntilIdle();
-  histogram_tester.ExpectTotalCount("DataReductionProxy.DaysSinceEnabled", 0);
-  EXPECT_EQ(0, drp_test_context->pref_service()->GetInt64(
-                   prefs::kDataReductionProxyLastEnabledTime));
-}
-
-}  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.cc
deleted file mode 100644
index 62d990b..0000000
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.cc
+++ /dev/null
@@ -1,250 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h"
-
-#include <map>
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/memory/ptr_util.h"
-#include "base/run_loop.h"
-#include "base/strings/string_piece.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
-#include "components/prefs/pref_registry_simple.h"
-#include "components/prefs/testing_pref_service.h"
-#include "net/base/network_delegate_impl.h"
-#include "net/proxy_resolution/proxy_config.h"
-#include "net/proxy_resolution/proxy_info.h"
-#include "net/proxy_resolution/proxy_list.h"
-#include "services/network/test/test_network_connection_tracker.h"
-#include "services/network/test/test_network_quality_tracker.h"
-#include "url/gurl.h"
-
-namespace {
-
-enum TestContextOptions {
-  // Permits mocking of the underlying |DataReductionProxyConfig|.
-  USE_MOCK_CONFIG = 0x1,
-  // Construct, but do not initialize the |DataReductionProxySettings| object.
-  // Primarily used for testing of the |DataReductionProxySettings| object
-  // itself.
-  SKIP_SETTINGS_INITIALIZATION = 0x2,
-  // Permits mocking of the underlying |DataReductionProxyService|.
-  USE_MOCK_SERVICE = 0x4,
-};
-
-}  // namespace
-
-namespace data_reduction_proxy {
-
-MockDataReductionProxyService::MockDataReductionProxyService(
-    DataReductionProxySettings* settings,
-    PrefService* prefs,
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
-    : DataReductionProxyService(settings, prefs) {}
-
-MockDataReductionProxyService::~MockDataReductionProxyService() {}
-
-TestDataReductionProxyService::TestDataReductionProxyService(
-    DataReductionProxySettings* settings,
-    PrefService* prefs,
-    const scoped_refptr<base::SequencedTaskRunner>& db_task_runner)
-    : DataReductionProxyService(settings, prefs) {}
-
-TestDataReductionProxyService::~TestDataReductionProxyService() {}
-
-DataReductionProxyTestContext::Builder::Builder()
-    : use_mock_config_(false),
-      use_mock_service_(false),
-      skip_settings_initialization_(false) {}
-
-DataReductionProxyTestContext::Builder::~Builder() {}
-
-DataReductionProxyTestContext::Builder&
-DataReductionProxyTestContext::Builder::WithMockConfig() {
-  use_mock_config_ = true;
-  return *this;
-}
-
-DataReductionProxyTestContext::Builder&
-DataReductionProxyTestContext::Builder::WithMockDataReductionProxyService() {
-  use_mock_service_ = true;
-  return *this;
-}
-
-DataReductionProxyTestContext::Builder&
-DataReductionProxyTestContext::Builder::SkipSettingsInitialization() {
-  skip_settings_initialization_ = true;
-  return *this;
-}
-
-DataReductionProxyTestContext::Builder&
-DataReductionProxyTestContext::Builder::WithSettings(
-    std::unique_ptr<DataReductionProxySettings> settings) {
-  settings_ = std::move(settings);
-  return *this;
-}
-
-std::unique_ptr<DataReductionProxyTestContext>
-DataReductionProxyTestContext::Builder::Build() {
-  unsigned int test_context_flags = 0;
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner =
-      base::ThreadTaskRunnerHandle::Get();
-  std::unique_ptr<TestingPrefServiceSimple> pref_service(
-      new TestingPrefServiceSimple());
-
-  if (use_mock_config_) {
-    test_context_flags |= USE_MOCK_CONFIG;
-  } else {
-    test_context_flags ^= USE_MOCK_CONFIG;
-  }
-
-
-  if (!settings_)
-    settings_ = std::make_unique<DataReductionProxySettings>(false);
-  if (skip_settings_initialization_) {
-    test_context_flags |= SKIP_SETTINGS_INITIALIZATION;
-  }
-
-  pref_service->registry()->RegisterBooleanPref(prefs::kDataSaverEnabled,
-                                                false);
-  RegisterSimpleProfilePrefs(pref_service->registry());
-
-  std::unique_ptr<DataReductionProxyService> service;
-  if (use_mock_service_) {
-    test_context_flags |= USE_MOCK_SERVICE;
-    service = std::make_unique<MockDataReductionProxyService>(
-        settings_.get(), pref_service.get(), task_runner);
-  } else {
-    service = std::make_unique<TestDataReductionProxyService>(
-        settings_.get(), pref_service.get(), task_runner);
-  }
-
-  std::unique_ptr<DataReductionProxyTestContext> test_context(
-      new DataReductionProxyTestContext(
-          task_runner, std::move(pref_service), std::move(settings_),
-          std::move(service), test_context_flags));
-
-  if (!skip_settings_initialization_)
-    test_context->InitSettingsWithoutCheck();
-
-  return test_context;
-}
-
-DataReductionProxyTestContext::DataReductionProxyTestContext(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-    std::unique_ptr<TestingPrefServiceSimple> simple_pref_service,
-    std::unique_ptr<DataReductionProxySettings> settings,
-    std::unique_ptr<DataReductionProxyService> service,
-    unsigned int test_context_flags)
-    : test_context_flags_(test_context_flags),
-      task_runner_(task_runner),
-      simple_pref_service_(std::move(simple_pref_service)),
-      settings_(std::move(settings)),
-      service_(std::move(service)) {
-  if (service_)
-    data_reduction_proxy_service_ = service_.get();
-  else
-    data_reduction_proxy_service_ = settings_->data_reduction_proxy_service();
-}
-
-DataReductionProxyTestContext::~DataReductionProxyTestContext() {
-  DestroySettings();
-}
-
-void DataReductionProxyTestContext::RegisterDataReductionProxyEnabledPref() {
-  simple_pref_service_->registry()->RegisterBooleanPref(
-      prefs::kDataSaverEnabled, false);
-}
-
-void DataReductionProxyTestContext::SetDataReductionProxyEnabled(bool enabled) {
-  // Set the command line so that |IsDataSaverEnabledByUser| returns as expected
-  // on all platforms.
-  base::CommandLine* cmd = base::CommandLine::ForCurrentProcess();
-  if (enabled) {
-    cmd->AppendSwitch(switches::kEnableDataReductionProxy);
-  } else {
-    cmd->RemoveSwitch(switches::kEnableDataReductionProxy);
-  }
-
-  simple_pref_service_->SetBoolean(prefs::kDataSaverEnabled, enabled);
-}
-
-bool DataReductionProxyTestContext::IsDataReductionProxyEnabled() const {
-  return simple_pref_service_->GetBoolean(prefs::kDataSaverEnabled);
-}
-
-void DataReductionProxyTestContext::RunUntilIdle() {
-  base::RunLoop().RunUntilIdle();
-}
-
-void DataReductionProxyTestContext::InitSettings() {
-  DCHECK(test_context_flags_ & SKIP_SETTINGS_INITIALIZATION);
-  InitSettingsWithoutCheck();
-}
-
-void DataReductionProxyTestContext::DestroySettings() {
-  // Force destruction of |DBDataOwner|, which lives on DB task runner and is
-  // indirectly owned by |settings_|.
-  if (settings_) {
-    settings_.reset();
-    RunUntilIdle();
-  }
-}
-
-void DataReductionProxyTestContext::InitSettingsWithoutCheck() {
-  DCHECK(service_);
-  settings_->InitDataReductionProxySettings(simple_pref_service_.get(),
-                                            std::move(service_));
-}
-
-std::unique_ptr<DataReductionProxyService>
-DataReductionProxyTestContext::TakeService() {
-  DCHECK(service_);
-  DCHECK(test_context_flags_ & SKIP_SETTINGS_INITIALIZATION);
-  return std::move(service_);
-}
-
-void DataReductionProxyTestContext::
-    EnableDataReductionProxyWithSecureProxyCheckSuccess() {
-  // |settings_| needs to have been initialized, since a
-  // |DataReductionProxyService| is needed in order to issue the secure proxy
-  // check.
-  DCHECK(data_reduction_proxy_service());
-
-  // Set the pref to cause the secure proxy check to be issued.
-  SetDataReductionProxyEnabled(true);
-  RunUntilIdle();
-}
-
-
-
-DataReductionProxyService*
-DataReductionProxyTestContext::data_reduction_proxy_service() const {
-  return data_reduction_proxy_service_;
-}
-
-TestDataReductionProxyService*
-DataReductionProxyTestContext::test_data_reduction_proxy_service() const {
-  DCHECK(!(test_context_flags_ & USE_MOCK_SERVICE));
-  return static_cast<TestDataReductionProxyService*>(
-      data_reduction_proxy_service());
-}
-
-MockDataReductionProxyService*
-DataReductionProxyTestContext::mock_data_reduction_proxy_service() const {
-  DCHECK(!(test_context_flags_ & SKIP_SETTINGS_INITIALIZATION));
-  DCHECK(test_context_flags_ & USE_MOCK_SERVICE);
-  return static_cast<MockDataReductionProxyService*>(
-      data_reduction_proxy_service());
-}
-
-}  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h
deleted file mode 100644
index 6e58728..0000000
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_TEST_UTILS_H_
-#define COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_TEST_UTILS_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "base/strings/string_piece.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/time/clock.h"
-#include "base/time/tick_clock.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
-#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.h"
-#include "components/prefs/pref_registry_simple.h"
-#include "components/prefs/testing_pref_service.h"
-#include "net/base/backoff_entry.h"
-#include "net/base/proxy_server.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-class TestingPrefServiceSimple;
-
-namespace data_reduction_proxy {
-
-class DataReductionProxySettings;
-
-
-// Test version of |DataReductionProxyService|, which permits mocking of various
-// methods.
-class MockDataReductionProxyService : public DataReductionProxyService {
- public:
-  MockDataReductionProxyService(
-      DataReductionProxySettings* settings,
-      PrefService* prefs,
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
-  ~MockDataReductionProxyService() override;
-
-  MOCK_METHOD2(SetProxyPrefs, void(bool enabled, bool at_startup));
-};
-
-// Test version of |DataReductionProxyService|, which bypasses initialization in
-// the constructor in favor of explicitly passing in its owned classes. This
-// permits the use of test/mock versions of those classes.
-class TestDataReductionProxyService : public DataReductionProxyService {
- public:
-  TestDataReductionProxyService(
-      DataReductionProxySettings* settings,
-      PrefService* prefs,
-      const scoped_refptr<base::SequencedTaskRunner>& db_task_runner);
-  ~TestDataReductionProxyService() override;
-};
-
-class DataReductionProxyTestContext {
- public:
-  // Allows for a fluent builder interface to configure what kind of objects
-  // (test vs mock vs real) are used by the |DataReductionProxyTestContext|.
-  class Builder {
-   public:
-    Builder();
-
-    ~Builder();
-
-    // Specifies the use of |MockDataReductionProxyConfig| instead of
-    // |TestDataReductionProxyConfig|.
-    Builder& WithMockConfig();
-
-    // Specifies the use of |MockDataReductionProxyService| instead of
-    // |DataReductionProxyService|.
-    Builder& WithMockDataReductionProxyService();
-
-    // Construct, but do not initialize the |DataReductionProxySettings| object.
-    Builder& SkipSettingsInitialization();
-
-    // Specifies a settings object to use.
-    Builder& WithSettings(std::unique_ptr<DataReductionProxySettings> settings);
-
-    // Creates a |DataReductionProxyTestContext|. Owned by the caller.
-    std::unique_ptr<DataReductionProxyTestContext> Build();
-
-   private:
-    bool use_mock_config_;
-    bool use_mock_service_;
-    bool skip_settings_initialization_;
-    std::unique_ptr<DataReductionProxySettings> settings_;
-  };
-
-  DataReductionProxyTestContext(const DataReductionProxyTestContext&) = delete;
-  DataReductionProxyTestContext& operator=(
-      const DataReductionProxyTestContext&) = delete;
-
-  virtual ~DataReductionProxyTestContext();
-
-  // Registers, sets, and gets the preference used to enable the Data Reduction
-  // Proxy, respectively.
-  void RegisterDataReductionProxyEnabledPref();
-  void SetDataReductionProxyEnabled(bool enabled);
-  bool IsDataReductionProxyEnabled() const;
-
-  // Waits while executing all tasks on the current SingleThreadTaskRunner.
-  void RunUntilIdle();
-
-  // Initializes the |DataReductionProxySettings| object. Can only be called if
-  // built with SkipSettingsInitialization.
-  void InitSettings();
-
-  // Destroys the |DataReductionProxySettings| object and waits until objects on
-  // the DB task runner are destroyed.
-  void DestroySettings();
-
-  // Takes ownership of the |DataReductionProxyService| object. Can only be
-  // called if built with SkipSettingsInitialization.
-  std::unique_ptr<DataReductionProxyService> TakeService();
-
-  // Enable the Data Reduction Proxy, simulating a successful secure proxy
-  // check. This can only be called if not built with WithTestConfigurator,
-  // |settings_| has been initialized, and |this| was built with a
-  // |net::MockClientSocketFactory| specified.
-  void EnableDataReductionProxyWithSecureProxyCheckSuccess();
-
-
-  DataReductionProxyService* data_reduction_proxy_service() const;
-
-  // Returns the underlying |TestDataReductionProxyService|. This can only be
-  // called if not built with WithMockDataReductionProxyService.
-  TestDataReductionProxyService* test_data_reduction_proxy_service() const;
-
-  // Returns the underlying |MockDataReductionProxyService|. This can only
-  // be called if built with WithMockDataReductionProxyService.
-  MockDataReductionProxyService* mock_data_reduction_proxy_service() const;
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner() const {
-    return task_runner_;
-  }
-
-  TestingPrefServiceSimple* pref_service() {
-    return simple_pref_service_.get();
-  }
-
-  DataReductionProxySettings* settings() const { return settings_.get(); }
-
-  void InitSettingsWithoutCheck();
-
-
- private:
-  DataReductionProxyTestContext(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-      std::unique_ptr<TestingPrefServiceSimple> simple_pref_service,
-      std::unique_ptr<DataReductionProxySettings> settings,
-      std::unique_ptr<DataReductionProxyService> service,
-      unsigned int test_context_flags);
-
-  unsigned int test_context_flags_;
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  std::unique_ptr<TestingPrefServiceSimple> simple_pref_service_;
-
-  std::unique_ptr<DataReductionProxySettings> settings_;
-  raw_ptr<DataReductionProxyService> data_reduction_proxy_service_;
-  std::unique_ptr<DataReductionProxyService> service_;
-};
-
-}  // namespace data_reduction_proxy
-
-#endif  // COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_TEST_UTILS_H_
diff --git a/components/data_reduction_proxy/core/common/BUILD.gn b/components/data_reduction_proxy/core/common/BUILD.gn
index 78f88dd..45d0a69 100644
--- a/components/data_reduction_proxy/core/common/BUILD.gn
+++ b/components/data_reduction_proxy/core/common/BUILD.gn
@@ -7,8 +7,6 @@
 template("common_tmpl") {
   static_library(target_name) {
     sources = [
-      "data_reduction_proxy_pref_names.cc",
-      "data_reduction_proxy_pref_names.h",
       "data_reduction_proxy_switches.cc",
       "data_reduction_proxy_switches.h",
     ]
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.cc
deleted file mode 100644
index 3448abf..0000000
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-
-#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
-
-namespace data_reduction_proxy {
-namespace prefs {
-
-// A boolean specifying whether the DataSaver feature is enabled for this
-// client. Note that this preference key name is a legacy string for the sdpy
-// proxy.
-//
-// WARNING: This pref is not the source of truth for determining if Data Saver
-// is enabled. Use |DataReductionSettings::IsDataSaverEnabledByUser| instead or
-// consult the OWNERS.
-const char kDataSaverEnabled[] = "spdy_proxy.enabled";
-
-// A boolean specifying whether the data reduction proxy was ever enabled
-// before.
-const char kDataReductionProxyWasEnabledBefore[] =
-    "spdy_proxy.was_enabled_before";
-
-// An integer pref that contains the time when the data reduction proxy was last
-// enabled. Recorded only if the data reduction proxy was last enabled since
-// this pref was added.
-const char kDataReductionProxyLastEnabledTime[] =
-    "data_reduction.last_enabled_time";
-
-}  // namespace prefs
-}  // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h b/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h
deleted file mode 100644
index 50bc5f1..0000000
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_DATA_REDUCTION_PROXY_CORE_COMMON_DATA_REDUCTION_PROXY_PREF_NAMES_H_
-#define COMPONENTS_DATA_REDUCTION_PROXY_CORE_COMMON_DATA_REDUCTION_PROXY_PREF_NAMES_H_
-
-namespace data_reduction_proxy {
-namespace prefs {
-
-// Alphabetical list of preference names specific to the data_reduction_proxy
-// component. Keep alphabetized, and document each in the .cc file.
-
-extern const char kDataSaverEnabled[];
-extern const char kDataReductionProxyWasEnabledBefore[];
-extern const char kDataReductionProxyLastEnabledTime[];
-
-}  // namespace prefs
-}  // namespace data_reduction_proxy
-
-#endif  // COMPONENTS_DATA_REDUCTION_PROXY_CORE_COMMON_DATA_REDUCTION_PROXY_PREF_NAMES_H_
diff --git a/components/keep_alive_registry/keep_alive_types.cc b/components/keep_alive_registry/keep_alive_types.cc
index 950be06c..4b7b71c 100644
--- a/components/keep_alive_registry/keep_alive_types.cc
+++ b/components/keep_alive_registry/keep_alive_types.cc
@@ -14,6 +14,8 @@
       return out << "BROWSER";
     case KeepAliveOrigin::BROWSER_PROCESS_CHROMEOS:
       return out << "BROWSER_PROCESS_CHROMEOS";
+    case KeepAliveOrigin::BROWSER_PROCESS_FUCHSIA:
+      return out << "BROWSER_PROCESS_FUCHSIA";
     case KeepAliveOrigin::BROWSER_PROCESS_LACROS:
       return out << "BROWSER_PROCESS_LACROS";
     case KeepAliveOrigin::SESSION_RESTORE:
diff --git a/components/keep_alive_registry/keep_alive_types.h b/components/keep_alive_registry/keep_alive_types.h
index 15b4f9c..a867de71 100644
--- a/components/keep_alive_registry/keep_alive_types.h
+++ b/components/keep_alive_registry/keep_alive_types.h
@@ -18,6 +18,7 @@
   APP_CONTROLLER,
   BROWSER,
   BROWSER_PROCESS_CHROMEOS,
+  BROWSER_PROCESS_FUCHSIA,
   BROWSER_PROCESS_LACROS,
   SESSION_RESTORE,
 
diff --git a/components/messages/OWNERS b/components/messages/OWNERS
index 176a509..3e383e5 100644
--- a/components/messages/OWNERS
+++ b/components/messages/OWNERS
@@ -1,4 +1,4 @@
-pavely@chromium.org
 twellington@chromium.org
 mdjones@chromium.org
 lazzzis@google.com
+aishwaryarj@google.com
diff --git a/components/offline_items_collection/core/BUILD.gn b/components/offline_items_collection/core/BUILD.gn
index 09cfe44e..cded3c4 100644
--- a/components/offline_items_collection/core/BUILD.gn
+++ b/components/offline_items_collection/core/BUILD.gn
@@ -56,7 +56,10 @@
       "android/offline_item_visuals_bridge.h",
     ]
 
-    deps += [ ":jni_headers" ]
+    deps += [
+      ":jni_headers",
+      "//url:gurl_android",
+    ]
   }
 }
 
@@ -112,6 +115,7 @@
     deps = [
       "//base:base_java",
       "//third_party/androidx:androidx_annotation_annotation_java",
+      "//url:gurl_java",
     ]
   }
 
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java
index 507e6b7..50b816b 100644
--- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java
+++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.offline_items_collection;
 
+import org.chromium.url.GURL;
+
 import java.util.Objects;
 
 /**
@@ -90,7 +92,7 @@
     public String mimeType;
 
     // Request Metadata.
-    public String url;
+    public GURL url;
     public String originalUrl;
     public boolean isOffTheRecord;
     public String otrProfileId;
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java
index 158e0da9..643605611 100644
--- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java
+++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java
@@ -14,6 +14,7 @@
 import org.chromium.components.offline_items_collection.OfflineItemState;
 import org.chromium.components.offline_items_collection.PendingState;
 import org.chromium.components.offline_items_collection.UpdateDelta;
+import org.chromium.url.GURL;
 
 import java.util.ArrayList;
 
@@ -50,8 +51,8 @@
             @OfflineItemFilter int filter, boolean isTransient, boolean isSuggested,
             boolean isAccelerated, boolean promoteOrigin, long totalSizeBytes,
             boolean externallyRemoved, long creationTimeMs, long completionTimeMs,
-            long lastAccessedTimeMs, boolean isOpenable, String filePath, String mimeType,
-            String url, String originalUrl, boolean isOffTheRecord, String otrProfileId,
+            long lastAccessedTimeMs, boolean isOpenable, String filePath, String mimeType, GURL url,
+            String originalUrl, boolean isOffTheRecord, String otrProfileId,
             @OfflineItemState int state, @FailState int failState, @PendingState int pendingState,
             boolean isResumable, boolean allowMetered, long receivedBytes, long progressValue,
             long progressMax, @OfflineItemProgressUnit int progressUnit, long timeRemainingMs,
diff --git a/components/offline_items_collection/core/android/offline_item_bridge.cc b/components/offline_items_collection/core/android/offline_item_bridge.cc
index f9f685f..0ffd4688 100644
--- a/components/offline_items_collection/core/android/offline_item_bridge.cc
+++ b/components/offline_items_collection/core/android/offline_item_bridge.cc
@@ -6,6 +6,7 @@
 
 #include "base/android/jni_string.h"
 #include "components/offline_items_collection/core/jni_headers/OfflineItemBridge_jni.h"
+#include "url/android/gurl_android.h"
 
 using base::android::ConvertUTF8ToJavaString;
 using base::android::ScopedJavaLocalRef;
@@ -38,7 +39,7 @@
       item.completion_time.ToJavaTime(), item.last_accessed_time.ToJavaTime(),
       item.is_openable, ConvertUTF8ToJavaString(env, item.file_path.value()),
       ConvertUTF8ToJavaString(env, item.mime_type),
-      ConvertUTF8ToJavaString(env, item.url.spec()),
+      url::GURLAndroid::FromNativeGURL(env, item.url),
       ConvertUTF8ToJavaString(env, item.original_url.spec()),
       item.is_off_the_record, ConvertUTF8ToJavaString(env, item.otr_profile_id),
       static_cast<jint>(item.state), static_cast<jint>(item.fail_state),
diff --git a/components/omnibox/browser/BUILD.gn b/components/omnibox/browser/BUILD.gn
index d1b5721..2960519 100644
--- a/components/omnibox/browser/BUILD.gn
+++ b/components/omnibox/browser/BUILD.gn
@@ -133,6 +133,8 @@
     "document_suggestions_service.h",
     "favicon_cache.cc",
     "favicon_cache.h",
+    "history_fuzzy_provider.cc",
+    "history_fuzzy_provider.h",
     "history_match.cc",
     "history_match.h",
     "history_provider.cc",
@@ -551,6 +553,7 @@
     "document_provider_unittest.cc",
     "document_suggestions_service_unittest.cc",
     "favicon_cache_unittest.cc",
+    "history_fuzzy_provider_unittest.cc",
     "history_provider_unittest.cc",
     "history_quick_provider_unittest.cc",
     "history_url_provider_unittest.cc",
diff --git a/components/omnibox/browser/autocomplete_classifier.cc b/components/omnibox/browser/autocomplete_classifier.cc
index d1d8786..e30e39f 100644
--- a/components/omnibox/browser/autocomplete_classifier.cc
+++ b/components/omnibox/browser/autocomplete_classifier.cc
@@ -65,6 +65,9 @@
       AutocompleteProvider::TYPE_SEARCH | AutocompleteProvider::TYPE_SHORTCUTS |
       (query_tiles::features::IsEnabledQueryTilesInOmnibox()
            ? AutocompleteProvider::TYPE_QUERY_TILE
+           : 0) |
+      (OmniboxFieldTrial::IsFuzzyUrlSuggestionsEnabled()
+           ? AutocompleteProvider::TYPE_HISTORY_FUZZY
            : 0);
 }
 
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc
index d1a9d01e..558644f 100644
--- a/components/omnibox/browser/autocomplete_controller.cc
+++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -35,6 +35,7 @@
 #include "components/omnibox/browser/builtin_provider.h"
 #include "components/omnibox/browser/clipboard_provider.h"
 #include "components/omnibox/browser/document_provider.h"
+#include "components/omnibox/browser/history_fuzzy_provider.h"
 #include "components/omnibox/browser/history_quick_provider.h"
 #include "components/omnibox/browser/history_url_provider.h"
 #include "components/omnibox/browser/keyword_provider.h"
@@ -368,6 +369,9 @@
         new VoiceSuggestProvider(provider_client_.get(), this);
     providers_.push_back(voice_suggest_provider_.get());
   }
+  if (provider_types & AutocompleteProvider::TYPE_HISTORY_FUZZY) {
+    providers_.push_back(new HistoryFuzzyProvider(provider_client_.get()));
+  }
 
   base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
       this, "AutocompleteController", base::ThreadTaskRunnerHandle::Get());
diff --git a/components/omnibox/browser/autocomplete_provider.cc b/components/omnibox/browser/autocomplete_provider.cc
index a7721ae..14a3751 100644
--- a/components/omnibox/browser/autocomplete_provider.cc
+++ b/components/omnibox/browser/autocomplete_provider.cc
@@ -67,6 +67,8 @@
       return "VerbatimMatch";
     case TYPE_VOICE_SUGGEST:
       return "VoiceSuggest";
+    case TYPE_HISTORY_FUZZY:
+      return "HistoryFuzzy";
     default:
       NOTREACHED() << "Unhandled AutocompleteProvider::Type " << type;
       return "Unknown";
diff --git a/components/omnibox/browser/autocomplete_provider.h b/components/omnibox/browser/autocomplete_provider.h
index b4b2cde2..b7aa8d1 100644
--- a/components/omnibox/browser/autocomplete_provider.h
+++ b/components/omnibox/browser/autocomplete_provider.h
@@ -168,6 +168,7 @@
     TYPE_MOST_VISITED_SITES = 1 << 13,
     TYPE_VERBATIM_MATCH = 1 << 14,
     TYPE_VOICE_SUGGEST = 1 << 15,
+    TYPE_HISTORY_FUZZY = 1 << 16,
   };
 
   explicit AutocompleteProvider(Type type);
diff --git a/components/omnibox/browser/history_fuzzy_provider.cc b/components/omnibox/browser/history_fuzzy_provider.cc
new file mode 100644
index 0000000..f12af72
--- /dev/null
+++ b/components/omnibox/browser/history_fuzzy_provider.cc
@@ -0,0 +1,49 @@
+// Copyright (c) 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/omnibox/browser/history_fuzzy_provider.h"
+
+#include <vector>
+
+#include "base/check.h"
+#include "base/trace_event/memory_usage_estimator.h"
+#include "base/trace_event/trace_event.h"
+#include "components/omnibox/browser/autocomplete_match_classification.h"
+#include "components/omnibox/browser/autocomplete_match_type.h"
+#include "components/omnibox/browser/autocomplete_provider_client.h"
+#include "components/omnibox/browser/autocomplete_result.h"
+#include "components/search_engines/omnibox_focus_type.h"
+
+HistoryFuzzyProvider::HistoryFuzzyProvider(AutocompleteProviderClient* client)
+    : HistoryProvider(AutocompleteProvider::TYPE_HISTORY_FUZZY, client) {}
+
+void HistoryFuzzyProvider::Start(const AutocompleteInput& input,
+                                 bool minimal_changes) {
+  TRACE_EVENT0("omnibox", "HistoryFuzzyProvider::Start");
+  matches_.clear();
+  if (input.focus_type() != OmniboxFocusType::DEFAULT ||
+      input.type() == metrics::OmniboxInputType::EMPTY) {
+    return;
+  }
+
+  autocomplete_input_ = input;
+
+  DoAutocomplete();
+}
+
+size_t HistoryFuzzyProvider::EstimateMemoryUsage() const {
+  size_t res = HistoryProvider::EstimateMemoryUsage();
+  res += base::trace_event::EstimateMemoryUsage(autocomplete_input_);
+  return res;
+}
+
+HistoryFuzzyProvider::~HistoryFuzzyProvider() = default;
+
+void HistoryFuzzyProvider::DoAutocomplete() {
+  AutocompleteMatch match(this, 10000000, false,
+                          AutocompleteMatchType::HISTORY_URL);
+  match.contents = u"fuzzyurlhere.org";
+  match.contents_class.push_back({0, 0});
+  matches_.push_back(std::move(match));
+}
diff --git a/components/omnibox/browser/history_fuzzy_provider.h b/components/omnibox/browser/history_fuzzy_provider.h
new file mode 100644
index 0000000..c409a3519
--- /dev/null
+++ b/components/omnibox/browser/history_fuzzy_provider.h
@@ -0,0 +1,38 @@
+// Copyright (c) 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_OMNIBOX_BROWSER_HISTORY_FUZZY_PROVIDER_H_
+#define COMPONENTS_OMNIBOX_BROWSER_HISTORY_FUZZY_PROVIDER_H_
+
+#include "components/history/core/browser/history_types.h"
+#include "components/omnibox/browser/autocomplete_input.h"
+#include "components/omnibox/browser/autocomplete_match.h"
+#include "components/omnibox/browser/history_provider.h"
+
+// This class is an autocomplete provider which provides URL results from
+// history for inputs that may match inexactly.
+class HistoryFuzzyProvider : public HistoryProvider {
+ public:
+  explicit HistoryFuzzyProvider(AutocompleteProviderClient* client);
+  HistoryFuzzyProvider(const HistoryFuzzyProvider&) = delete;
+  HistoryFuzzyProvider& operator=(const HistoryFuzzyProvider&) = delete;
+
+  // AutocompleteProvider. `minimal_changes` is ignored since there is no async
+  // completion performed.
+  void Start(const AutocompleteInput& input, bool minimal_changes) override;
+
+  // Estimates dynamic memory usage.
+  // See base/trace_event/memory_usage_estimator.h for more info.
+  size_t EstimateMemoryUsage() const override;
+
+ private:
+  ~HistoryFuzzyProvider() override;
+
+  // Performs the autocomplete matching and scoring.
+  void DoAutocomplete();
+
+  AutocompleteInput autocomplete_input_;
+};
+
+#endif  // COMPONENTS_OMNIBOX_BROWSER_HISTORY_FUZZY_PROVIDER_H_
diff --git a/components/omnibox/browser/history_fuzzy_provider_unittest.cc b/components/omnibox/browser/history_fuzzy_provider_unittest.cc
new file mode 100644
index 0000000..78190ac
--- /dev/null
+++ b/components/omnibox/browser/history_fuzzy_provider_unittest.cc
@@ -0,0 +1,18 @@
+// Copyright (c) 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/omnibox/browser/history_fuzzy_provider.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+class HistoryFuzzyProviderTest : public testing::Test {
+ public:
+  HistoryFuzzyProviderTest() = default;
+  HistoryFuzzyProviderTest(const HistoryFuzzyProviderTest&) = delete;
+  HistoryFuzzyProviderTest& operator=(const HistoryFuzzyProviderTest&) = delete;
+
+  void SetUp() override {}
+};
+
+TEST_F(HistoryFuzzyProviderTest, TestRuns) {}
diff --git a/components/pdf/browser/BUILD.gn b/components/pdf/browser/BUILD.gn
index 5a9998a..efb4108 100644
--- a/components/pdf/browser/BUILD.gn
+++ b/components/pdf/browser/BUILD.gn
@@ -17,7 +17,6 @@
   deps = [
     "//base",
     "//content/public/browser",
-    "//pdf:features",
     "//ui/base",
     "//ui/touch_selection",
   ]
diff --git a/components/pdf/browser/pdf_web_contents_helper.cc b/components/pdf/browser/pdf_web_contents_helper.cc
index e631fe4..26a4f75 100644
--- a/components/pdf/browser/pdf_web_contents_helper.cc
+++ b/components/pdf/browser/pdf_web_contents_helper.cc
@@ -6,15 +6,12 @@
 
 #include <utility>
 
-#include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "base/notreached.h"
 #include "components/pdf/browser/pdf_web_contents_helper_client.h"
 #include "content/public/browser/render_widget_host.h"
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/common/referrer_type_converters.h"
-#include "pdf/pdf_features.h"
-#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "ui/base/pointer/touch_editing_controller.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/gfx/geometry/point_conversions.h"
@@ -123,21 +120,6 @@
   client_->SetPluginCanSave(&GetWebContents(), can_save);
 }
 
-void PDFWebContentsHelper::GetPdfFindInPage(GetPdfFindInPageCallback callback) {
-  if (!base::FeatureList::IsEnabled(chrome_pdf::features::kPdfUnseasoned)) {
-    NOTREACHED();
-    return;
-  }
-
-  if (!find_factory_remote_) {
-    GetWebContents()
-        .GetMainFrame()
-        ->GetRemoteAssociatedInterfaces()
-        ->GetInterface(&find_factory_remote_);
-  }
-  find_factory_remote_->GetPdfFindInPage(std::move(callback));
-}
-
 void PDFWebContentsHelper::DidScroll() {
   if (!touch_selection_controller_client_manager_)
     InitTouchSelectionClientManager();
diff --git a/components/pdf/browser/pdf_web_contents_helper.h b/components/pdf/browser/pdf_web_contents_helper.h
index f7b8ae9a..a799667 100644
--- a/components/pdf/browser/pdf_web_contents_helper.h
+++ b/components/pdf/browser/pdf_web_contents_helper.h
@@ -12,7 +12,6 @@
 #include "content/public/browser/render_widget_host_observer.h"
 #include "content/public/browser/touch_selection_controller_client_manager.h"
 #include "content/public/browser/web_contents_user_data.h"
-#include "mojo/public/cpp/bindings/associated_remote.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "pdf/mojom/pdf.mojom.h"
@@ -90,7 +89,6 @@
                         const gfx::PointF& right,
                         int32_t right_height) override;
   void SetPluginCanSave(bool can_save) override;
-  void GetPdfFindInPage(GetPdfFindInPageCallback callback) override;
 
  private:
   friend class content::WebContentsUserData<PDFWebContentsHelper>;
@@ -123,8 +121,6 @@
 
   mojo::Remote<mojom::PdfListener> remote_pdf_client_;
 
-  mojo::AssociatedRemote<mojom::PdfFindInPageFactory> find_factory_remote_;
-
   WEB_CONTENTS_USER_DATA_KEY_DECL();
 };
 
diff --git a/components/pdf/renderer/BUILD.gn b/components/pdf/renderer/BUILD.gn
index dea1e9b..d61e395a 100644
--- a/components/pdf/renderer/BUILD.gn
+++ b/components/pdf/renderer/BUILD.gn
@@ -14,7 +14,6 @@
     "internal_plugin_renderer_helpers.h",
     "pdf_accessibility_tree.h",
     "pdf_ax_action_target.h",
-    "pdf_find_in_page.h",
     "pdf_internal_plugin_delegate.h",
     "pepper_pdf_host.h",
   ]
@@ -23,7 +22,6 @@
     "internal_plugin_renderer_helpers.cc",
     "pdf_accessibility_tree.cc",
     "pdf_ax_action_target.cc",
-    "pdf_find_in_page.cc",
     "pdf_internal_plugin_delegate.cc",
     "pdf_view_web_plugin_client.cc",
     "pdf_view_web_plugin_client.h",
diff --git a/components/pdf/renderer/pdf_find_in_page.cc b/components/pdf/renderer/pdf_find_in_page.cc
deleted file mode 100644
index 174e75c..0000000
--- a/components/pdf/renderer/pdf_find_in_page.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/pdf/renderer/pdf_find_in_page.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/check.h"
-#include "base/feature_list.h"
-#include "content/public/renderer/render_frame.h"
-#include "content/public/renderer/render_frame_observer.h"
-#include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "mojo/public/cpp/bindings/receiver.h"
-#include "pdf/pdf_features.h"
-#include "third_party/blink/public/platform/web_vector.h"
-#include "third_party/blink/public/web/web_document.h"
-#include "third_party/blink/public/web/web_element.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-#include "third_party/blink/public/web/web_node.h"
-
-namespace {
-
-blink::WebElement FindPdfViewerScroller(const blink::WebLocalFrame* frame) {
-  blink::WebElement viewer = frame->GetDocument().GetElementById("viewer");
-  if (viewer.IsNull())
-    return blink::WebElement();
-
-  blink::WebNode shadow_root = viewer.ShadowRoot();
-  if (shadow_root.IsNull())
-    return blink::WebElement();
-
-  blink::WebElement plugin = shadow_root.QuerySelector("#plugin");
-  if (plugin.IsNull() || !plugin.HasAttribute("pdf-viewer-update-enabled"))
-    return blink::WebElement();
-
-  return shadow_root.QuerySelector("#scroller");
-}
-
-}  // namespace
-
-namespace pdf {
-
-// static
-void PdfFindInPageFactory::BindReceiver(
-    int32_t routing_id,
-    mojo::PendingAssociatedReceiver<pdf::mojom::PdfFindInPageFactory>
-        receiver) {
-  DCHECK(base::FeatureList::IsEnabled(chrome_pdf::features::kPdfUnseasoned));
-
-  auto* render_frame = content::RenderFrame::FromRoutingID(routing_id);
-  if (!render_frame)
-    return;
-
-  // PdfFindInPageFactory is self deleting.
-  new PdfFindInPageFactory(render_frame, std::move(receiver));
-}
-
-void PdfFindInPageFactory::OnDestruct() {
-  delete this;
-}
-
-void PdfFindInPageFactory::GetPdfFindInPage(GetPdfFindInPageCallback callback) {
-  mojo::PendingReceiver<pdf::mojom::PdfFindInPage> pending_receiver;
-  auto pending_remote = pending_receiver.InitWithNewPipeAndPassRemote();
-  find_in_page_ = std::make_unique<FindInPageImpl>(render_frame(),
-                                                   std::move(pending_receiver));
-  std::move(callback).Run(std::move(pending_remote));
-}
-
-PdfFindInPageFactory::PdfFindInPageFactory(
-    content::RenderFrame* render_frame,
-    mojo::PendingAssociatedReceiver<pdf::mojom::PdfFindInPageFactory> receiver)
-    : content::RenderFrameObserver(render_frame),
-      receiver_(this, std::move(receiver)) {}
-
-PdfFindInPageFactory::~PdfFindInPageFactory() = default;
-
-class PdfFindInPageFactory::FindInPageImpl : public pdf::mojom::PdfFindInPage {
- public:
-  FindInPageImpl(
-      content::RenderFrame* render_frame,
-      mojo::PendingReceiver<pdf::mojom::PdfFindInPage> pending_receiver)
-      : render_frame_(render_frame),
-        receiver_(this, std::move(pending_receiver)) {}
-
-  FindInPageImpl(const FindInPageImpl&) = delete;
-  FindInPageImpl& operator=(const FindInPageImpl&) = delete;
-
-  ~FindInPageImpl() override = default;
-
-  // pdf::mojom::PdfFindInPage:
-  void SetTickmarks(const std::vector<gfx::Rect>& tickmarks) override {
-    blink::WebVector<gfx::Rect> tickmarks_converted(tickmarks);
-    blink::WebLocalFrame* frame = render_frame_->GetWebFrame();
-    blink::WebElement target = FindPdfViewerScroller(frame);
-    frame->SetTickmarks(target, tickmarks_converted);
-  }
-
- private:
-  content::RenderFrame* const render_frame_;
-  mojo::Receiver<pdf::mojom::PdfFindInPage> receiver_;
-};
-
-}  // namespace pdf
diff --git a/components/pdf/renderer/pdf_find_in_page.h b/components/pdf/renderer/pdf_find_in_page.h
deleted file mode 100644
index 12fb253..0000000
--- a/components/pdf/renderer/pdf_find_in_page.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_PDF_RENDERER_PDF_FIND_IN_PAGE_H_
-#define COMPONENTS_PDF_RENDERER_PDF_FIND_IN_PAGE_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "content/public/renderer/render_frame_observer.h"
-#include "mojo/public/cpp/bindings/associated_receiver.h"
-#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
-#include "pdf/mojom/pdf.mojom.h"
-
-namespace content {
-class RenderFrame;
-}
-
-namespace pdf {
-
-// Facilitates find-in-page IPCs from PDF renderer to PDF extension.
-// Has the same lifetime as the RenderFrame it is associated with.
-class PdfFindInPageFactory : public content::RenderFrameObserver,
-                             public pdf::mojom::PdfFindInPageFactory {
- public:
-  static void BindReceiver(
-      int32_t routing_id,
-      mojo::PendingAssociatedReceiver<pdf::mojom::PdfFindInPageFactory>
-          receiver);
-
-  PdfFindInPageFactory(const PdfFindInPageFactory&) = delete;
-  PdfFindInPageFactory& operator=(const PdfFindInPageFactory&) = delete;
-
-  // content::RenderFrameObserver:
-  void OnDestruct() override;
-
-  // pdf::mojom::PdfFindInPageFactory:
-  void GetPdfFindInPage(GetPdfFindInPageCallback callback) override;
-
- private:
-  class FindInPageImpl;
-
-  // Self deleting.
-  PdfFindInPageFactory(
-      content::RenderFrame* render_frame,
-      mojo::PendingAssociatedReceiver<pdf::mojom::PdfFindInPageFactory>
-          receiver);
-  ~PdfFindInPageFactory() override;
-
-  std::unique_ptr<FindInPageImpl> find_in_page_;
-  mojo::AssociatedReceiver<pdf::mojom::PdfFindInPageFactory> receiver_;
-};
-
-}  // namespace pdf
-
-#endif  // COMPONENTS_PDF_RENDERER_PDF_FIND_IN_PAGE_H_
diff --git a/components/policy/core/common/policy_pref_names.cc b/components/policy/core/common/policy_pref_names.cc
index 23580cb..8fc4f6e 100644
--- a/components/policy/core/common/policy_pref_names.cc
+++ b/components/policy/core/common/policy_pref_names.cc
@@ -81,5 +81,13 @@
 const char kUserAgentClientHintsGREASEUpdateEnabled[] =
     "policy.user_agent_client_hints_grease_update_enabled";
 
+// A boolean indicating whether the window-placement permission is automatically
+// granted for all sites by enterprise policy. If true, the permission is
+// automatically enabled for sites.  If false, sites behave as default with
+// users choosing to enable this permission if they want.  When this permission
+// is enabled, sites can use information about screens to open and place
+// windows.
+const char kWindowPlacementAlwaysAllowed[] = "window_placement_always_allowed";
+
 }  // namespace policy_prefs
 }  // namespace policy
diff --git a/components/policy/core/common/policy_pref_names.h b/components/policy/core/common/policy_pref_names.h
index 4c68209..a73af9d 100644
--- a/components/policy/core/common/policy_pref_names.h
+++ b/components/policy/core/common/policy_pref_names.h
@@ -30,6 +30,7 @@
 POLICY_EXPORT extern const char kBackForwardCacheEnabled[];
 #endif  // BUILDFLAG(IS_ANDROID)
 POLICY_EXPORT extern const char kWebSQLInThirdPartyContextEnabled[];
+POLICY_EXPORT extern const char kWindowPlacementAlwaysAllowed[];
 
 }  // namespace policy_prefs
 }  // namespace policy
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 8ef4ff2..ea80441a 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -15726,9 +15726,10 @@
     {
       'name': 'DataCompressionProxyEnabled',
       'owners': ['bolian@chromium.org', 'pmarko@chromium.org'],
+      'deprecated': True,
       'type': 'main',
       'schema': { 'type': 'boolean' },
-      'supported_on': ['android:31-'],
+      'supported_on': ['android:31-99'],
       'features': {
         'dynamic_refresh': True,
         'per_profile': True,
@@ -29607,6 +29608,36 @@
        If the policy is disabled or not set, user storage encryption for <ph name="DM_CRYPT">dm-crypt</ph> user homes will default to using <ph name="AES_NI_NAME">AESNI</ph>.''',
     },
     {
+      'name': 'WindowPlacementAlwaysAllowed',
+      'owners': ['msw@google.com', 'enne@google.com'],
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'tags': [],
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': True,
+      },
+      'items': [
+        {
+          'value': True,
+          'caption': 'Allow all sites to use info about screens to open and place windows',
+        },
+        {
+          'value': False,
+          'caption': 'Allow users to choose which sites can use info about screens to open and place windows',
+        },
+      ],
+      'device_only': False,
+      'default': False,
+      'supported_on': ['chrome.*:100-', 'chrome_os:100-'],
+      'id': 951,
+      'caption': '''Enable window placement permission on all sites''',
+      'example_value': False,
+      'desc': '''When this policy is set to Enabled, the window placement permission is automatically granted for all sites.
+      This will allow sites to see and use information about connected screens to open and place windows.
+      If not set or Disabled, this policy will follow the browser's defaults and allow users to choose this permission per site.''',
+    },
+    {
       'name': 'DeviceRunAutomaticCleanupOnLogin',
       'owners': ['vsavu@google.com'],
       'type': 'main',
@@ -30704,6 +30735,6 @@
   'placeholders': [],
   'deleted_policy_ids': [114, 115, 204, 205, 206, 341, 412, 476, 544, 546, 562, 569, 578, 583, 585, 586, 587, 588, 589, 590, 591, 600, 668, 669, 872],
   'deleted_atomic_policy_group_ids': [19],
-  'highest_id_currently_used': 950,
+  'highest_id_currently_used': 951,
   'highest_atomic_group_id_currently_used': 41
 }
diff --git a/components/sessions/core/tab_restore_service_helper.cc b/components/sessions/core/tab_restore_service_helper.cc
index 3de954e..f52e0da 100644
--- a/components/sessions/core/tab_restore_service_helper.cc
+++ b/components/sessions/core/tab_restore_service_helper.cc
@@ -485,9 +485,10 @@
       auto& window = static_cast<Window&>(entry);
 
       // When restoring a window, either the entire window can be restored, or a
-      // single tab within it. If the entry's ID matches the one to restore,
-      // then the entire window will be restored.
-      if (entry_id_matches_restore_id) {
+      // single tab within it. If the entry's ID matches the one to restore, or
+      // the entry corresponds to an application, then the entire window will be
+      // restored.
+      if (entry_id_matches_restore_id || !window.app_name.empty()) {
         context = client_->CreateLiveTabContext(
             window.app_name, window.bounds, window.show_state, window.workspace,
             window.user_title, window.extra_data);
diff --git a/components/signin/internal/identity_manager/profile_oauth2_token_service.cc b/components/signin/internal/identity_manager/profile_oauth2_token_service.cc
index b554cd39..a98fecb0 100644
--- a/components/signin/internal/identity_manager/profile_oauth2_token_service.cc
+++ b/components/signin/internal/identity_manager/profile_oauth2_token_service.cc
@@ -58,8 +58,8 @@
       return "DiceResponseHandler::Signin";
     case SourceForRefreshTokenOperation::kDiceResponseHandler_Signout:
       return "DiceResponseHandler::Signout";
-    case SourceForRefreshTokenOperation::kDiceTurnOnSyncHelper_Abort:
-      return "DiceTurnOnSyncHelper::Abort";
+    case SourceForRefreshTokenOperation::kTurnOnSyncHelper_Abort:
+      return "TurnOnSyncHelper::Abort";
     case SourceForRefreshTokenOperation::kMachineLogon_CredentialProvider:
       return "MachineLogon::CredentialProvider";
     case SourceForRefreshTokenOperation::kTokenService_ExtractCredentials:
diff --git a/components/signin/public/base/signin_metrics.h b/components/signin/public/base/signin_metrics.h
index 21f8683..306da1f 100644
--- a/components/signin/public/base/signin_metrics.h
+++ b/components/signin/public/base/signin_metrics.h
@@ -405,7 +405,7 @@
   kAccountReconcilor_Reconcile = 12,
   kDiceResponseHandler_Signin = 13,
   kDiceResponseHandler_Signout = 14,
-  kDiceTurnOnSyncHelper_Abort = 15,
+  kTurnOnSyncHelper_Abort = 15,
   kMachineLogon_CredentialProvider = 16,
   kTokenService_ExtractCredentials = 17,
   // DEPRECATED on 09/2021 (used for force migration to DICE)
diff --git a/components/translate/ios/browser/ios_translate_driver.h b/components/translate/ios/browser/ios_translate_driver.h
index 58c1c62..6bf85be 100644
--- a/components/translate/ios/browser/ios_translate_driver.h
+++ b/components/translate/ios/browser/ios_translate_driver.h
@@ -16,7 +16,6 @@
 #include "ios/web/public/web_state_observer.h"
 
 namespace web {
-class NavigationManager;
 class WebState;
 }
 
@@ -32,7 +31,6 @@
       public language::IOSLanguageDetectionTabHelper::Observer {
  public:
   IOSTranslateDriver(web::WebState* web_state,
-                     web::NavigationManager* navigation_manager,
                      TranslateManager* translate_manager);
 
   IOSTranslateDriver(const IOSTranslateDriver&) = delete;
@@ -105,9 +103,6 @@
   // The WebState this instance is observing.
   web::WebState* web_state_ = nullptr;
 
-  // The navigation manager of the tab we are associated with.
-  web::NavigationManager* navigation_manager_;
-
   base::WeakPtr<TranslateManager> translate_manager_;
   std::unique_ptr<TranslateController> translate_controller_;
   std::unique_ptr<LanguageDetectionController> language_detection_controller_;
diff --git a/components/translate/ios/browser/ios_translate_driver.mm b/components/translate/ios/browser/ios_translate_driver.mm
index 602574a..9365f96 100644
--- a/components/translate/ios/browser/ios_translate_driver.mm
+++ b/components/translate/ios/browser/ios_translate_driver.mm
@@ -40,16 +40,12 @@
 
 }  // namespace
 
-IOSTranslateDriver::IOSTranslateDriver(
-    web::WebState* web_state,
-    web::NavigationManager* navigation_manager,
-    TranslateManager* translate_manager)
+IOSTranslateDriver::IOSTranslateDriver(web::WebState* web_state,
+                                       TranslateManager* translate_manager)
     : web_state_(web_state),
-      navigation_manager_(navigation_manager),
       translate_manager_(translate_manager->GetWeakPtr()),
       page_seq_no_(0),
       pending_page_seq_no_(0) {
-  DCHECK(navigation_manager_);
   DCHECK(translate_manager_);
   DCHECK(web_state_);
 
@@ -132,10 +128,12 @@
 // TranslateDriver methods
 
 bool IOSTranslateDriver::IsLinkNavigation() {
-  return navigation_manager_->GetVisibleItem() &&
-         ui::PageTransitionCoreTypeIs(
-             navigation_manager_->GetVisibleItem()->GetTransitionType(),
-             ui::PAGE_TRANSITION_LINK);
+  DCHECK(web_state_->IsRealized());
+  web::NavigationItem* visible_item =
+      web_state_->GetNavigationManager()->GetVisibleItem();
+  return visible_item &&
+         ui::PageTransitionCoreTypeIs(visible_item->GetTransitionType(),
+                                      ui::PAGE_TRANSITION_LINK);
 }
 
 void IOSTranslateDriver::OnTranslateEnabledChanged() {
@@ -163,7 +161,7 @@
 }
 
 bool IOSTranslateDriver::IsIncognito() {
-  return navigation_manager_->GetBrowserState()->IsOffTheRecord();
+  return web_state_->GetBrowserState()->IsOffTheRecord();
 }
 
 const std::string& IOSTranslateDriver::GetContentsMimeType() {
@@ -183,7 +181,8 @@
 }
 
 bool IOSTranslateDriver::HasCurrentPage() {
-  return (navigation_manager_->GetVisibleItem() != nullptr);
+  DCHECK(web_state_->IsRealized());
+  return (web_state_->GetNavigationManager()->GetVisibleItem() != nullptr);
 }
 
 void IOSTranslateDriver::OpenUrlInNewTab(const GURL& url) {
diff --git a/components/user_manager/known_user.cc b/components/user_manager/known_user.cc
index dd56419..75f4ae2 100644
--- a/components/user_manager/known_user.cc
+++ b/components/user_manager/known_user.cc
@@ -904,14 +904,6 @@
   return KnownUser(local_state).GetKnownAccountIds();
 }
 
-void SaveKnownUser(const AccountId& account_id) {
-  PrefService* local_state = GetLocalStateLegacy();
-  // Local State may not be initialized in tests.
-  if (!local_state)
-    return;
-  return KnownUser(local_state).SaveKnownUser(account_id);
-}
-
 void UpdateId(const AccountId& account_id) {
   PrefService* local_state = GetLocalStateLegacy();
   // Local State may not be initialized in tests.
@@ -1030,23 +1022,6 @@
   return KnownUser(local_state).FindReauthReason(account_id, out_value);
 }
 
-void SetChallengeResponseKeys(const AccountId& account_id, base::Value value) {
-  PrefService* local_state = GetLocalStateLegacy();
-  // Local State may not be initialized in tests.
-  if (!local_state)
-    return;
-  return KnownUser(local_state)
-      .SetChallengeResponseKeys(account_id, std::move(value));
-}
-
-base::Value GetChallengeResponseKeys(const AccountId& account_id) {
-  PrefService* local_state = GetLocalStateLegacy();
-  // Local State may not be initialized in tests.
-  if (!local_state)
-    return base::Value();
-  return KnownUser(local_state).GetChallengeResponseKeys(account_id);
-}
-
 void SetLastOnlineSignin(const AccountId& account_id, base::Time time) {
   PrefService* local_state = GetLocalStateLegacy();
   // Local State may not be initialized in tests.
diff --git a/components/user_manager/known_user.h b/components/user_manager/known_user.h
index cfc8499bb..bb8c0cb3 100644
--- a/components/user_manager/known_user.h
+++ b/components/user_manager/known_user.h
@@ -342,14 +342,6 @@
                                            const std::string& id,
                                            const AccountType& account_type);
 
-// Saves |account_id| into known users. Tries to commit the change on disk. Use
-// only if account_id is not yet in the known user list. Important if Chrome
-// crashes shortly after starting a session. Cryptohome should be able to find
-// known account_id on Chrome restart.
-// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::SaveKnownUser
-// instead.
-void USER_MANAGER_EXPORT SaveKnownUser(const AccountId& account_id);
-
 // Updates |account_id.account_type_| and |account_id.GetGaiaId()| or
 // |account_id.GetObjGuid()| for user with |account_id|.
 // TODO(https://crbug.com/1150434): Deprecated, use KnownUser::UpdateId instead.
@@ -437,21 +429,6 @@
 bool USER_MANAGER_EXPORT FindReauthReason(const AccountId& account_id,
                                           int* out_value);
 
-// Setter and getter for the information about challenge-response keys that can
-// be used by this user to authenticate.
-// The getter returns a null value when the property isn't present.
-// For the format of the value, refer to
-// ash/components/login/auth/challenge_response/known_user_pref_utils.h.
-// TODO(https://crbug.com/1150434): Deprecated, use
-// KnownUser::SetChallengeResponseKeys instead.
-void USER_MANAGER_EXPORT SetChallengeResponseKeys(const AccountId& account_id,
-                                                  base::Value value);
-
-// TODO(https://crbug.com/1150434): Deprecated, use
-// KnownUser::GetChallengeResponseKeys instead.
-base::Value USER_MANAGER_EXPORT
-GetChallengeResponseKeys(const AccountId& account_id);
-
 // TODO(https://crbug.com/1150434): Deprecated, use
 // KnownUser::SetLastOnlineSignin instead.
 void USER_MANAGER_EXPORT SetLastOnlineSignin(const AccountId& account_id,
diff --git a/components/viz/service/display/surface_aggregator.cc b/components/viz/service/display/surface_aggregator.cc
index f2dab17f..4d0da565 100644
--- a/components/viz/service/display/surface_aggregator.cc
+++ b/components/viz/service/display/surface_aggregator.cc
@@ -1032,41 +1032,19 @@
     return;
   CHECK(root_render_pass->transform_to_root_target == gfx::Transform());
 
-  if (!color_conversion_render_pass_id_)
+  if (!color_conversion_render_pass_id_) {
     color_conversion_render_pass_id_ =
         render_pass_id_generator_.GenerateNextId();
+  }
 
-  auto color_conversion_pass = std::make_unique<AggregatedRenderPass>(1, 1);
-  color_conversion_pass->SetNew(color_conversion_render_pass_id_, output_rect,
-                                root_render_pass->damage_rect,
-                                root_render_pass->transform_to_root_target);
-  color_conversion_pass->has_transparent_background =
-      root_render_pass->has_transparent_background;
-  color_conversion_pass->content_color_usage = root_content_color_usage_;
-  color_conversion_pass->is_color_conversion_pass = true;
-
-  auto* shared_quad_state =
-      color_conversion_pass->CreateAndAppendSharedQuadState();
-  // Do NOT set blend mode here to SkBlendMode::kSrcOver, which will cause
-  // blending with empty (black) root pass when child pass has alpha.
-  shared_quad_state->SetAll(
-      /*quad_to_target_transform=*/gfx::Transform(),
-      /*quad_layer_rect=*/output_rect,
-      /*visible_layer_rect=*/output_rect,
-      /*mask_filter_info=*/gfx::MaskFilterInfo(),
-      /*clip_rect=*/absl::nullopt, /*are_contents_opaque=*/false,
-      /*opacity=*/1.f,
-      /*blend_mode=*/SkBlendMode::kSrc, /*sorting_context_id=*/0);
-
-  auto* quad = color_conversion_pass
-                   ->CreateAndAppendDrawQuad<AggregatedRenderPassDrawQuad>();
-  quad->SetNew(shared_quad_state, output_rect, output_rect,
-               root_render_pass->id, kInvalidResourceId, gfx::RectF(),
-               gfx::Size(), gfx::Vector2dF(), gfx::PointF(),
-               gfx::RectF(output_rect),
-               /*force_anti_aliasing_off=*/false,
-               /*backdrop_filter_quality*/ 1.0f);
-  dest_pass_list_->push_back(std::move(color_conversion_pass));
+  AddRenderPassHelper(output_rect, color_conversion_render_pass_id_,
+                      output_rect, root_render_pass->damage_rect,
+                      root_content_color_usage_,
+                      root_render_pass->has_transparent_background,
+                      /*pass_is_color_conversion_pass=*/true,
+                      /*quad_state_to_target_transform=*/gfx::Transform(),
+                      /*quad_state_contents_opaque=*/false, SkBlendMode::kSrc,
+                      root_render_pass->id);
 }
 
 void SurfaceAggregator::AddDisplayTransformPass() {
@@ -1074,29 +1052,12 @@
     return;
 
   auto* root_render_pass = dest_pass_list_->back().get();
-  gfx::Rect output_rect = root_render_pass->output_rect;
   DCHECK(root_render_pass->transform_to_root_target == root_surface_transform_);
 
-  if (!display_transform_render_pass_id_)
+  if (!display_transform_render_pass_id_) {
     display_transform_render_pass_id_ =
         render_pass_id_generator_.GenerateNextId();
-
-  auto display_transform_pass = std::make_unique<AggregatedRenderPass>(1, 1);
-  display_transform_pass->SetAll(
-      display_transform_render_pass_id_,
-      cc::MathUtil::MapEnclosedRectWith2dAxisAlignedTransform(
-          root_surface_transform_, root_render_pass->output_rect),
-      cc::MathUtil::MapEnclosedRectWith2dAxisAlignedTransform(
-          root_surface_transform_, root_render_pass->damage_rect),
-      gfx::Transform(),
-      /*filters=*/cc::FilterOperations(),
-      /*backdrop_filters=*/cc::FilterOperations(),
-      /*backdrop_filter_bounds=*/gfx::RRectF(),
-      root_render_pass->content_color_usage,
-      root_render_pass->has_transparent_background,
-      /*cache_render_pass=*/false,
-      /*has_damage_from_contributing_content=*/false,
-      /*generate_mipmap=*/false);
+  }
 
   bool are_contents_opaque = true;
   for (const auto* sqs : root_render_pass->shared_quad_state_list) {
@@ -1106,25 +1067,58 @@
     }
   }
 
-  auto* shared_quad_state =
-      display_transform_pass->CreateAndAppendSharedQuadState();
-  shared_quad_state->SetAll(
-      /*quad_to_target_transform=*/root_surface_transform_,
-      /*quad_layer_rect=*/output_rect,
-      /*visible_layer_rect=*/output_rect,
-      /*mask_filter_info=*/gfx::MaskFilterInfo(),
-      /*clip_rect=*/absl::nullopt, are_contents_opaque, /*opacity=*/1.f,
-      /*blend_mode=*/SkBlendMode::kSrcOver, /*sorting_context_id=*/0);
+  AddRenderPassHelper(
+      root_render_pass->output_rect, display_transform_render_pass_id_,
+      cc::MathUtil::MapEnclosedRectWith2dAxisAlignedTransform(
+          root_surface_transform_, root_render_pass->output_rect),
+      cc::MathUtil::MapEnclosedRectWith2dAxisAlignedTransform(
+          root_surface_transform_, root_render_pass->damage_rect),
+      root_render_pass->content_color_usage,
+      root_render_pass->has_transparent_background,
+      /*pass_is_color_conversion_pass=*/false, root_surface_transform_,
+      are_contents_opaque, SkBlendMode::kSrcOver, root_render_pass->id);
+}
 
-  auto* quad = display_transform_pass
-                   ->CreateAndAppendDrawQuad<AggregatedRenderPassDrawQuad>();
-  quad->SetNew(shared_quad_state, output_rect, output_rect,
-               root_render_pass->id, kInvalidResourceId, gfx::RectF(),
-               gfx::Size(), gfx::Vector2dF(), gfx::PointF(),
-               gfx::RectF(output_rect),
+void SurfaceAggregator::AddRenderPassHelper(
+    const gfx::Rect& output_rect,
+    AggregatedRenderPassId render_pass_id,
+    const gfx::Rect& render_pass_output_rect,
+    const gfx::Rect& pass_damage_rect,
+    gfx::ContentColorUsage pass_color_usage,
+    bool pass_has_transparent_background,
+    bool pass_is_color_conversion_pass,
+    const gfx::Transform& quad_state_to_target_transform,
+    bool quad_state_contents_opaque,
+    SkBlendMode quad_state_blend_mode,
+    AggregatedRenderPassId quad_pass_id) {
+  auto render_pass = std::make_unique<AggregatedRenderPass>(1, 1);
+  render_pass->SetAll(render_pass_id, output_rect, pass_damage_rect,
+                      gfx::Transform(),
+                      /*filters=*/cc::FilterOperations(),
+                      /*backdrop_filters=*/cc::FilterOperations(),
+                      /*backdrop_filter_bounds=*/gfx::RRectF(),
+                      pass_color_usage, pass_has_transparent_background,
+                      /*cache_render_pass=*/false,
+                      /*has_damage_from_contributing_content=*/false,
+                      /*generate_mipmap=*/false);
+  render_pass->is_color_conversion_pass = pass_is_color_conversion_pass;
+
+  auto* shared_quad_state = render_pass->CreateAndAppendSharedQuadState();
+  shared_quad_state->SetAll(
+      quad_state_to_target_transform,
+      /*layer_rect=*/output_rect,
+      /*visible_layer_rect=*/output_rect, gfx::MaskFilterInfo(),
+      /*clip=*/absl::nullopt, quad_state_contents_opaque, /*opacity_f=*/1.f,
+      quad_state_blend_mode, /*sorting_context=*/0);
+
+  auto* quad =
+      render_pass->CreateAndAppendDrawQuad<AggregatedRenderPassDrawQuad>();
+  quad->SetNew(shared_quad_state, output_rect, output_rect, quad_pass_id,
+               kInvalidResourceId, gfx::RectF(), gfx::Size(), gfx::Vector2dF(),
+               gfx::PointF(), gfx::RectF(output_rect),
                /*force_anti_aliasing_off=*/false,
                /*backdrop_filter_quality*/ 1.0f);
-  dest_pass_list_->push_back(std::move(display_transform_pass));
+  dest_pass_list_->push_back(std::move(render_pass));
 }
 
 void SurfaceAggregator::CopyQuadsToPass(
diff --git a/components/viz/service/display/surface_aggregator.h b/components/viz/service/display/surface_aggregator.h
index df39314..295a658 100644
--- a/components/viz/service/display/surface_aggregator.h
+++ b/components/viz/service/display/surface_aggregator.h
@@ -241,6 +241,17 @@
   void CopyPasses(const ResolvedFrameData& resolved_frame);
   void AddColorConversionPass();
   void AddDisplayTransformPass();
+  void AddRenderPassHelper(const gfx::Rect& output_rect,
+                           AggregatedRenderPassId render_pass_id,
+                           const gfx::Rect& render_pass_output_rect,
+                           const gfx::Rect& pass_damage_rect,
+                           gfx::ContentColorUsage pass_color_usage,
+                           bool pass_has_transparent_background,
+                           bool pass_is_color_conversion_pass,
+                           const gfx::Transform& quad_state_to_target_transform,
+                           bool quad_state_contents_opaque,
+                           SkBlendMode quad_state_blend_mode,
+                           AggregatedRenderPassId quad_pass_id);
 
   // Remove Surfaces that were referenced before but aren't currently
   // referenced from the ResourceProvider.
diff --git a/components/webapps/browser/android/webapk/webapk_proto_builder.cc b/components/webapps/browser/android/webapk/webapk_proto_builder.cc
index 269a6d1..fca8a801 100644
--- a/components/webapps/browser/android/webapk/webapk_proto_builder.cc
+++ b/components/webapps/browser/android/webapk/webapk_proto_builder.cc
@@ -18,7 +18,6 @@
 #include "components/webapps/browser/android/webapk/webapk_types.h"
 #include "third_party/blink/public/common/manifest/manifest_util.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
-#include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/android/color_utils_android.h"
 #include "ui/gfx/codec/png_codec.h"
 
@@ -87,19 +86,13 @@
 #endif
 }
 
-void SetImageData(webapk::Image* image, const SkBitmap& icon) {
-  std::vector<unsigned char> png_bytes;
-  gfx::PNGCodec::EncodeBGRASkBitmap(icon, false, &png_bytes);
-  image->set_image_data(png_bytes.data(), png_bytes.size());
-}
-
 }  // namespace
 
 std::unique_ptr<std::string> BuildProtoInBackground(
     const webapps::ShortcutInfo& shortcut_info,
-    const SkBitmap& primary_icon,
+    const std::string& primary_icon_data,
     bool is_primary_icon_maskable,
-    const SkBitmap& splash_icon,
+    const std::string& splash_icon_data,
     const std::string& package_name,
     const std::string& version,
     std::map<std::string, WebApkIconHasher::Icon> icon_url_to_murmur2_hash,
@@ -173,7 +166,7 @@
   if (shortcut_info.best_primary_icon_url.is_empty()) {
     // Update when web manifest is no longer available.
     webapk::Image* best_primary_icon_image = web_app_manifest->add_icons();
-    SetImageData(best_primary_icon_image, primary_icon);
+    best_primary_icon_image->set_image_data(primary_icon_data);
     best_primary_icon_image->add_usages(webapk::Image::PRIMARY_ICON);
     if (is_primary_icon_maskable) {
       best_primary_icon_image->add_purposes(webapk::Image::MASKABLE);
@@ -181,9 +174,9 @@
       best_primary_icon_image->add_purposes(webapk::Image::ANY);
     }
 
-    if (!splash_icon.drawsNothing()) {
+    if (!splash_icon_data.empty()) {
       webapk::Image* splash_icon_image = web_app_manifest->add_icons();
-      SetImageData(splash_icon_image, splash_icon);
+      splash_icon_image->set_image_data(splash_icon_data);
       splash_icon_image->add_usages(webapk::Image::SPLASH_ICON);
       if (shortcut_info.is_splash_image_maskable) {
         splash_icon_image->add_purposes(webapk::Image::MASKABLE);
@@ -201,7 +194,11 @@
       image->set_hash(it->second.hash);
 
     if (icon_url == shortcut_info.best_primary_icon_url.spec()) {
-      SetImageData(image, primary_icon);
+      if (!primary_icon_data.empty()) {
+        image->set_image_data(primary_icon_data);
+      } else {
+        image->set_image_data(it->second.unsafe_data);
+      }
       image->add_usages(webapk::Image::PRIMARY_ICON);
       if (is_primary_icon_maskable) {
         image->add_purposes(webapk::Image::MASKABLE);
@@ -214,8 +211,8 @@
           shortcut_info.best_primary_icon_url) {
         // WebAPK updates uses the image data from fetched bitmap; installs use
         // the image data from icon_url_to_murmur2_hash.
-        if (!splash_icon.drawsNothing()) {
-          SetImageData(image, splash_icon);
+        if (!splash_icon_data.empty()) {
+          image->set_image_data(splash_icon_data);
         } else {
           image->set_image_data(it->second.unsafe_data);
         }
@@ -267,9 +264,9 @@
 bool StoreUpdateRequestToFileInBackground(
     const base::FilePath& update_request_path,
     const webapps::ShortcutInfo& shortcut_info,
-    const SkBitmap& primary_icon,
+    const std::string& primary_icon_data,
     bool is_primary_icon_maskable,
-    const SkBitmap& splash_icon,
+    const std::string& splash_icon_data,
     const std::string& package_name,
     const std::string& version,
     std::map<std::string, WebApkIconHasher::Icon> icon_url_to_murmur2_hash,
@@ -280,10 +277,10 @@
                                                 base::BlockingType::MAY_BLOCK);
 
   std::unique_ptr<std::string> proto = BuildProtoInBackground(
-      shortcut_info, primary_icon, is_primary_icon_maskable, splash_icon,
-      package_name, version, std::move(icon_url_to_murmur2_hash),
-      is_manifest_stale, is_app_identity_update_supported,
-      std::move(update_reasons));
+      shortcut_info, primary_icon_data, is_primary_icon_maskable,
+      splash_icon_data, package_name, version,
+      std::move(icon_url_to_murmur2_hash), is_manifest_stale,
+      is_app_identity_update_supported, std::move(update_reasons));
 
   // Create directory if it does not exist.
   base::CreateDirectory(update_request_path.DirName());
diff --git a/components/webapps/browser/android/webapk/webapk_proto_builder.h b/components/webapps/browser/android/webapk/webapk_proto_builder.h
index b30d8aa..59643b2f 100644
--- a/components/webapps/browser/android/webapk/webapk_proto_builder.h
+++ b/components/webapps/browser/android/webapk/webapk_proto_builder.h
@@ -14,7 +14,6 @@
 #include "components/webapps/browser/android/shortcut_info.h"
 #include "components/webapps/browser/android/webapk/webapk_icon_hasher.h"
 #include "components/webapps/browser/android/webapk/webapk_types.h"
-#include "third_party/skia/include/core/SkBitmap.h"
 
 namespace webapps {
 
@@ -25,9 +24,9 @@
 // splash icon URL is unknown.
 std::unique_ptr<std::string> BuildProtoInBackground(
     const webapps::ShortcutInfo& shortcut_info,
-    const SkBitmap& primary_icon,
+    const std::string& primary_icon_data,
     bool is_primary_icon_maskable,
-    const SkBitmap& splash_icon,
+    const std::string& splash_icon_data,
     const std::string& package_name,
     const std::string& version,
     std::map<std::string, WebApkIconHasher::Icon> icon_url_to_murmur2_hash,
@@ -41,9 +40,9 @@
 bool StoreUpdateRequestToFileInBackground(
     const base::FilePath& update_request_path,
     const webapps::ShortcutInfo& shortcut_info,
-    const SkBitmap& primary_icon,
+    const std::string& primary_icon_data,
     bool is_primary_icon_maskable,
-    const SkBitmap& splash_icon,
+    const std::string& splash_icon_data,
     const std::string& package_name,
     const std::string& version,
     std::map<std::string, WebApkIconHasher::Icon> icon_url_to_murmur2_hash,
diff --git a/content/browser/attribution_reporting/attribution_host.cc b/content/browser/attribution_reporting/attribution_host.cc
index bc75ba3e..8049b0d 100644
--- a/content/browser/attribution_reporting/attribution_host.cc
+++ b/content/browser/attribution_reporting/attribution_host.cc
@@ -301,34 +301,35 @@
 
   const AttributionPolicy& policy = attribution_manager->GetAttributionPolicy();
 
-  if (!policy.IsTriggerDataInRange(conversion->conversion_data,
-                                   CommonSourceInfo::SourceType::kNavigation)) {
-    devtools_instrumentation::ReportAttributionReportingIssue(
-        render_frame_host,
-        devtools_instrumentation::AttributionReportingIssueType::
-            kAttributionTriggerDataTooLarge,
-        conversion->devtools_request_id,
-        base::NumberToString(conversion->conversion_data));
-  }
+  const auto sanitize_trigger_data =
+      [&](const uint64_t unsanitized, CommonSourceInfo::SourceType source_type,
+          devtools_instrumentation::AttributionReportingIssueType issue_type) {
+        const uint64_t sanitized =
+            policy.SanitizeTriggerData(unsanitized, source_type);
 
-  if (!policy.IsTriggerDataInRange(conversion->event_source_trigger_data,
-                                   CommonSourceInfo::SourceType::kEvent)) {
-    devtools_instrumentation::ReportAttributionReportingIssue(
-        render_frame_host,
-        devtools_instrumentation::AttributionReportingIssueType::
-            kAttributionEventSourceTriggerDataTooLarge,
-        conversion->devtools_request_id,
-        base::NumberToString(conversion->event_source_trigger_data));
-  }
+        if (sanitized != unsanitized) {
+          devtools_instrumentation::ReportAttributionReportingIssue(
+              render_frame_host, issue_type, conversion->devtools_request_id,
+              base::NumberToString(unsanitized));
+        }
+
+        return sanitized;
+      };
 
   net::SchemefulSite conversion_destination(main_frame_origin);
 
   StorableTrigger storable_conversion(
-      policy.SanitizeTriggerData(conversion->conversion_data,
-                                 CommonSourceInfo::SourceType::kNavigation),
+      sanitize_trigger_data(
+          conversion->conversion_data,
+          CommonSourceInfo::SourceType::kNavigation,
+          devtools_instrumentation::AttributionReportingIssueType::
+              kAttributionTriggerDataTooLarge),
       std::move(conversion_destination), conversion->reporting_origin,
-      policy.SanitizeTriggerData(conversion->event_source_trigger_data,
-                                 CommonSourceInfo::SourceType::kEvent),
+      sanitize_trigger_data(
+          conversion->event_source_trigger_data,
+          CommonSourceInfo::SourceType::kEvent,
+          devtools_instrumentation::AttributionReportingIssueType::
+              kAttributionEventSourceTriggerDataTooLarge),
       conversion->priority,
       conversion->dedup_key.is_null()
           ? absl::nullopt
diff --git a/content/browser/attribution_reporting/attribution_policy.cc b/content/browser/attribution_reporting/attribution_policy.cc
index 9b17a59..9a05e35 100644
--- a/content/browser/attribution_reporting/attribution_policy.cc
+++ b/content/browser/attribution_reporting/attribution_policy.cc
@@ -57,12 +57,6 @@
   return trigger_data % cardinality;
 }
 
-bool AttributionPolicy::IsTriggerDataInRange(
-    uint64_t trigger_data,
-    CommonSourceInfo::SourceType source_type) const {
-  return trigger_data < TriggerDataCardinality(source_type);
-}
-
 base::Time AttributionPolicy::GetExpiryTimeForImpression(
     const absl::optional<base::TimeDelta>& declared_expiry,
     base::Time impression_time,
diff --git a/content/browser/attribution_reporting/attribution_policy.h b/content/browser/attribution_reporting/attribution_policy.h
index 938a8762..0619123 100644
--- a/content/browser/attribution_reporting/attribution_policy.h
+++ b/content/browser/attribution_reporting/attribution_policy.h
@@ -34,9 +34,6 @@
   uint64_t SanitizeTriggerData(uint64_t trigger_data,
                                CommonSourceInfo::SourceType source_type) const;
 
-  bool IsTriggerDataInRange(uint64_t trigger_data,
-                            CommonSourceInfo::SourceType source_type) const;
-
   // Returns the expiry time for an impression that is clamped to a maximum
   // value of 30 days from |impression_time|.
   base::Time GetExpiryTimeForImpression(
diff --git a/content/browser/compute_pressure/compute_pressure_host.cc b/content/browser/compute_pressure/compute_pressure_host.cc
index ef1afda..5551f34 100644
--- a/content/browser/compute_pressure/compute_pressure_host.cc
+++ b/content/browser/compute_pressure/compute_pressure_host.cc
@@ -134,6 +134,10 @@
     return;
   }
 
+  // No need to send an update if previous value is similar.
+  if (last_report_state_ == quantized_state)
+    return;
+
   for (auto it = observers_.begin(); it != observers_.end(); ++it) {
     mojo::RemoteSetElementId observer_id = it.id();
 
@@ -160,6 +164,7 @@
     // implement sending (less frequent) updates to observers in non-visible
     // frames.
     last_report_time_ = sample_time;
+    last_report_state_ = quantized_state;
 
     (*it)->OnUpdate(quantized_state.Clone());
   }
@@ -194,7 +199,8 @@
   last_report_time_ = base::Time::Now();
 
   // Setting to an invalid value, so any state is considered an update.
-  last_report_sample_ = {.cpu_utilization = -1, .cpu_speed = -1};
+  last_report_state_ = {/* cpu_utilization */ -1,
+                        /* cpu_speed */ -1};
 }
 
 }  // namespace content
diff --git a/content/browser/compute_pressure/compute_pressure_host.h b/content/browser/compute_pressure/compute_pressure_host.h
index 007eeaa..6bd4173 100644
--- a/content/browser/compute_pressure/compute_pressure_host.h
+++ b/content/browser/compute_pressure/compute_pressure_host.h
@@ -131,7 +131,7 @@
   // Stored to avoid sending updates when the underlying compute pressure state
   // changes, but quantization produces the same values that were reported in
   // the last update.
-  ComputePressureSample last_report_sample_
+  blink::mojom::ComputePressureState last_report_state_
       GUARDED_BY_CONTEXT(sequence_checker_);
 
   // The last time the origin's observers received an update.
diff --git a/content/browser/compute_pressure/compute_pressure_host_unittest.cc b/content/browser/compute_pressure/compute_pressure_host_unittest.cc
index b50469d..10a16ee 100644
--- a/content/browser/compute_pressure/compute_pressure_host_unittest.cc
+++ b/content/browser/compute_pressure/compute_pressure_host_unittest.cc
@@ -112,6 +112,32 @@
             blink::mojom::ComputePressureState(0.1, 0.25));
 }
 
+TEST_F(ComputePressureHostTest, OneObserver_NoCallbackInvoke) {
+  FakeComputePressureObserver observer;
+  ASSERT_EQ(host_sync_->AddObserver(kQuantization,
+                                    observer.BindNewPipeAndPassRemote()),
+            blink::mojom::ComputePressureStatus::kOk);
+
+  base::Time now = base::Time::Now();
+
+  host_impl_->UpdateObservers({.cpu_utilization = 0.42, .cpu_speed = 0.84},
+                              now + base::Seconds(1));
+  observer.WaitForUpdate();
+  ASSERT_THAT(observer.updates(), testing::SizeIs(testing::Eq(1u)));
+  EXPECT_EQ(observer.updates()[0],
+            blink::mojom::ComputePressureState(0.35, 0.75));
+
+  // The first update should be discarded due to same bucket
+  host_impl_->UpdateObservers({.cpu_utilization = 0.37, .cpu_speed = 0.70},
+                              now + base::Seconds(2));
+  host_impl_->UpdateObservers({.cpu_utilization = 0.42, .cpu_speed = 0.42},
+                              now + base::Seconds(3));
+  observer.WaitForUpdate();
+  ASSERT_THAT(observer.updates(), testing::SizeIs(testing::Eq(2u)));
+  EXPECT_EQ(observer.updates()[1],
+            blink::mojom::ComputePressureState(0.35, 0.25));
+}
+
 TEST_F(ComputePressureHostTest, OneObserver_AddRateLimiting) {
   base::Time before_add = base::Time::Now();
 
diff --git a/content/common/partition_alloc_support.cc b/content/common/partition_alloc_support.cc
index d753f79..344171e 100644
--- a/content/common/partition_alloc_support.cc
+++ b/content/common/partition_alloc_support.cc
@@ -283,7 +283,9 @@
       base::allocator::EnableBrp(enable_brp),
       base::allocator::SplitMainPartition(split_main_partition),
       base::allocator::UseDedicatedAlignedPartition(
-          use_dedicated_aligned_partition));
+          use_dedicated_aligned_partition),
+      base::allocator::AlternateBucketDistribution(base::FeatureList::IsEnabled(
+          base::features::kPartitionAllocUseAlternateDistribution)));
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
 
   // If BRP is not enabled, check if any of PCScan flags is enabled.
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc
index 8c1e9919..d95006a 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -447,11 +447,12 @@
 void RenderAccessibilityImpl::MarkWebAXObjectDirty(
     const WebAXObject& obj,
     bool subtree,
+    ax::mojom::EventFrom event_from,
     ax::mojom::Action event_from_action,
     std::vector<ui::AXEventIntent> event_intents,
     ax::mojom::Event event_type) {
-  EnqueueDirtyObject(obj, ax::mojom::EventFrom::kAction, event_from_action,
-                     event_intents, dirty_objects_.end());
+  EnqueueDirtyObject(obj, event_from, event_from_action, event_intents,
+                     dirty_objects_.end());
 
   if (subtree)
     serializer_->InvalidateSubtree(obj);
@@ -508,8 +509,9 @@
     event_schedule_mode_ = EventScheduleMode::kProcessEventsImmediately;
 
   if (ShouldSerializeNodeForEvent(obj, event)) {
-    MarkWebAXObjectDirty(obj, false, event.event_from_action,
-                         event.event_intents, event.event_type);
+    MarkWebAXObjectDirty(obj, /* subtree= */ false, event.event_from,
+                         event.event_from_action, event.event_intents,
+                         event.event_type);
   }
 
   ScheduleSendPendingAccessibilityEvents();
@@ -1306,7 +1308,8 @@
     objs_to_explore.pop();
 
     if (obj.Role() == role)
-      MarkWebAXObjectDirty(obj, /* subtree */ false, event_from_action);
+      MarkWebAXObjectDirty(obj, /* subtree */ false,
+                           ax::mojom::EventFrom::kNone, event_from_action);
 
     std::vector<blink::WebAXObject> children;
     tree_source_->GetChildren(obj, &children);
diff --git a/content/renderer/accessibility/render_accessibility_impl.h b/content/renderer/accessibility/render_accessibility_impl.h
index 258a125..61ce661 100644
--- a/content/renderer/accessibility/render_accessibility_impl.h
+++ b/content/renderer/accessibility/render_accessibility_impl.h
@@ -127,6 +127,7 @@
   void MarkWebAXObjectDirty(
       const blink::WebAXObject& obj,
       bool subtree,
+      ax::mojom::EventFrom event_from = ax::mojom::EventFrom::kNone,
       ax::mojom::Action event_from_action = ax::mojom::Action::kNone,
       std::vector<ui::AXEventIntent> event_intents = {},
       ax::mojom::Event event_type = ax::mojom::Event::kNone);
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index fea269ba..0cec8fa 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -4558,12 +4558,13 @@
 void RenderFrameImpl::MarkWebAXObjectDirty(
     const blink::WebAXObject& obj,
     bool subtree,
+    ax::mojom::EventFrom event_from,
     ax::mojom::Action event_from_action) {
   if (!IsAccessibilityEnabled())
     return;
 
   render_accessibility_manager_->GetRenderAccessibilityImpl()
-      ->MarkWebAXObjectDirty(obj, subtree, event_from_action);
+      ->MarkWebAXObjectDirty(obj, subtree, event_from, event_from_action);
 }
 
 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) {
@@ -5507,7 +5508,8 @@
       (policy == blink::kWebNavigationPolicyNewBackgroundTab ||
        policy == blink::kWebNavigationPolicyNewForegroundTab ||
        policy == blink::kWebNavigationPolicyNewWindow ||
-       policy == blink::kWebNavigationPolicyNewPopup)) {
+       policy == blink::kWebNavigationPolicyNewPopup ||
+       policy == blink::kWebNavigationPolicyPictureInPicture)) {
     frame_->ConsumeTransientUserActivation();
   }
 
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 4e5d10d..05166cca 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -612,10 +612,10 @@
   bool AllowContentInitiatedDataUrlNavigations(
       const blink::WebURL& url) override;
   void PostAccessibilityEvent(const ui::AXEvent& event) override;
-  void MarkWebAXObjectDirty(
-      const blink::WebAXObject& obj,
-      bool subtree,
-      ax::mojom::Action event_from_action = ax::mojom::Action::kNone) override;
+  void MarkWebAXObjectDirty(const blink::WebAXObject& obj,
+                            bool subtree,
+                            ax::mojom::EventFrom event_from,
+                            ax::mojom::Action event_from_action) override;
   void CheckIfAudioSinkExistsAndIsAuthorized(
       const blink::WebString& sink_id,
       blink::WebSetSinkIdCompleteCallback callback) override;
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 7809d32..f2c7eedb 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -74,6 +74,7 @@
     case blink::kWebNavigationPolicyNewWindow:
       return WindowOpenDisposition::NEW_WINDOW;
     case blink::kWebNavigationPolicyNewPopup:
+    case blink::kWebNavigationPolicyPictureInPicture:
       return WindowOpenDisposition::NEW_POPUP;
     default:
       NOTREACHED() << "Unexpected WebNavigationPolicy";
diff --git a/content/web_test/browser/web_test_control_host.cc b/content/web_test/browser/web_test_control_host.cc
index 7af92e2..9b9d8b1 100644
--- a/content/web_test/browser/web_test_control_host.cc
+++ b/content/web_test/browser/web_test_control_host.cc
@@ -1795,6 +1795,21 @@
   // Consider removing it to understand what happens without.
   web_contents->Stop();
 
+  // Disable back/forward cache before the current test page navigates away so
+  // that the test page does not remain in the back/forward cache after the
+  // test.
+  BackForwardCache::DisableForRenderFrameHost(
+      web_contents->GetMainFrame(),
+      BackForwardCache::DisabledReason(
+          {BackForwardCache::DisabledSource::kTesting, 0,
+           "disabled for web_test not to cache the test page after the test "
+           "ends."}));
+
+  // Flush all the back/forward cache to avoid side effects in the next test.
+  for (auto* shell : Shell::windows()) {
+    shell->web_contents()->GetController().GetBackForwardCache().Flush();
+  }
+
   // Navigate to about:blank in between two consecutive web tests.
   //
   // Note: this navigation might happen in a new process, depending on the
diff --git a/content/web_test/common/web_test_string_util.cc b/content/web_test/common/web_test_string_util.cc
index e5b8de44..8543d62 100644
--- a/content/web_test/common/web_test_string_util.cc
+++ b/content/web_test/common/web_test_string_util.cc
@@ -29,6 +29,7 @@
 const char* kPolicyNewForegroundTab = "new foreground tab";
 const char* kPolicyNewWindow = "new window";
 const char* kPolicyNewPopup = "new popup";
+const char* kPolicyPictureInPicture = "picture in picture";
 
 }  // namespace
 
@@ -70,6 +71,8 @@
       return kPolicyNewWindow;
     case blink::kWebNavigationPolicyNewPopup:
       return kPolicyNewPopup;
+    case blink::kWebNavigationPolicyPictureInPicture:
+      return kPolicyPictureInPicture;
     default:
       return kIllegalString;
   }
diff --git a/content/web_test/renderer/web_frame_test_proxy.cc b/content/web_test/renderer/web_frame_test_proxy.cc
index c1a1c675..28d3ce4c 100644
--- a/content/web_test/renderer/web_frame_test_proxy.cc
+++ b/content/web_test/renderer/web_frame_test_proxy.cc
@@ -640,6 +640,7 @@
 void WebFrameTestProxy::MarkWebAXObjectDirty(
     const blink::WebAXObject& object,
     bool subtree,
+    ax::mojom::EventFrom event_from,
     ax::mojom::Action event_from_action) {
   HandleWebAccessibilityEvent(object, "MarkDirty",
                               std::vector<ui::AXEventIntent>());
@@ -650,7 +651,8 @@
   if (object.IsDetached())
     return;  // |this| is invalid.
 
-  RenderFrameImpl::MarkWebAXObjectDirty(object, subtree, event_from_action);
+  RenderFrameImpl::MarkWebAXObjectDirty(object, subtree, event_from,
+                                        event_from_action);
 }
 
 void WebFrameTestProxy::HandleWebAccessibilityEvent(
diff --git a/content/web_test/renderer/web_frame_test_proxy.h b/content/web_test/renderer/web_frame_test_proxy.h
index 21d3cee..9214a049 100644
--- a/content/web_test/renderer/web_frame_test_proxy.h
+++ b/content/web_test/renderer/web_frame_test_proxy.h
@@ -79,10 +79,10 @@
                        ForRedirect for_redirect) override;
   void BeginNavigation(std::unique_ptr<blink::WebNavigationInfo> info) override;
   void PostAccessibilityEvent(const ui::AXEvent& event) override;
-  void MarkWebAXObjectDirty(
-      const blink::WebAXObject& object,
-      bool subtree,
-      ax::mojom::Action event_from_action = ax::mojom::Action::kNone) override;
+  void MarkWebAXObjectDirty(const blink::WebAXObject& object,
+                            bool subtree,
+                            ax::mojom::EventFrom event_from,
+                            ax::mojom::Action event_from_action) override;
   void CheckIfAudioSinkExistsAndIsAuthorized(
       const blink::WebString& sink_id,
       blink::WebSetSinkIdCompleteCallback completion_callback) override;
diff --git a/docs/threading_and_tasks.md b/docs/threading_and_tasks.md
index 1609c6fd..3b653dc6 100644
--- a/docs/threading_and_tasks.md
+++ b/docs/threading_and_tasks.md
@@ -732,6 +732,8 @@
 
   // This runs the (Thread|Sequenced)TaskRunnerHandle queue until it is empty.
   // Delayed tasks are not added to the queue until they are ripe for execution.
+  // Prefer explicit exit conditions to RunUntilIdle when possible:
+  // bit.ly/run-until-idle-with-care2.
   base::RunLoop().RunUntilIdle();
   // A and B have been executed. C is not ripe for execution yet.
 
@@ -759,8 +761,9 @@
       FROM_HERE, {}, base::BindOnce(&H), base::BindOnce(&I));
 
   // This runs the (Thread|Sequenced)TaskRunnerHandle queue until both the
-  // (Thread|Sequenced)TaskRunnerHandle queue and the TaskSchedule queue are
-  // empty:
+  // (Thread|Sequenced)TaskRunnerHandle queue and the ThreadPool queue are
+  // empty. Prefer explicit exit conditions to RunUntilIdle when possible:
+  // bit.ly/run-until-idle-with-care2.
   task_environment_.RunUntilIdle();
   // E, H, I have been executed.
 }
diff --git a/extensions/browser/api/declarative/rules_registry_unittest.cc b/extensions/browser/api/declarative/rules_registry_unittest.cc
index b8ab1266..5638657a 100644
--- a/extensions/browser/api/declarative/rules_registry_unittest.cc
+++ b/extensions/browser/api/declarative/rules_registry_unittest.cc
@@ -251,7 +251,7 @@
       "    \"instanceType\" : \"declarativeContent.PageStateMatcher\""
       "  }]"
       "}");
-  EXPECT_TRUE(expected_rule_0->Equals(get_rules[0]->ToValue().get()));
+  EXPECT_EQ(*expected_rule_0, *get_rules[0]->ToValue());
 
   std::unique_ptr<base::DictionaryValue> expected_rule_1 = ParseDictionary(
       "{"
@@ -265,7 +265,7 @@
       "    \"instanceType\" : \"declarativeContent.PageStateMatcher\""
       "  }]"
       "}");
-  EXPECT_TRUE(expected_rule_1->Equals(get_rules[1]->ToValue().get()));
+  EXPECT_EQ(*expected_rule_1, *get_rules[1]->ToValue());
 }
 
 // Tests verifies that rules defined in the manifest cannot be deleted but
diff --git a/extensions/browser/api/storage/settings_quota_unittest.cc b/extensions/browser/api/storage/settings_quota_unittest.cc
index 33e0618..85da398 100644
--- a/extensions/browser/api/storage/settings_quota_unittest.cc
+++ b/extensions/browser/api/storage/settings_quota_unittest.cc
@@ -64,8 +64,8 @@
   // Returns whether the settings in |storage_| and |delegate_| are the same as
   // |settings|.
   bool SettingsEqual(const base::DictionaryValue& settings) {
-    return settings.Equals(&storage_->Get().settings()) &&
-           settings.Equals(&delegate_->Get().settings());
+    return settings == storage_->Get().settings() &&
+           settings == delegate_->Get().settings();
   }
 
   // Values with different serialized sizes.
diff --git a/ios/chrome/app/application_delegate/app_state_unittest.mm b/ios/chrome/app/application_delegate/app_state_unittest.mm
index 69a2751..3b77b56b 100644
--- a/ios/chrome/app/application_delegate/app_state_unittest.mm
+++ b/ios/chrome/app/application_delegate/app_state_unittest.mm
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/ios/block_types.h"
 #import "base/ios/ios_util.h"
+#include "base/mac/foundation_util.h"
 #import "base/test/task_environment.h"
 #import "ios/chrome/app/app_startup_parameters.h"
 #import "ios/chrome/app/application_delegate/app_state_observer.h"
@@ -825,7 +826,8 @@
 
   // Starting safe mode will call makeKeyAndVisible on the window.
   [[window expect] makeKeyAndVisible];
-  SceneState* sceneState = appState.connectedScenes.firstObject;
+  FakeSceneState* sceneState = base::mac::ObjCCastStrict<FakeSceneState>(
+      appState.connectedScenes.firstObject);
   sceneState.window = window;
 
   // Actions.
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 735feb4..b18d818 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1616,6 +1616,15 @@
       <message name="IDS_IOS_PERMISSIONS_CAMERA" desc="Usually used to show whether user has enabled a site's permission to use the device camera.">
         Camera
       </message>
+      <message name="IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_ACCESSIBLE" desc="Message shown in the infobar when camera access is enabled.">
+        Camera access allowed
+      </message>
+      <message name="IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_AND_MICROPHONE_ACCESSIBLE" desc="Message shown in the infobar when both camera and microphone access are enabled.">
+        Camera and Microphone access allowed
+      </message>
+      <message name="IDS_IOS_PERMISSIONS_INFOBAR_BANNER_MICROPHONE_ACCESSIBLE" desc="Message shown in the infobar when microphone access is enabled.">
+        Microphone access allowed
+      </message>
       <message name="IDS_IOS_PERMISSIONS_MICROPHONE" desc="Usually used to show whether user has enabled a site's permission to use the device microphone.">
         Microphone
       </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_ACCESSIBLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_ACCESSIBLE.png.sha1
new file mode 100644
index 0000000..981ca795
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_ACCESSIBLE.png.sha1
@@ -0,0 +1 @@
+eebe07c9d532efd3cdd477fd173e84741628d992
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_AND_MICROPHONE_ACCESSIBLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_AND_MICROPHONE_ACCESSIBLE.png.sha1
new file mode 100644
index 0000000..4b7b3b9
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_AND_MICROPHONE_ACCESSIBLE.png.sha1
@@ -0,0 +1 @@
+a0eff81d5e4614fff6653d4265a71fae737b145c
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_MICROPHONE_ACCESSIBLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_MICROPHONE_ACCESSIBLE.png.sha1
new file mode 100644
index 0000000..b1289c3
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_MICROPHONE_ACCESSIBLE.png.sha1
@@ -0,0 +1 @@
+f8dcdf180e460e93d118525bedec2762813dfda0
\ No newline at end of file
diff --git a/ios/chrome/browser/metrics/window_configuration_recorder.mm b/ios/chrome/browser/metrics/window_configuration_recorder.mm
index fcea5deb..4b9e8e64 100644
--- a/ios/chrome/browser/metrics/window_configuration_recorder.mm
+++ b/ios/chrome/browser/metrics/window_configuration_recorder.mm
@@ -36,20 +36,18 @@
     UIApplication* application) {
   NSMutableArray<UIWindow*>* windows = [NSMutableArray arrayWithCapacity:3];
 
-  if (base::ios::IsSceneStartupSupported()) {
-    for (UIScene* scene in application.connectedScenes) {
-      if (scene.activationState != UISceneActivationStateForegroundActive)
+  for (UIScene* scene in application.connectedScenes) {
+    if (scene.activationState != UISceneActivationStateForegroundActive)
+      continue;
+
+    UIWindowScene* windowScene = base::mac::ObjCCast<UIWindowScene>(scene);
+    for (UIWindow* window in windowScene.windows) {
+      // Skip other windows (like keyboard) that keep showing up.
+      if (![window isKindOfClass:NSClassFromString(@"ChromeOverlayWindow")])
         continue;
 
-      UIWindowScene* windowScene = base::mac::ObjCCast<UIWindowScene>(scene);
-      for (UIWindow* window in windowScene.windows) {
-        // Skip other windows (like keyboard) that keep showing up.
-        if (![window isKindOfClass:NSClassFromString(@"ChromeOverlayWindow")])
-          continue;
-
-        [windows addObject:window];
-        break;  // Stop after one window per scene. This may be wrong.
-      }
+      [windows addObject:window];
+      break;  // Stop after one window per scene. This may be wrong.
     }
   }
   return [windows copy];
diff --git a/ios/chrome/browser/overlays/public/infobar_banner/BUILD.gn b/ios/chrome/browser/overlays/public/infobar_banner/BUILD.gn
index 79b2c0e..12e4aea 100644
--- a/ios/chrome/browser/overlays/public/infobar_banner/BUILD.gn
+++ b/ios/chrome/browser/overlays/public/infobar_banner/BUILD.gn
@@ -45,6 +45,8 @@
     "//ios/chrome/browser/ui/reading_list:infobar",
     "//ios/chrome/browser/ui/resources:legacy_password_key",
     "//ios/chrome/browser/ui/resources:password_key",
+    "//ios/chrome/browser/web/",
+    "//ios/web/public/permissions",
     "//ui/base",
   ]
 }
diff --git a/ios/chrome/browser/overlays/public/infobar_banner/permissions_infobar_banner_overlay_request_config.h b/ios/chrome/browser/overlays/public/infobar_banner/permissions_infobar_banner_overlay_request_config.h
index fe43873..56b45cd0 100644
--- a/ios/chrome/browser/overlays/public/infobar_banner/permissions_infobar_banner_overlay_request_config.h
+++ b/ios/chrome/browser/overlays/public/infobar_banner/permissions_infobar_banner_overlay_request_config.h
@@ -5,7 +5,7 @@
 #ifndef IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_INFOBAR_BANNER_PERMISSIONS_INFOBAR_BANNER_OVERLAY_REQUEST_CONFIG_H_
 #define IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_INFOBAR_BANNER_PERMISSIONS_INFOBAR_BANNER_OVERLAY_REQUEST_CONFIG_H_
 
-#include <CoreFoundation/CoreFoundation.h>
+#include <UIKit/UIKit.h>
 
 #include "ios/chrome/browser/overlays/public/overlay_request_config.h"
 #include "ios/chrome/browser/overlays/public/overlay_user_data.h"
@@ -26,8 +26,8 @@
   // The button text.
   NSString* button_text() const { return button_text_; }
 
-  // The name of the banner's icon image.
-  NSString* icon_image_name() const { return icon_image_name_; }
+  // The banner's icon image.
+  UIImage* icon_image() const { return icon_image_; }
 
  private:
   OVERLAY_USER_DATA_SETUP(PermissionsBannerRequestConfig);
@@ -38,7 +38,7 @@
 
   NSString* title_text_;
   NSString* button_text_;
-  NSString* icon_image_name_ = nil;
+  UIImage* icon_image_ = nil;
 
   // The InfoBar causing this banner.
   infobars::InfoBar* infobar_ = nullptr;
diff --git a/ios/chrome/browser/overlays/public/infobar_banner/permissions_infobar_banner_overlay_request_config.mm b/ios/chrome/browser/overlays/public/infobar_banner/permissions_infobar_banner_overlay_request_config.mm
index b6d29d6..bc0b20b 100644
--- a/ios/chrome/browser/overlays/public/infobar_banner/permissions_infobar_banner_overlay_request_config.mm
+++ b/ios/chrome/browser/overlays/public/infobar_banner/permissions_infobar_banner_overlay_request_config.mm
@@ -9,8 +9,9 @@
 #include "ios/chrome/browser/infobars/infobar_ios.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_type.h"
 #import "ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h"
-#import "ios/chrome/browser/ui/reading_list/ios_add_to_reading_list_infobar_delegate.h"
+#import "ios/chrome/browser/web/permissions_infobar_delegate.h"
 #include "ios/chrome/grit/ios_strings.h"
+#import "ios/web/public/permissions/permissions.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
 
@@ -24,9 +25,9 @@
 namespace {
 
 // Name of the camera icon image for the permissions banner.
-NSString* const kCameraIconImageName = @"infobar_reading_list";
+NSString* const kCameraImageName = @"infobar_permissions_camera";
 // Name of the microphone icon image for the permissions banner.
-NSString* const kMicrophoneIconImageName = @"infobar_reading_list";
+NSString* const kMicrophoneSystemImageName = @"mic.fill";
 
 }  // namespace
 
@@ -35,13 +36,25 @@
 PermissionsBannerRequestConfig::PermissionsBannerRequestConfig(InfoBar* infobar)
     : infobar_(infobar) {
   DCHECK(infobar_);
-  // TODO(crbug.com/1289645): Retrieve permissions from a delegate.
-
-  // TODO(crbug.com/1289645): Use appropriate images.
-  icon_image_name_ = kCameraIconImageName;
-
-  title_text_ = @"Placeholder";
-
+  PermissionsInfoBarDelegate* delegate =
+      static_cast<PermissionsInfoBarDelegate*>(infobar_->delegate());
+  NSArray<NSNumber*>* accessible_permissions =
+      delegate->GetMostRecentlyAccessiblePermissions();
+  if ([accessible_permissions containsObject:@(web::PermissionCamera)]) {
+    // Camera access is enabled.
+    icon_image_ = [UIImage imageNamed:kCameraImageName];
+    title_text_ =
+        [accessible_permissions containsObject:@(web::PermissionMicrophone)]
+            ? l10n_util::GetNSString(
+                  IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_AND_MICROPHONE_ACCESSIBLE)
+            : l10n_util::GetNSString(
+                  IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_ACCESSIBLE);
+  } else {
+    // Only microphone access is enabled.
+    icon_image_ = [UIImage systemImageNamed:kMicrophoneSystemImageName];
+    title_text_ = l10n_util::GetNSString(
+        IDS_IOS_PERMISSIONS_INFOBAR_BANNER_MICROPHONE_ACCESSIBLE);
+  }
   button_text_ = l10n_util::GetNSString(IDS_IOS_EDIT_ACTION_TITLE);
 }
 
diff --git a/ios/chrome/browser/translate/chrome_ios_translate_client.mm b/ios/chrome/browser/translate/chrome_ios_translate_client.mm
index b4f2aee..a10f58c 100644
--- a/ios/chrome/browser/translate/chrome_ios_translate_client.mm
+++ b/ios/chrome/browser/translate/chrome_ios_translate_client.mm
@@ -30,8 +30,6 @@
 #include "ios/chrome/browser/translate/translate_service_ios.h"
 #include "ios/chrome/grit/ios_theme_resources.h"
 #include "ios/web/public/browser_state.h"
-#include "ios/web/public/navigation/navigation_item.h"
-#include "ios/web/public/navigation/navigation_manager.h"
 #import "ios/web/public/web_state.h"
 #include "third_party/metrics_proto/translate_event.pb.h"
 #include "url/gurl.h"
@@ -61,9 +59,7 @@
               ChromeBrowserState::FromBrowserState(
                   web_state->GetBrowserState()))
               ->GetPrimaryModel())),
-      translate_driver_(web_state,
-                        web_state->GetNavigationManager(),
-                        translate_manager_.get()) {
+      translate_driver_(web_state, translate_manager_.get()) {
   web_state_->AddObserver(this);
 }
 
diff --git a/ios/chrome/browser/ui/main/incognito_blocker_scene_agent.mm b/ios/chrome/browser/ui/main/incognito_blocker_scene_agent.mm
index e885fa5..6f07d42 100644
--- a/ios/chrome/browser/ui/main/incognito_blocker_scene_agent.mm
+++ b/ios/chrome/browser/ui/main/incognito_blocker_scene_agent.mm
@@ -74,13 +74,7 @@
 #pragma mark - private
 
 - (void)showOverlay {
-  NSArray<UIWindow*>* windows = nil;
-
-  if (base::ios::IsSceneStartupSupported()) {
-    windows = self.sceneState.scene.windows;
-  } else {
-    windows = UIApplication.sharedApplication.windows;
-  }
+  NSArray<UIWindow*>* windows = self.sceneState.scene.windows;
 
   // Adding |self.overlayView| to sceneState.window won't cover overlay windows
   // such as fullscreen video.  Instead use the topmost window.
diff --git a/ios/chrome/browser/ui/main/scene_state.h b/ios/chrome/browser/ui/main/scene_state.h
index 28b2b3c5..036bf1f 100644
--- a/ios/chrome/browser/ui/main/scene_state.h
+++ b/ios/chrome/browser/ui/main/scene_state.h
@@ -65,7 +65,7 @@
 @property(nonatomic) BOOL incognitoContentVisible;
 
 // Window for the associated scene, if any.
-@property(nonatomic, strong) UIWindow* window;
+@property(nonatomic, readonly) UIWindow* window;
 
 // The scene object backing this scene state. It's in a 1-to-1 relationship and
 // the window scene owns this object (indirectly through scene delegate).
diff --git a/ios/chrome/browser/ui/main/scene_state.mm b/ios/chrome/browser/ui/main/scene_state.mm
index b968747..5a70e71 100644
--- a/ios/chrome/browser/ui/main/scene_state.mm
+++ b/ios/chrome/browser/ui/main/scene_state.mm
@@ -63,8 +63,6 @@
   ContentVisibility _contentVisibility;
 }
 
-@synthesize window = _window;
-
 - (instancetype)initWithAppState:(AppState*)appState {
   self = [super init];
   if (self) {
@@ -104,26 +102,14 @@
 
 #pragma mark - Setters & Getters.
 
-- (void)setWindow:(UIWindow*)window {
-  if (base::ios::IsSceneStartupSupported()) {
-    // No need to set anything, instead the getter is backed by scene.windows
-    // property.
-    return;
-  }
-  _window = window;
-}
-
 - (UIWindow*)window {
-  if (base::ios::IsSceneStartupSupported()) {
-    UIWindow* mainWindow = nil;
-    for (UIWindow* window in self.scene.windows) {
-      if ([window isKindOfClass:[ChromeOverlayWindow class]]) {
-        mainWindow = window;
-      }
+  UIWindow* mainWindow = nil;
+  for (UIWindow* window in self.scene.windows) {
+    if ([window isKindOfClass:[ChromeOverlayWindow class]]) {
+      mainWindow = window;
     }
-    return mainWindow;
   }
-  return _window;
+  return mainWindow;
 }
 
 - (NSString*)sceneSessionID {
diff --git a/ios/chrome/browser/ui/main/test/fake_scene_state.h b/ios/chrome/browser/ui/main/test/fake_scene_state.h
index 214e243c..674097a1 100644
--- a/ios/chrome/browser/ui/main/test/fake_scene_state.h
+++ b/ios/chrome/browser/ui/main/test/fake_scene_state.h
@@ -28,6 +28,11 @@
 
 - (instancetype)initWithAppState:(AppState*)appState NS_UNAVAILABLE;
 
+// Window for the associated scene, if any.
+// This is redeclared relative to FakeScene.window, except this is now readwrite
+// and backed by an instance variable.
+@property(nonatomic, strong, readwrite) UIWindow* window;
+
 // Append a suitable web state test double to the receiver's main interface.
 - (void)appendWebStateWithURL:(const GURL)URL;
 
diff --git a/ios/chrome/browser/ui/main/test/fake_scene_state.mm b/ios/chrome/browser/ui/main/test/fake_scene_state.mm
index 5422763..d7416a66 100644
--- a/ios/chrome/browser/ui/main/test/fake_scene_state.mm
+++ b/ios/chrome/browser/ui/main/test/fake_scene_state.mm
@@ -29,11 +29,12 @@
   // Owning pointer for the browser that backs the interface provider.
   std::unique_ptr<TestBrowser> _browser;
   std::unique_ptr<TestBrowser> _incognito_browser;
-  UIWindow* _window;
 }
 
 @synthesize interfaceProvider = _interfaceProvider;
 
+@synthesize window = _window;
+
 - (instancetype)initWithAppState:(AppState*)appState
                     browserState:(ChromeBrowserState*)browserState {
   if (self = [super initWithAppState:appState]) {
@@ -83,12 +84,4 @@
   }
 }
 
-- (UIWindow*)window {
-  return _window;
-}
-
-- (void)setWindow:(UIWindow*)window {
-  _window = window;
-}
-
 @end
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/permissions/permissions_infobar_banner_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/infobar_banner/permissions/permissions_infobar_banner_overlay_mediator.mm
index 0a1166c..96bef3ed 100644
--- a/ios/chrome/browser/ui/overlays/infobar_banner/permissions/permissions_infobar_banner_overlay_mediator.mm
+++ b/ios/chrome/browser/ui/overlays/infobar_banner/permissions/permissions_infobar_banner_overlay_mediator.mm
@@ -52,7 +52,7 @@
 
   [self.consumer setTitleText:config->title_text()];
   [self.consumer setButtonText:config->button_text()];
-  [self.consumer setIconImage:[UIImage imageNamed:config->icon_image_name()]];
+  [self.consumer setIconImage:config->icon_image()];
   [self.consumer setPresentsModal:NO];
 }
 
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_app_interface.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_app_interface.mm
index c8fed06..4b828502 100644
--- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_app_interface.mm
+++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_app_interface.mm
@@ -15,19 +15,14 @@
 @implementation RecentTabsAppInterface
 
 + (void)clearCollapsedListViewSectionStates {
-  if (base::ios::IsSceneStartupSupported()) {
-    NSArray<UIWindow*>* windows = [UIApplication sharedApplication].windows;
-    for (UIWindow* window in windows) {
-      UISceneSession* session = window.windowScene.session;
+  NSArray<UIWindow*>* windows = [UIApplication sharedApplication].windows;
+  for (UIWindow* window in windows) {
+    UISceneSession* session = window.windowScene.session;
 
-      NSMutableDictionary* newUserInfo =
-          [NSMutableDictionary dictionaryWithDictionary:session.userInfo];
-      [newUserInfo removeObjectForKey:kListModelCollapsedKey];
-      session.userInfo = newUserInfo;
-    }
-  } else {
-    [NSUserDefaults.standardUserDefaults setObject:@{}
-                                            forKey:kListModelCollapsedKey];
+    NSMutableDictionary* newUserInfo =
+        [NSMutableDictionary dictionaryWithDictionary:session.userInfo];
+    [newUserInfo removeObjectForKey:kListModelCollapsedKey];
+    session.userInfo = newUserInfo;
   }
 }
 
diff --git a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm
index b7e887b4..b022b7e 100644
--- a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm
@@ -160,11 +160,10 @@
   [super viewDidLoad];
   [self loadModel];
   [self setRightNavBarItem];
-  if (base::ios::IsSceneStartupSupported()) {
-    SceneState* sceneState =
-        SceneStateBrowserAgent::FromBrowser(self.browser)->GetSceneState();
-    _uiBlocker = std::make_unique<ScopedUIBlocker>(sceneState);
-  }
+
+  SceneState* sceneState =
+      SceneStateBrowserAgent::FromBrowser(self.browser)->GetSceneState();
+  _uiBlocker = std::make_unique<ScopedUIBlocker>(sceneState);
 }
 
 - (void)didReceiveMemoryWarning {
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm
index eefe82c..3b78bb0 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm
@@ -36,17 +36,19 @@
 #endif
 
 @interface StubSceneState : SceneState
+
+// Window for the associated scene, if any.
+// This is redeclared relative to FakeScene.window, except this is now readwrite
+// and backed by an instance variable.
+@property(nonatomic, strong, readwrite) UIWindow* window;
+
 @end
 
 @implementation StubSceneState {
-  UIWindow* _window;
 }
-- (void)setWindow:(UIWindow*)window {
-  _window = window;
-}
-- (UIWindow*)window {
-  return _window;
-}
+
+@synthesize window = _window;
+
 @end
 
 @interface TestTabGridCoordinatorDelegate
@@ -163,7 +165,7 @@
   std::unique_ptr<Browser> incognito_browser_;
 
   // Scene state emulated in this test.
-  SceneState* scene_state_;
+  StubSceneState* scene_state_;
 
   // The TabGridCoordinator that is under test.  The test fixture sets
   // this VC as the root VC for the window.
diff --git a/ios/chrome/test/scoped_key_window.mm b/ios/chrome/test/scoped_key_window.mm
index b548f0b..3ebd5be 100644
--- a/ios/chrome/test/scoped_key_window.mm
+++ b/ios/chrome/test/scoped_key_window.mm
@@ -13,23 +13,21 @@
 #endif
 
 ScopedKeyWindow::ScopedKeyWindow() {
-  if (base::ios::IsSceneStartupSupported()) {
-    NSSet<UIScene*>* scenes =
-        ([[UIApplication sharedApplication] connectedScenes]);
-    // Only one scene is supported in unittests at the moment.
-    DCHECK_EQ([scenes count], 1u);
-    UIScene* scene =
-        [[[UIApplication sharedApplication] connectedScenes] anyObject];
-    DCHECK([scene isKindOfClass:[UIWindowScene class]]);
-    UIWindowScene* windowScene = static_cast<UIWindowScene*>(scene);
-    for (UIWindow* window in windowScene.windows) {
-      if ([window isKeyWindow]) {
-        original_key_window_ = window;
-      }
+  NSSet<UIScene*>* scenes =
+      ([[UIApplication sharedApplication] connectedScenes]);
+  // Only one scene is supported in unittests at the moment.
+  DCHECK_EQ([scenes count], 1u);
+  UIScene* scene =
+      [[[UIApplication sharedApplication] connectedScenes] anyObject];
+  DCHECK([scene isKindOfClass:[UIWindowScene class]]);
+  UIWindowScene* windowScene = static_cast<UIWindowScene*>(scene);
+  for (UIWindow* window in windowScene.windows) {
+    if ([window isKeyWindow]) {
+      original_key_window_ = window;
     }
-    DCHECK(original_key_window_);
-    current_key_window_ = [[UIWindow alloc] initWithWindowScene:windowScene];
   }
+  DCHECK(original_key_window_);
+  current_key_window_ = [[UIWindow alloc] initWithWindowScene:windowScene];
   if (!current_key_window_) {
     current_key_window_ =
         [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
diff --git a/ios/web_view/internal/translate/web_view_translate_client.mm b/ios/web_view/internal/translate/web_view_translate_client.mm
index 3789dc5..61a20e11 100644
--- a/ios/web_view/internal/translate/web_view_translate_client.mm
+++ b/ios/web_view/internal/translate/web_view_translate_client.mm
@@ -50,9 +50,7 @@
     translate::TranslateAcceptLanguages* accept_languages)
     : pref_service_(pref_service),
       translate_manager_(this, translate_ranker, language_model),
-      translate_driver_(web_state,
-                        web_state->GetNavigationManager(),
-                        &translate_manager_),
+      translate_driver_(web_state, &translate_manager_),
       accept_languages_(accept_languages) {
   DCHECK(pref_service_);
   DCHECK(accept_languages_);
diff --git a/ipc/ipc_message_unittest.cc b/ipc/ipc_message_unittest.cc
index 22388c86..b9dfd39 100644
--- a/ipc/ipc_message_unittest.cc
+++ b/ipc/ipc_message_unittest.cc
@@ -117,7 +117,7 @@
   base::PickleIterator iter(msg);
   EXPECT_TRUE(IPC::ReadParam(&msg, &iter, &output));
 
-  EXPECT_TRUE(input.Equals(&output));
+  EXPECT_EQ(input, output);
 
   // Also test the corrupt case.
   IPC::Message bad_msg(1, 2, IPC::Message::PRIORITY_NORMAL);
@@ -152,7 +152,7 @@
   base::PickleIterator iter(msg);
   EXPECT_TRUE(IPC::ReadParam(&msg, &iter, &output));
 
-  EXPECT_TRUE(input.Equals(&output));
+  EXPECT_EQ(input, output);
 
   // Also test the corrupt case.
   IPC::Message bad_msg(1, 2, IPC::Message::PRIORITY_NORMAL);
diff --git a/media/gpu/chromeos/image_processor.cc b/media/gpu/chromeos/image_processor.cc
index 12e9d2c..26d17ae 100644
--- a/media/gpu/chromeos/image_processor.cc
+++ b/media/gpu/chromeos/image_processor.cc
@@ -65,7 +65,7 @@
     CreateBackendCB create_backend_cb,
     const PortConfig& input_config,
     const PortConfig& output_config,
-    const std::vector<OutputMode>& preferred_output_modes,
+    OutputMode output_mode,
     VideoRotation relative_rotation,
     ErrorCB error_cb,
     scoped_refptr<base::SequencedTaskRunner> client_task_runner) {
@@ -75,7 +75,7 @@
       base::IgnoreResult(&base::SequencedTaskRunner::PostTask),
       client_task_runner, FROM_HERE, std::move(error_cb));
   std::unique_ptr<ImageProcessorBackend> backend = create_backend_cb.Run(
-      input_config, output_config, preferred_output_modes, relative_rotation,
+      input_config, output_config, output_mode, relative_rotation,
       std::move(wrapped_error_cb), backend_task_runner);
   if (!backend)
     return nullptr;
diff --git a/media/gpu/chromeos/image_processor.h b/media/gpu/chromeos/image_processor.h
index ab331e2..7827a4e7 100644
--- a/media/gpu/chromeos/image_processor.h
+++ b/media/gpu/chromeos/image_processor.h
@@ -55,7 +55,7 @@
       base::RepeatingCallback<std::unique_ptr<ImageProcessorBackend>(
           const PortConfig& input_config,
           const PortConfig& output_config,
-          const std::vector<OutputMode>& preferred_output_modes,
+          OutputMode output_mode,
           VideoRotation relative_rotation,
           ErrorCB error_cb,
           scoped_refptr<base::SequencedTaskRunner> backend_task_runner)>;
@@ -64,7 +64,7 @@
       CreateBackendCB create_backend_cb,
       const PortConfig& input_config,
       const PortConfig& output_config,
-      const std::vector<OutputMode>& preferred_output_modes,
+      OutputMode output_mode,
       VideoRotation relative_rotation,
       ErrorCB error_cb,
       scoped_refptr<base::SequencedTaskRunner> client_task_runner);
diff --git a/media/gpu/chromeos/image_processor_factory.cc b/media/gpu/chromeos/image_processor_factory.cc
index 5d7a23377..70da081 100644
--- a/media/gpu/chromeos/image_processor_factory.cc
+++ b/media/gpu/chromeos/image_processor_factory.cc
@@ -76,7 +76,7 @@
       {VideoFrame::STORAGE_GPU_MEMORY_BUFFER});
   return ImageProcessor::Create(
       base::BindRepeating(&VaapiImageProcessorBackend::Create), input_config,
-      output_config, {ImageProcessor::OutputMode::IMPORT}, VIDEO_ROTATION_0,
+      output_config, ImageProcessor::OutputMode::IMPORT, VIDEO_ROTATION_0,
       std::move(error_cb), std::move(client_task_runner));
 }
 #endif  // BUILDFLAG(USE_VAAPI)
@@ -158,7 +158,7 @@
 std::unique_ptr<ImageProcessor> ImageProcessorFactory::Create(
     const ImageProcessor::PortConfig& input_config,
     const ImageProcessor::PortConfig& output_config,
-    const std::vector<ImageProcessor::OutputMode>& preferred_output_modes,
+    ImageProcessor::OutputMode output_mode,
     size_t num_buffers,
     VideoRotation relative_rotation,
     scoped_refptr<base::SequencedTaskRunner> client_task_runner,
@@ -176,10 +176,9 @@
 
   std::unique_ptr<ImageProcessor> image_processor;
   for (auto& create_func : create_funcs) {
-    image_processor =
-        ImageProcessor::Create(std::move(create_func), input_config,
-                               output_config, preferred_output_modes,
-                               relative_rotation, error_cb, client_task_runner);
+    image_processor = ImageProcessor::Create(
+        std::move(create_func), input_config, output_config, output_mode,
+        relative_rotation, error_cb, client_task_runner);
     if (image_processor)
       return image_processor;
   }
diff --git a/media/gpu/chromeos/image_processor_factory.h b/media/gpu/chromeos/image_processor_factory.h
index 38c38078..6439bcdf 100644
--- a/media/gpu/chromeos/image_processor_factory.h
+++ b/media/gpu/chromeos/image_processor_factory.h
@@ -31,30 +31,13 @@
   // Given input and output PortConfig, it tries to find out the most suitable
   // ImageProcessor to be used for the current platform.
   //
-  // For |preferred_output_modes|, it tries instantiate an ImageProcessor class
-  // with an output mode in sequence. With ImageProcessor subclass and output
-  // mode selected, the subclass' factory method will pick the first supported
-  // input and output storage type from input and output PortConfig,
-  // respectively. It has an assumption that the selection of output mode is
-  // independent from the selection of output storage type.
-  //
-  // TODO(crbug.com/907767): Remove |preferred_output_modes| once ImageProcessor
-  // only accepts IMPORT output mode.
-  //
-  // Args:
-  //   input_config: input PortConfig.
-  //   output_config: output PortConfig.
-  //   preferred_output_modes: list of preferred output modes.
-  //   num_buffers: number of input and output buffers.
-  //   error_cb: Callback when error occurs.
-  //
   // Returns:
   //   Most suitable ImageProcessor instance. nullptr if no ImageProcessor
   //   is available for given parameters on current platform.
   static std::unique_ptr<ImageProcessor> Create(
       const ImageProcessor::PortConfig& input_config,
       const ImageProcessor::PortConfig& output_config,
-      const std::vector<ImageProcessor::OutputMode>& preferred_output_modes,
+      ImageProcessor::OutputMode output_mode,
       size_t num_buffers,
       VideoRotation relative_rotation,
       scoped_refptr<base::SequencedTaskRunner> client_task_runner,
diff --git a/media/gpu/chromeos/libyuv_image_processor_backend.cc b/media/gpu/chromeos/libyuv_image_processor_backend.cc
index ab634539..641edf3 100644
--- a/media/gpu/chromeos/libyuv_image_processor_backend.cc
+++ b/media/gpu/chromeos/libyuv_image_processor_backend.cc
@@ -164,11 +164,13 @@
 std::unique_ptr<ImageProcessorBackend> LibYUVImageProcessorBackend::Create(
     const PortConfig& input_config,
     const PortConfig& output_config,
-    const std::vector<OutputMode>& preferred_output_modes,
+    OutputMode output_mode,
     VideoRotation relative_rotation,
     ErrorCB error_cb,
     scoped_refptr<base::SequencedTaskRunner> backend_task_runner) {
   VLOGF(2);
+  DCHECK_EQ(output_mode, OutputMode::IMPORT)
+      << "Only OutputMode::IMPORT supported";
 
   std::unique_ptr<VideoFrameMapper> input_frame_mapper;
   // LibYUVImageProcessorBackend supports only memory-based video frame for
@@ -218,11 +220,6 @@
     return nullptr;
   }
 
-  if (!base::Contains(preferred_output_modes, OutputMode::IMPORT)) {
-    VLOGF(2) << "Only support OutputMode::IMPORT";
-    return nullptr;
-  }
-
   const gfx::Size& input_size = input_config.visible_rect.size();
   const gfx::Size& output_size = output_config.visible_rect.size();
   Transform transform = Transform::kConversion;
diff --git a/media/gpu/chromeos/libyuv_image_processor_backend.h b/media/gpu/chromeos/libyuv_image_processor_backend.h
index 208b7e22..02187f2 100644
--- a/media/gpu/chromeos/libyuv_image_processor_backend.h
+++ b/media/gpu/chromeos/libyuv_image_processor_backend.h
@@ -30,7 +30,7 @@
   static std::unique_ptr<ImageProcessorBackend> Create(
       const PortConfig& input_config,
       const PortConfig& output_config,
-      const std::vector<OutputMode>& preferred_output_modes,
+      OutputMode output_mode,
       VideoRotation relative_rotation,
       ErrorCB error_cb,
       scoped_refptr<base::SequencedTaskRunner> backend_task_runner);
diff --git a/media/gpu/test/image_processor/image_processor_client.cc b/media/gpu/test/image_processor/image_processor_client.cc
index 2c32b720..a2d70d4f 100644
--- a/media/gpu/test/image_processor/image_processor_client.cc
+++ b/media/gpu/test/image_processor/image_processor_client.cc
@@ -126,7 +126,7 @@
   // base::Unretained(this) for ErrorCB is safe here because the callback is
   // executed on |image_processor_client_thread_| which is owned by this class.
   image_processor_ = ImageProcessorFactory::Create(
-      input_config, output_config, {ImageProcessor::OutputMode::IMPORT},
+      input_config, output_config, ImageProcessor::OutputMode::IMPORT,
       num_buffers, relative_rotation,
       image_processor_client_thread_.task_runner(),
       base::BindRepeating(&ImageProcessorClient::NotifyError,
diff --git a/media/gpu/v4l2/v4l2_image_processor_backend.cc b/media/gpu/v4l2/v4l2_image_processor_backend.cc
index 07bc62a..867616d 100644
--- a/media/gpu/v4l2/v4l2_image_processor_backend.cc
+++ b/media/gpu/v4l2/v4l2_image_processor_backend.cc
@@ -229,7 +229,7 @@
     size_t num_buffers,
     const PortConfig& input_config,
     const PortConfig& output_config,
-    const std::vector<OutputMode>& preferred_output_modes,
+    OutputMode output_mode,
     VideoRotation relative_rotation,
     ErrorCB error_cb,
     scoped_refptr<base::SequencedTaskRunner> backend_task_runner) {
@@ -246,15 +246,9 @@
     return nullptr;
   }
 
-  for (const auto& output_mode : preferred_output_modes) {
-    auto image_processor = V4L2ImageProcessorBackend::CreateWithOutputMode(
-        device, num_buffers, input_config, output_config, output_mode,
-        relative_rotation, error_cb, backend_task_runner);
-    if (image_processor)
-      return image_processor;
-  }
-
-  return nullptr;
+  return V4L2ImageProcessorBackend::CreateWithOutputMode(
+      device, num_buffers, input_config, output_config, output_mode,
+      relative_rotation, error_cb, backend_task_runner);
 }
 
 // static
@@ -315,11 +309,6 @@
     return nullptr;
   }
 
-  const v4l2_memory output_memory_type =
-      output_mode == OutputMode::ALLOCATE
-          ? V4L2_MEMORY_MMAP
-          : InputStorageTypeToV4L2Memory(output_storage_type);
-
   if (!device->IsImageProcessingSupported()) {
     VLOGF(1) << "V4L2ImageProcessorBackend not supported in this platform";
     return nullptr;
@@ -404,6 +393,10 @@
     output_planes[i].size = pix_mp.plane_fmt[i].sizeimage;
   }
 
+  const v4l2_memory output_memory_type =
+      output_mode == OutputMode::ALLOCATE
+          ? V4L2_MEMORY_MMAP
+          : InputStorageTypeToV4L2Memory(output_storage_type);
   std::unique_ptr<V4L2ImageProcessorBackend> image_processor(
       new V4L2ImageProcessorBackend(
           backend_task_runner, std::move(device),
diff --git a/media/gpu/v4l2/v4l2_image_processor_backend.h b/media/gpu/v4l2/v4l2_image_processor_backend.h
index 6dcab523..df5e9e1 100644
--- a/media/gpu/v4l2/v4l2_image_processor_backend.h
+++ b/media/gpu/v4l2/v4l2_image_processor_backend.h
@@ -47,7 +47,7 @@
       size_t num_buffers,
       const PortConfig& input_config,
       const PortConfig& output_config,
-      const std::vector<OutputMode>& preferred_output_modes,
+      OutputMode output_mode,
       VideoRotation relative_rotation,
       ErrorCB error_cb,
       scoped_refptr<base::SequencedTaskRunner> backend_task_runner);
diff --git a/media/gpu/v4l2/v4l2_vda_helpers.cc b/media/gpu/v4l2/v4l2_vda_helpers.cc
index aae4e7a1..f256190 100644
--- a/media/gpu/v4l2/v4l2_vda_helpers.cc
+++ b/media/gpu/v4l2/v4l2_vda_helpers.cc
@@ -90,7 +90,7 @@
                                  visible_rect, {VideoFrame::STORAGE_DMABUFS}),
       ImageProcessor::PortConfig(ip_output_format, ip_output_coded_size, {},
                                  visible_rect, {output_storage_type}),
-      {image_processor_output_mode}, VIDEO_ROTATION_0, std::move(error_cb),
+      image_processor_output_mode, VIDEO_ROTATION_0, std::move(error_cb),
       std::move(client_task_runner));
   if (!image_processor)
     return nullptr;
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
index 702fa0d..46ac323 100644
--- a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
+++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
@@ -422,7 +422,7 @@
   }
 
   image_processor_ = ImageProcessorFactory::Create(
-      *input_config, *output_config, {ImageProcessor::OutputMode::IMPORT},
+      *input_config, *output_config, ImageProcessor::OutputMode::IMPORT,
       kImageProcBufferCount, VIDEO_ROTATION_0, encoder_task_runner_,
       base::BindRepeating(&V4L2VideoEncodeAccelerator::ImageProcessorError,
                           weak_this_));
diff --git a/media/gpu/vaapi/vaapi_image_processor_backend.cc b/media/gpu/vaapi/vaapi_image_processor_backend.cc
index 2266228..8647055 100644
--- a/media/gpu/vaapi/vaapi_image_processor_backend.cc
+++ b/media/gpu/vaapi/vaapi_image_processor_backend.cc
@@ -62,10 +62,12 @@
 std::unique_ptr<ImageProcessorBackend> VaapiImageProcessorBackend::Create(
     const PortConfig& input_config,
     const PortConfig& output_config,
-    const std::vector<OutputMode>& preferred_output_modes,
+    OutputMode output_mode,
     VideoRotation relative_rotation,
     ErrorCB error_cb,
     scoped_refptr<base::SequencedTaskRunner> backend_task_runner) {
+  DCHECK_EQ(output_mode, OutputMode::IMPORT)
+      << "Only OutputMode::IMPORT supported";
 // VaapiImageProcessorBackend supports ChromeOS only.
 #if !BUILDFLAG(IS_CHROMEOS)
   return nullptr;
@@ -90,11 +92,6 @@
     return nullptr;
   }
 
-  if (!base::Contains(preferred_output_modes, OutputMode::IMPORT)) {
-    VLOGF(2) << "VaapiImageProcessorBackend only supports IMPORT mode.";
-    return nullptr;
-  }
-
   // We should restrict the acceptable PortConfig for input and output both to
   // the one returned by GetPlatformVideoFrameLayout(). However,
   // ImageProcessorFactory interface doesn't provide information about what
diff --git a/media/gpu/vaapi/vaapi_image_processor_backend.h b/media/gpu/vaapi/vaapi_image_processor_backend.h
index 5186b45..e218050 100644
--- a/media/gpu/vaapi/vaapi_image_processor_backend.h
+++ b/media/gpu/vaapi/vaapi_image_processor_backend.h
@@ -34,7 +34,7 @@
   static std::unique_ptr<ImageProcessorBackend> Create(
       const PortConfig& input_config,
       const PortConfig& output_config,
-      const std::vector<OutputMode>& preferred_output_modes,
+      OutputMode output_mode,
       VideoRotation relative_rotation,
       ErrorCB error_cb,
       scoped_refptr<base::SequencedTaskRunner> backend_task_runner);
diff --git a/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc b/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc
index b9f0f98..95beb54f 100644
--- a/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc
@@ -244,7 +244,7 @@
   // (i.e., |decoder_thread_|) and we control the lifetime of |decoder_thread_|.
   // Therefore, base::Unretained(this) is safe.
   image_processor_ = LibYUVImageProcessorBackend::Create(
-      input_config, output_config, {ImageProcessorBackend::OutputMode::IMPORT},
+      input_config, output_config, ImageProcessorBackend::OutputMode::IMPORT,
       VIDEO_ROTATION_0,
       base::BindRepeating(&VaapiMjpegDecodeAccelerator::OnImageProcessorError,
                           base::Unretained(this)),
diff --git a/net/base/io_buffer.cc b/net/base/io_buffer.cc
index a226610..cb133519 100644
--- a/net/base/io_buffer.cc
+++ b/net/base/io_buffer.cc
@@ -34,8 +34,7 @@
 }
 
 IOBuffer::~IOBuffer() {
-  delete[] data_;
-  data_ = nullptr;
+  data_.ClearAndDeleteArray();
 }
 
 IOBufferWithSize::IOBufferWithSize(size_t size) : IOBuffer(size), size_(size) {
diff --git a/pdf/mojom/pdf.mojom b/pdf/mojom/pdf.mojom
index 413fc74dd2e..a0db6d6 100644
--- a/pdf/mojom/pdf.mojom
+++ b/pdf/mojom/pdf.mojom
@@ -20,22 +20,6 @@
   SetSelectionBounds(gfx.mojom.PointF base, gfx.mojom.PointF extent);
 };
 
-// Renderer-side interface to access the PDF extension.
-// The browser passes the remote for this interface to the PDF renderer
-// associated with the PDF extension.
-interface PdfFindInPage {
-  // Sets the find-in-page tickmarks in the PDF extension UI.
-  SetTickmarks(array<gfx.mojom.Rect> tickmark);
-};
-
-// Renderer-side interface to retrieve the PdfFindInPage remote for a specific
-// RFH from a PDF extension. Only used by the browser to facilitate PDF renderer
-// to PDF extension communication.
-interface PdfFindInPageFactory {
-  // Retrieves the remote to pass to the PDF renderer.
-  GetPdfFindInPage() => (pending_remote<PdfFindInPage> find_remote);
-};
-
 // Browser-side interface shared by PDF plugins and PDF renderers.
 interface PdfService {
   SetListener(pending_remote<PdfListener> client);
@@ -56,8 +40,4 @@
 
   // Notifies the embedder know the plugin can handle save commands internally.
   SetPluginCanSave(bool can_save);
-
-  // Retrieves the PdfFindInPage remote. Only used by PDF renderers.
-  [Sync]
-  GetPdfFindInPage() => (pending_remote<PdfFindInPage> find_remote);
 };
diff --git a/pdf/pdf_view_web_plugin.cc b/pdf/pdf_view_web_plugin.cc
index 510d93be..a6b47af 100644
--- a/pdf/pdf_view_web_plugin.cc
+++ b/pdf/pdf_view_web_plugin.cc
@@ -933,8 +933,6 @@
 
 void PdfViewWebPlugin::NotifyFindTickmarks(
     const std::vector<gfx::Rect>& tickmarks) {
-  // TODO(crbug.com/1278476): Clean up `PdfFindInPage::SetTickmarks()` once
-  // plugin frame scrolling is stable.
   container_wrapper_->ReportFindInPageTickmarks(tickmarks);
 }
 
diff --git a/pdf/pdf_view_web_plugin.h b/pdf/pdf_view_web_plugin.h
index 784327b..b4879fd 100644
--- a/pdf/pdf_view_web_plugin.h
+++ b/pdf/pdf_view_web_plugin.h
@@ -16,7 +16,6 @@
 #include "cc/paint/paint_image.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
-#include "mojo/public/cpp/bindings/remote.h"
 #include "pdf/mojom/pdf.mojom.h"
 #include "pdf/pdf_accessibility_action_handler.h"
 #include "pdf/pdf_view_plugin_base.h"
@@ -383,9 +382,6 @@
   // May be unbound in unit tests.
   mojo::AssociatedRemote<pdf::mojom::PdfService> const pdf_service_remote_;
 
-  // Used to access find-in-page interface provided by the PDF extension.
-  mojo::Remote<pdf::mojom::PdfFindInPage> find_remote_;
-
   mojo::Receiver<pdf::mojom::PdfListener> listener_receiver_{this};
 
   // The id of the current find operation, or -1 if no current operation is
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 1407277..662259d 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -5366,7 +5366,7 @@
             ]
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 25
+          "shards": 36
         },
         "test_id_prefix": "ninja://chrome/android:chrome_public_wpt/"
       }
@@ -6078,7 +6078,7 @@
             ]
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 25
+          "shards": 32
         },
         "test_id_prefix": "ninja://weblayer/shell/android:weblayer_shell_wpt/"
       }
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 6d39399c..7e0bf2e1 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -11344,41 +11344,6 @@
       },
       {
         "args": [
-          "--num-retries=3",
-          "--no-xvfb",
-          "--fuzzy-diff",
-          "--skipped=always",
-          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter",
-          "--flag-specific=skia-gl"
-        ],
-        "isolate_name": "blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "skia_renderer_gl_blink_web_tests",
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:blink_web_tests/"
-      },
-      {
-        "args": [
           "pixel",
           "--show-stdout",
           "--browser=release",
@@ -11423,42 +11388,6 @@
       },
       {
         "args": [
-          "--num-retries=3",
-          "--no-xvfb",
-          "--fuzzy-diff",
-          "--skipped=always",
-          "--driver-logging",
-          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter",
-          "--flag-specific=skia-vulkan-native"
-        ],
-        "isolate_name": "blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "vulkan_native_blink_web_tests",
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:blink_web_tests/"
-      },
-      {
-        "args": [
           "pixel",
           "--show-stdout",
           "--browser=release",
@@ -11756,41 +11685,6 @@
       },
       {
         "args": [
-          "--num-retries=3",
-          "--no-xvfb",
-          "--fuzzy-diff",
-          "--skipped=always",
-          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter",
-          "--flag-specific=skia-gl"
-        ],
-        "isolate_name": "blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "skia_renderer_gl_blink_web_tests",
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-440.100",
-              "os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:blink_web_tests/"
-      },
-      {
-        "args": [
           "pixel",
           "--show-stdout",
           "--browser=release",
@@ -11835,42 +11729,6 @@
       },
       {
         "args": [
-          "--num-retries=3",
-          "--no-xvfb",
-          "--fuzzy-diff",
-          "--skipped=always",
-          "--driver-logging",
-          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter",
-          "--flag-specific=skia-vulkan-native"
-        ],
-        "isolate_name": "blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "vulkan_native_blink_web_tests",
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-440.100",
-              "os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:blink_web_tests/"
-      },
-      {
-        "args": [
           "pixel",
           "--show-stdout",
           "--browser=release",
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 609a0d0..132c858 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -574,7 +574,7 @@
           '--log-wptreport',
         ],
         'swarming': {
-          'shards': 25,
+          'shards': 36,
           'expiration': 18000,
           'hard_timeout': 14400,
         },
@@ -2500,61 +2500,6 @@
       },
     },
 
-    'gpu_blink_web_tests_skia_renderer': {
-      'skia_renderer_gl_blink_web_tests': {
-        # layout test failures are retried 3 times when '--test-list' is not
-        # passed, but 0 times when '--test-list' is passed. We want to always
-        # retry 3 times, so we explicitly specify it.
-        'args': [
-          '--num-retries=3',
-          '--no-xvfb',
-          '--fuzzy-diff',
-          '--skipped=always',
-          '--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter',
-          '--flag-specific=skia-gl',
-        ],
-        'isolate_name': 'blink_web_tests',
-        'merge': {
-          'args': [
-            '--verbose',
-          ],
-          'script': '//third_party/blink/tools/merge_web_test_results.py',
-        },
-        'resultdb': {
-          'enable': True,
-        },
-        'results_handler': 'layout tests',
-      },
-    },
-
-    'gpu_blink_web_tests_vulkan': {
-      'vulkan_native_blink_web_tests': {
-        # layout test failures are retried 3 times when '--test-list' is not
-        # passed, but 0 times when '--test-list' is passed. We want to always
-        # retry 3 times, so we explicitly specify it.
-        'args': [
-          '--num-retries=3',
-          '--no-xvfb',
-          '--fuzzy-diff',
-          '--skipped=always',
-          '--driver-logging',
-          '--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter',
-          '--flag-specific=skia-vulkan-native',
-        ],
-        'isolate_name': 'blink_web_tests',
-        'merge': {
-          'args': [
-            '--verbose',
-          ],
-          'script': '//third_party/blink/tools/merge_web_test_results.py',
-        },
-        'resultdb': {
-          'enable': True,
-        },
-        'results_handler': 'layout tests',
-      },
-   },
-
     # The command buffer perf tests are only run on Windows.
     # They are mostly driver and platform independent.
     'gpu_command_buffer_perf_passthrough_isolated_scripts': {
@@ -5354,7 +5299,7 @@
     'weblayer_shell_wpt': {
       'weblayer_shell_wpt': {
         'swarming': {
-          'shards': 25,
+          'shards': 32,
           'expiration': 18000,
           'hard_timeout': 14400,
         },
@@ -6327,11 +6272,6 @@
       'gpu_angle_white_box_gtests',
     ],
 
-    'gpu_blink_web_tests': [
-      'gpu_blink_web_tests_skia_renderer',
-      'gpu_blink_web_tests_vulkan',
-    ],
-
     'gpu_chromeos_telemetry_tests': [
       'gpu_webgl_conformance_telemetry_tests',
     ],
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 822d34eb..a52ff8d 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -4325,7 +4325,6 @@
               ],
               'test_suites': {
                       'gtest_tests': 'gpu_fyi_vulkan_gtests',
-                      'isolated_scripts': 'gpu_blink_web_tests',
                       'gpu_telemetry_tests': 'gpu_skia_renderer_telemetry_tests',
               },
       },
@@ -4337,7 +4336,6 @@
               ],
               'test_suites': {
                       'gtest_tests': 'gpu_fyi_vulkan_gtests',
-                      'isolated_scripts': 'gpu_blink_web_tests',
                       'gpu_telemetry_tests': 'gpu_skia_renderer_telemetry_tests',
               },
       },
diff --git a/testing/scripts/wpt_android_lib.py b/testing/scripts/wpt_android_lib.py
index 50a4ee8..0082bdc 100644
--- a/testing/scripts/wpt_android_lib.py
+++ b/testing/scripts/wpt_android_lib.py
@@ -118,6 +118,9 @@
       '--no-pause-after-test',
       '--no-capture-stdio',
       '--no-manifest-download',
+      # Exclude webdriver tests for now.
+      "--exclude=webdriver",
+      "--exclude=infrastructure/webdriver",
       '--binary-arg=--enable-blink-features=MojoJS,MojoJSTest',
       '--binary-arg=--enable-blink-test-features',
       '--binary-arg=--disable-field-trial-config',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 57a9ef2..02d51fff 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -154,45 +154,6 @@
             ]
         }
     ],
-    "AndroidInProductHelpPwaInstall": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "WithToolbar",
-                    "params": {
-                        "availability": "any",
-                        "event_trigger": "name:pwa_install_iph_trigger;comparator:<10;window:1;storage:360",
-                        "event_used": "name:pwa_install_menu_clicked;comparator:<3;window:90;storage:360",
-                        "session_rate": "any",
-                        "session_rate_impact": "none",
-                        "x_iph_replaces_toolbar": "false",
-                        "x_min_engagement_for_iph": "2"
-                    },
-                    "enable_features": [
-                        "IPH_PwaInstallAvailableFeature"
-                    ]
-                },
-                {
-                    "name": "WithoutToolbar",
-                    "params": {
-                        "availability": "any",
-                        "event_trigger": "name:pwa_install_iph_trigger;comparator:<10;window:1;storage:360",
-                        "event_used": "name:pwa_install_menu_clicked;comparator:<3;window:90;storage:360",
-                        "session_rate": "any",
-                        "session_rate_impact": "none",
-                        "x_iph_replaces_toolbar": "true",
-                        "x_min_engagement_for_iph": "2"
-                    },
-                    "enable_features": [
-                        "IPH_PwaInstallAvailableFeature"
-                    ]
-                }
-            ]
-        }
-    ],
     "AndroidMediaPickerVideoSupport": [
         {
             "platforms": [
@@ -1750,6 +1711,21 @@
             ]
         }
     ],
+    "CleanUndecryptablePasswordsLinuxDuringInitialSync": [
+        {
+            "platforms": [
+                "linux"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "SyncUndecryptablePasswordsLinux"
+                    ]
+                }
+            ]
+        }
+    ],
     "CombinedNavigationOptimizations": [
         {
             "platforms": [
@@ -2249,6 +2225,7 @@
                         "NtpChromeCartModuleAbandonedCartDiscountParam": "true",
                         "NtpChromeCartModuleAbandonedCartDiscountUseUtmParam": "true",
                         "NtpChromeCartModuleHeuristicsImprovementParam": "true",
+                        "NtpDriveModuleExperimentGroupParam": "foo:bar",
                         "NtpModulesLoadTimeoutMillisecondsParam": "3000",
                         "NtpModulesOrderParam": "",
                         "discount-fetch-delay": "1h"
@@ -3554,24 +3531,6 @@
             ]
         }
     ],
-    "InstalledAppsInCbd": [
-        {
-            "platforms": [
-                "chromeos",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "InstalledAppsInCbd"
-                    ]
-                }
-            ]
-        }
-    ],
     "KeyboardAccessoryAddressIPH": [
         {
             "platforms": [
@@ -5946,25 +5905,6 @@
             ]
         }
     ],
-    "TabToGTSAnimation": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "params": {
-                        "zooming-min-memory-mb": "2048",
-                        "zooming-min-sdk-version": "23"
-                    },
-                    "enable_features": [
-                        "TabToGTSAnimation"
-                    ]
-                }
-            ]
-        }
-    ],
     "TailoredSecurityIntegration": [
         {
             "platforms": [
diff --git a/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc b/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc
index 386ce09d..e7aa066 100644
--- a/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc
+++ b/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc
@@ -219,6 +219,7 @@
   out->always_show_focus = data.always_show_focus();
   out->touch_drag_drop_enabled = data.touch_drag_drop_enabled();
   out->webxr_immersive_ar_allowed = data.webxr_immersive_ar_allowed();
+  out->window_placement_always_allowed = data.window_placement_always_allowed();
   return true;
 }
 
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 32ffa12..b5d1f788 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -363,6 +363,7 @@
     "web/web_pepper_socket.h",
     "web/web_pepper_socket_client.h",
     "web/web_performance.h",
+    "web/web_picture_in_picture_window_options.h",
     "web/web_plugin.h",
     "web/web_plugin_container.h",
     "web/web_plugin_document.h",
diff --git a/third_party/blink/public/common/web_preferences/web_preferences.h b/third_party/blink/public/common/web_preferences/web_preferences.h
index 8509f72..da04249 100644
--- a/third_party/blink/public/common/web_preferences/web_preferences.h
+++ b/third_party/blink/public/common/web_preferences/web_preferences.h
@@ -352,6 +352,10 @@
   // change depending on the enterprise policy if the platform supports it.
   bool webxr_immersive_ar_allowed = true;
 
+  // By default, window placement requires a user to set a content setting,
+  // but enterprise policy can automatically allow this feature for all sites.
+  bool window_placement_always_allowed = false;
+
   // We try to keep the default values the same as the default values in
   // chrome, except for the cases where it would require lots of extra work for
   // the embedder to use the same default value.
diff --git a/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h b/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h
index a6291be..ecce299 100644
--- a/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h
+++ b/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h
@@ -762,6 +762,11 @@
     return r.webxr_immersive_ar_allowed;
   }
 
+  static bool window_placement_always_allowed(
+      const blink::web_pref::WebPreferences& r) {
+    return r.window_placement_always_allowed;
+  }
+
   static bool Read(blink::mojom::WebPreferencesDataView r,
                    blink::web_pref::WebPreferences* out);
 };
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index b79a6ed..e21f78eb 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -3471,6 +3471,7 @@
   kPrivateNetworkAccessWithinWorker = 4150,
   kClientHintsUAWoW64 = 4151,
   kFetchSetCookieInRequestGuardedHeaders = 4152,
+  kV8Window_RequestPictureInPictureWindow_Method = 4153,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/mojom/webpreferences/web_preferences.mojom b/third_party/blink/public/mojom/webpreferences/web_preferences.mojom
index c09e8c49..72e130d 100644
--- a/third_party/blink/public/mojom/webpreferences/web_preferences.mojom
+++ b/third_party/blink/public/mojom/webpreferences/web_preferences.mojom
@@ -435,4 +435,8 @@
 
   // Controls whether WebXR's immersive-ar is allowed.
   bool webxr_immersive_ar_allowed;
+
+  // Controls whether the window-placement permission is automatically granted
+  // to all sites, according to enterprise policy.
+  bool window_placement_always_allowed;
 };
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h
index 507efab2..f2b597e 100644
--- a/third_party/blink/public/web/web_local_frame_client.h
+++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -653,10 +653,13 @@
   // Notifies the embedder that a WebAXObject is dirty and its state needs
   // to be serialized again. If |subtree| is true, the entire subtree is
   // dirty.
-  virtual void MarkWebAXObjectDirty(
-      const WebAXObject&,
-      bool subtree,
-      ax::mojom::Action event_from_action = ax::mojom::Action::kNone) {}
+  // |event_from| and |event_from_action| annotate this node change with info
+  // about the event which caused the change. For example, an event from a user
+  // or an event from a focus action.
+  virtual void MarkWebAXObjectDirty(const WebAXObject&,
+                                    bool subtree,
+                                    ax::mojom::EventFrom event_from,
+                                    ax::mojom::Action event_from_action) {}
 
   // Audio Output Devices API --------------------------------------------
 
diff --git a/third_party/blink/public/web/web_navigation_policy.h b/third_party/blink/public/web/web_navigation_policy.h
index 330e719..d4b3e0e 100644
--- a/third_party/blink/public/web/web_navigation_policy.h
+++ b/third_party/blink/public/web/web_navigation_policy.h
@@ -40,6 +40,10 @@
   kWebNavigationPolicyNewForegroundTab,
   kWebNavigationPolicyNewWindow,
   kWebNavigationPolicyNewPopup,
+
+  // The navigation request is for a Picture-in-Picture window opened via
+  // |window.requestPictureInPictureWindow()|.
+  kWebNavigationPolicyPictureInPicture,
 };
 
 }  // namespace blink
diff --git a/third_party/blink/public/web/web_picture_in_picture_window_options.h b/third_party/blink/public/web/web_picture_in_picture_window_options.h
new file mode 100644
index 0000000..7a071c48
--- /dev/null
+++ b/third_party/blink/public/web/web_picture_in_picture_window_options.h
@@ -0,0 +1,19 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_PICTURE_IN_PICTURE_WINDOW_OPTIONS_H_
+#define THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_PICTURE_IN_PICTURE_WINDOW_OPTIONS_H_
+
+#include "ui/gfx/geometry/size.h"
+
+namespace blink {
+
+struct WebPictureInPictureWindowOptions {
+  gfx::Size size;
+  bool constrain_aspect_ratio = false;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_PICTURE_IN_PICTURE_WINDOW_OPTIONS_H_
diff --git a/third_party/blink/public/web/web_settings.h b/third_party/blink/public/web/web_settings.h
index 35e1ee68..3211c5b 100644
--- a/third_party/blink/public/web/web_settings.h
+++ b/third_party/blink/public/web/web_settings.h
@@ -282,6 +282,7 @@
   virtual void SetAccessibilityIncludeSvgGElement(bool) = 0;
   virtual void SetWebXRImmersiveArAllowed(bool) = 0;
   virtual void SetLitePageSubresourceRedirectOrigin(const WebString&) = 0;
+  virtual void SetWindowPlacementAlwaysAllowed(bool) = 0;
 
  protected:
   ~WebSettings() = default;
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni
index 0f2ce99..acc6383 100644
--- a/third_party/blink/renderer/bindings/generated_in_modules.gni
+++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -725,6 +725,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_picture_in_picture_event_init.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_picture_in_picture_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_picture_in_picture_options.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_picture_in_picture_window_options.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_picture_in_picture_window_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_plane_layout.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_plane_layout.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_point_2d.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni
index 91f11ff..8f22afbe 100644
--- a/third_party/blink/renderer/bindings/idl_in_modules.gni
+++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -588,7 +588,9 @@
           "//third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_event_init.idl",
           "//third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_options.idl",
           "//third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_window.idl",
+          "//third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_window_options.idl",
           "//third_party/blink/renderer/modules/picture_in_picture/shadow_root_picture_in_picture.idl",
+          "//third_party/blink/renderer/modules/picture_in_picture/window_picture_in_picture.idl",
           "//third_party/blink/renderer/modules/plugins/mime_type.idl",
           "//third_party/blink/renderer/modules/plugins/mime_type_array.idl",
           "//third_party/blink/renderer/modules/plugins/navigator_plugins.idl",
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.cc b/third_party/blink/renderer/core/exported/web_settings_impl.cc
index b541569..e13944b 100644
--- a/third_party/blink/renderer/core/exported/web_settings_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_settings_impl.cc
@@ -804,4 +804,8 @@
   settings_->SetLitePageSubresourceRedirectOrigin(origin);
 }
 
+void WebSettingsImpl::SetWindowPlacementAlwaysAllowed(bool allow) {
+  settings_->SetWindowPlacementAlwaysAllowed(allow);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.h b/third_party/blink/renderer/core/exported/web_settings_impl.h
index 910d094..838d3f17 100644
--- a/third_party/blink/renderer/core/exported/web_settings_impl.h
+++ b/third_party/blink/renderer/core/exported/web_settings_impl.h
@@ -230,6 +230,7 @@
   void SetAccessibilityIncludeSvgGElement(bool) override;
   void SetWebXRImmersiveArAllowed(bool webxr_immersive_ar_allowed) override;
   void SetLitePageSubresourceRedirectOrigin(const WebString&) override;
+  void SetWindowPlacementAlwaysAllowed(bool) override;
 
   bool RenderVSyncNotificationEnabled() const {
     return render_v_sync_notification_enabled_;
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index b95a437..861894c 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -391,6 +391,8 @@
       return ui::mojom::blink::WindowOpenDisposition::NEW_WINDOW;
     case kNavigationPolicyNewPopup:
       return ui::mojom::blink::WindowOpenDisposition::NEW_POPUP;
+    case kNavigationPolicyPictureInPicture:
+      return ui::mojom::blink::WindowOpenDisposition::NEW_POPUP;
   }
   NOTREACHED() << "Unexpected NavigationPolicy";
   return ui::mojom::blink::WindowOpenDisposition::IGNORE_ACTION;
@@ -1789,6 +1791,8 @@
   settings->SetTouchDragDropEnabled(prefs.touch_drag_drop_enabled);
   settings->SetTouchDragEndContextMenu(prefs.touch_dragend_context_menu);
   settings->SetWebXRImmersiveArAllowed(prefs.webxr_immersive_ar_allowed);
+  settings->SetWindowPlacementAlwaysAllowed(
+      prefs.window_placement_always_allowed);
 
 #if BUILDFLAG(IS_MAC)
   web_view_impl->SetMaximumLegibleScale(
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc
index 60630f03..c5a05cb 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.cc
+++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -43,6 +43,7 @@
 #include "third_party/blink/public/mojom/permissions_policy/policy_disposition.mojom-blink.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/task_type.h"
+#include "third_party/blink/public/web/web_picture_in_picture_window_options.h"
 #include "third_party/blink/renderer/bindings/core/v8/binding_security.h"
 #include "third_party/blink/renderer/bindings/core/v8/isolated_world_csp.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
@@ -2148,6 +2149,48 @@
   return result.frame->DomWindow();
 }
 
+DOMWindow* LocalDOMWindow::openPictureInPictureWindow(
+    v8::Isolate* isolate,
+    const WebPictureInPictureWindowOptions& options,
+    ExceptionState& exception_state) {
+  LocalDOMWindow* incumbent_window = IncumbentDOMWindow(isolate);
+  LocalDOMWindow* entered_window = EnteredDOMWindow(isolate);
+
+  // If the bindings implementation is 100% correct, the current realm and the
+  // entered realm should be same origin-domain. However, to be on the safe
+  // side and add some defense in depth, we'll check against the entry realm
+  // as well here.
+  if (!BindingSecurity::ShouldAllowAccessTo(entered_window, this,
+                                            exception_state)) {
+    UseCounter::Count(GetExecutionContext(),
+                      WebFeature::kWindowOpenRealmMismatch);
+    return nullptr;
+  }
+
+  if (!IsCurrentlyDisplayedInFrame())
+    return nullptr;
+  if (!incumbent_window->GetFrame() || !entered_window->GetFrame())
+    return nullptr;
+
+  FrameLoadRequest frame_request(incumbent_window,
+                                 ResourceRequest(KURL(g_empty_string)));
+  frame_request.SetPictureInPictureWindowOptions(options);
+
+  // We always create a new window here.
+  FrameTree::FindResult result =
+      GetFrame()->Tree().FindOrCreateFrameForNavigation(frame_request,
+                                                        "_blank");
+  if (!result.frame)
+    return nullptr;
+
+  // A new window should always be created.
+  DCHECK(result.new_window);
+
+  result.frame->Navigate(frame_request, WebFrameLoadType::kStandard);
+
+  return result.frame->DomWindow();
+}
+
 void LocalDOMWindow::Trace(Visitor* visitor) const {
   visitor->Trace(script_controller_);
   visitor->Trace(document_);
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.h b/third_party/blink/renderer/core/frame/local_dom_window.h
index 6bcf499..d51d616 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.h
+++ b/third_party/blink/renderer/core/frame/local_dom_window.h
@@ -90,6 +90,7 @@
 class V8FrameRequestCallback;
 class V8IdleRequestCallback;
 class V8VoidFunction;
+struct WebPictureInPictureWindowOptions;
 class WindowAgent;
 
 enum PageTransitionEventPersistence {
@@ -364,6 +365,10 @@
                   const String& features,
                   ExceptionState&);
 
+  DOMWindow* openPictureInPictureWindow(v8::Isolate*,
+                                        const WebPictureInPictureWindowOptions&,
+                                        ExceptionState&);
+
   FrameConsole* GetFrameConsole() const;
 
   void PrintErrorMessage(const String&) const;
diff --git a/third_party/blink/renderer/core/frame/settings.json5 b/third_party/blink/renderer/core/frame/settings.json5
index 1cdd97f..f69489c 100644
--- a/third_party/blink/renderer/core/frame/settings.json5
+++ b/third_party/blink/renderer/core/frame/settings.json5
@@ -1095,5 +1095,11 @@
       name: "LitePageSubresourceRedirectOrigin",
       type: "String",
     },
+    // If true, this setting will automatically grant the window placement
+    // permission on all sites.  This is used for enterprise policy.
+    {
+      name: "WindowPlacementAlwaysAllowed",
+      initial: false,
+    },
   ],
 }
diff --git a/third_party/blink/renderer/core/html/image_document.cc b/third_party/blink/renderer/core/html/image_document.cc
index 6a82687..0f2c5353 100644
--- a/third_party/blink/renderer/core/html/image_document.cc
+++ b/third_party/blink/renderer/core/html/image_document.cc
@@ -408,6 +408,7 @@
 
 void ImageDocument::UpdateImageStyle() {
   StringBuilder image_style;
+  image_style.Append("display: block;");
   image_style.Append("-webkit-user-select: none;");
 
   if (ShouldShrinkToFit()) {
diff --git a/third_party/blink/renderer/core/html/resources/html.css b/third_party/blink/renderer/core/html/resources/html.css
index 7dae30bf..35a7860 100644
--- a/third_party/blink/renderer/core/html/resources/html.css
+++ b/third_party/blink/renderer/core/html/resources/html.css
@@ -1204,15 +1204,11 @@
   background-origin: content-box;
   background-repeat: no-repeat;
   background-size: contain;
-  height: 1.2em;
-  margin-inline-start: 24px;
+  height: 1.0em;
+  width: 1.0em;
   opacity: 1;
   outline: none;
-  padding-bottom: 2px;
-  padding-inline-start: 3px;
-  padding-inline-end: 3px;
-  padding-top: 2px;
-  width: 1.2em;
+  padding: 2px;
 }
 
 input[type="date" i]::-webkit-calendar-picker-indicator:focus-visible,
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
index e3f0115..c0ffad35 100644
--- a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
@@ -139,6 +139,8 @@
       return DispositionEnum::NewWindow;
     case kNavigationPolicyNewPopup:
       return DispositionEnum::NewWindow;
+    case kNavigationPolicyPictureInPicture:
+      return DispositionEnum::NewWindow;
   }
   return DispositionEnum::CurrentTab;
 }
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
index b00232cd..182e522 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
@@ -3323,6 +3323,16 @@
                         fragment_relative_block_offset),
           item_offsets.relative_offset);
 
+      // We may have failed to generate a fragment (due to running out of
+      // fragmentainer space). Force a breakpoint at the row, so we shift the
+      // item into the next fragmentainer.
+      if (result->Status() != NGLayoutResult::kSuccess) {
+        DCHECK_EQ(result->Status(), NGLayoutResult::kOutOfFragmentainerSpace);
+        breakpoint_row_set_index =
+            std::min(item_row_set_index, breakpoint_row_set_index);
+        continue;
+      }
+
       const NGBoxFragment fragment(
           container_writing_direction,
           To<NGPhysicalBoxFragment>(result->PhysicalFragment()));
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_overflow_calculator.cc b/third_party/blink/renderer/core/layout/ng/ng_layout_overflow_calculator.cc
index 61408ce2..a76ed90 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_overflow_calculator.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_overflow_calculator.cc
@@ -175,15 +175,7 @@
       if (line_rect.IsEmpty())
         continue;
 
-      // Currently line-boxes don't contribute overflow in the block-axis. This
-      // was added for web-compat reasons.
-      PhysicalRect child_overflow = line_rect;
-      if (writing_direction_.IsHorizontal())
-        child_overflow.size.height = LayoutUnit();
-      else
-        child_overflow.size.width = LayoutUnit();
-
-      layout_overflow_.UniteEvenIfEmpty(child_overflow);
+      layout_overflow_.UniteEvenIfEmpty(line_rect);
       continue;
     }
 
diff --git a/third_party/blink/renderer/core/loader/frame_load_request.h b/third_party/blink/renderer/core/loader/frame_load_request.h
index 9e4c250..b2ef68d 100644
--- a/third_party/blink/renderer/core/loader/frame_load_request.h
+++ b/third_party/blink/renderer/core/loader/frame_load_request.h
@@ -36,6 +36,7 @@
 #include "third_party/blink/public/mojom/frame/triggering_event_info.mojom-blink.h"
 #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h"
 #include "third_party/blink/public/platform/web_impression.h"
+#include "third_party/blink/public/web/web_picture_in_picture_window_options.h"
 #include "third_party/blink/public/web/web_window_features.h"
 #include "third_party/blink/renderer/bindings/core/v8/source_location.h"
 #include "third_party/blink/renderer/core/frame/frame_types.h"
@@ -154,6 +155,15 @@
     window_features_ = features;
   }
 
+  const absl::optional<WebPictureInPictureWindowOptions>&
+  GetPictureInPictureWindowOptions() const {
+    return picture_in_picture_window_options_;
+  }
+  void SetPictureInPictureWindowOptions(
+      const WebPictureInPictureWindowOptions& options) {
+    picture_in_picture_window_options_ = options;
+  }
+
   void SetNoOpener() { window_features_.noopener = true; }
   void SetNoReferrer() {
     should_send_referrer_ = kNeverSendReferrer;
@@ -197,6 +207,8 @@
   mojom::RequestContextFrameType frame_type_ =
       mojom::RequestContextFrameType::kNone;
   WebWindowFeatures window_features_;
+  absl::optional<WebPictureInPictureWindowOptions>
+      picture_in_picture_window_options_;
   absl::optional<WebImpression> impression_;
   absl::optional<LocalFrameToken> initiator_frame_token_;
   mojo::PendingRemote<mojom::blink::PolicyContainerHostKeepAliveHandle>
diff --git a/third_party/blink/renderer/core/loader/navigation_policy.cc b/third_party/blink/renderer/core/loader/navigation_policy.cc
index 8ead3f4..0bf938d0 100644
--- a/third_party/blink/renderer/core/loader/navigation_policy.cc
+++ b/third_party/blink/renderer/core/loader/navigation_policy.cc
@@ -192,5 +192,7 @@
                    kNavigationPolicyNewForegroundTab);
 STATIC_ASSERT_ENUM(kWebNavigationPolicyNewWindow, kNavigationPolicyNewWindow);
 STATIC_ASSERT_ENUM(kWebNavigationPolicyNewPopup, kNavigationPolicyNewPopup);
+STATIC_ASSERT_ENUM(kWebNavigationPolicyPictureInPicture,
+                   kNavigationPolicyPictureInPicture);
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/loader/navigation_policy.h b/third_party/blink/renderer/core/loader/navigation_policy.h
index 8eaa88a..56dc9dbd 100644
--- a/third_party/blink/renderer/core/loader/navigation_policy.h
+++ b/third_party/blink/renderer/core/loader/navigation_policy.h
@@ -45,6 +45,7 @@
   kNavigationPolicyNewForegroundTab,
   kNavigationPolicyNewWindow,
   kNavigationPolicyNewPopup,
+  kNavigationPolicyPictureInPicture,
 };
 
 // Returns a NavigationPolicy to use for starting a navigation
diff --git a/third_party/blink/renderer/core/page/create_window.cc b/third_party/blink/renderer/core/page/create_window.cc
index 13d1a67..eb654ae201 100644
--- a/third_party/blink/renderer/core/page/create_window.cc
+++ b/third_party/blink/renderer/core/page/create_window.cc
@@ -311,9 +311,15 @@
   }
 
   const WebWindowFeatures& features = request.GetWindowFeatures();
-  request.SetNavigationPolicy(NavigationPolicyForCreateWindow(features));
-  probe::WindowOpen(&opener_window, url, frame_name, features,
-                    LocalFrame::HasTransientUserActivation(&opener_frame));
+  const auto& picture_in_picture_window_options =
+      request.GetPictureInPictureWindowOptions();
+  if (picture_in_picture_window_options.has_value()) {
+    request.SetNavigationPolicy(kNavigationPolicyPictureInPicture);
+  } else {
+    request.SetNavigationPolicy(NavigationPolicyForCreateWindow(features));
+    probe::WindowOpen(&opener_window, url, frame_name, features,
+                      LocalFrame::HasTransientUserActivation(&opener_frame));
+  }
 
   // Sandboxed frames cannot open new auxiliary browsing contexts.
   if (opener_window.IsSandboxed(
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index e5dd67b6..05da7db 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -3410,8 +3410,12 @@
 
   WebLocalFrameImpl* webframe = WebLocalFrameImpl::FromFrame(
       obj->GetDocument()->AXObjectCacheOwner().GetFrame());
-  if (webframe && webframe->Client())
-    webframe->Client()->MarkWebAXObjectDirty(WebAXObject(obj), subtree);
+  if (webframe && webframe->Client()) {
+    webframe->Client()->MarkWebAXObjectDirty(WebAXObject(obj), subtree,
+                                             active_event_from_,
+                                             active_event_from_action_);
+  }
+
   obj->UpdateCachedAttributeValuesIfNeeded(true);
   for (auto agent : agents_)
     agent->AXObjectModified(obj, subtree);
diff --git a/third_party/blink/renderer/modules/picture_in_picture/BUILD.gn b/third_party/blink/renderer/modules/picture_in_picture/BUILD.gn
index 1841d2d..5b5e4c6 100644
--- a/third_party/blink/renderer/modules/picture_in_picture/BUILD.gn
+++ b/third_party/blink/renderer/modules/picture_in_picture/BUILD.gn
@@ -20,5 +20,7 @@
     "picture_in_picture_window.h",
     "shadow_root_picture_in_picture.cc",
     "shadow_root_picture_in_picture.h",
+    "window_picture_in_picture.cc",
+    "window_picture_in_picture.h",
   ]
 }
diff --git a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.cc b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.cc
index 73c42724..77458a2 100644
--- a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.cc
+++ b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.cc
@@ -15,10 +15,13 @@
 #include "third_party/blink/public/common/scheme_registry.h"
 #include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
 #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-blink.h"
+#include "third_party/blink/public/web/web_picture_in_picture_window_options.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_picture_in_picture_options.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_picture_in_picture_window_options.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
+#include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/settings.h"
 #include "third_party/blink/renderer/core/fullscreen/fullscreen.h"
@@ -401,6 +404,29 @@
   return (picture_in_picture_element_ == AutoPictureInPictureElement());
 }
 
+void PictureInPictureControllerImpl::CreateDocumentPictureInPictureWindow(
+    ScriptState* script_state,
+    LocalDOMWindow& opener,
+    PictureInPictureWindowOptions* options,
+    ScriptPromiseResolver* resolver,
+    ExceptionState& exception_state) {
+  WebPictureInPictureWindowOptions web_options;
+  web_options.size = gfx::Size(options->width(), options->height());
+  web_options.constrain_aspect_ratio = options->constrainAspectRatio();
+
+  opener.openPictureInPictureWindow(script_state->GetIsolate(), web_options,
+                                    exception_state);
+
+  if (exception_state.HadException()) {
+    resolver->Reject();
+    return;
+  }
+
+  // TODO(https://crbug.com/1253970): Resolve with a PictureInPictureWindow
+  // object.
+  resolver->Resolve();
+}
+
 void PictureInPictureControllerImpl::PageVisibilityChanged() {
   DCHECK(GetSupplementable());
 
diff --git a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.h b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.h
index bf840a7..6dcee48 100644
--- a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.h
+++ b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.h
@@ -17,9 +17,12 @@
 
 namespace blink {
 
+class ExceptionState;
 class HTMLVideoElement;
 class PictureInPictureOptions;
 class PictureInPictureWindow;
+class PictureInPictureWindowOptions;
+class ScriptState;
 class TreeScope;
 
 // The PictureInPictureControllerImpl is keeping the state and implementing the
@@ -76,6 +79,13 @@
   // Returns whether exiting Auto Picture-in-Picture is allowed.
   bool IsExitAutoPictureInPictureAllowed() const;
 
+  // Creates a picture-in-picture window that can contain arbitrary HTML.
+  void CreateDocumentPictureInPictureWindow(ScriptState*,
+                                            LocalDOMWindow&,
+                                            PictureInPictureWindowOptions*,
+                                            ScriptPromiseResolver*,
+                                            ExceptionState&);
+
   // Implementation of PictureInPictureController.
   void EnterPictureInPicture(HTMLElement*,
                              PictureInPictureOptions*,
diff --git a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_window_options.idl b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_window_options.idl
new file mode 100644
index 0000000..f3430946
--- /dev/null
+++ b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_window_options.idl
@@ -0,0 +1,10 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// https://wicg.github.io/picture-in-picture/v2/
+dictionary PictureInPictureWindowOptions {
+  long width;
+  long height;
+  boolean constrainAspectRatio = false;
+};
diff --git a/third_party/blink/renderer/modules/picture_in_picture/window_picture_in_picture.cc b/third_party/blink/renderer/modules/picture_in_picture/window_picture_in_picture.cc
new file mode 100644
index 0000000..dac1167
--- /dev/null
+++ b/third_party/blink/renderer/modules/picture_in_picture/window_picture_in_picture.cc
@@ -0,0 +1,44 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/modules/picture_in_picture/window_picture_in_picture.h"
+
+#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
+#include "third_party/blink/renderer/core/frame/local_dom_window.h"
+#include "third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.h"
+#include "third_party/blink/renderer/platform/bindings/exception_code.h"
+#include "third_party/blink/renderer/platform/bindings/exception_state.h"
+
+namespace blink {
+
+// static
+ScriptPromise WindowPictureInPicture::requestPictureInPictureWindow(
+    ScriptState* script_state,
+    LocalDOMWindow& window,
+    PictureInPictureWindowOptions* options,
+    ExceptionState& exception_state) {
+  // TODO(https://crbug.com/1253970): Check if PiP is allowed (e.g. user
+  // gesture, permissions, etc).
+  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
+  auto promise = resolver->Promise();
+
+  if (!script_state->ContextIsValid()) {
+    exception_state.ThrowDOMException(DOMExceptionCode::kAbortError,
+                                      "Document not attached");
+    resolver->Reject();
+    return promise;
+  }
+
+  // |window.document()| should always exist after document construction.
+  auto* document = window.document();
+  DCHECK(document);
+
+  PictureInPictureControllerImpl::From(*document)
+      .CreateDocumentPictureInPictureWindow(script_state, window, options,
+                                            resolver, exception_state);
+
+  return promise;
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/picture_in_picture/window_picture_in_picture.h b/third_party/blink/renderer/modules/picture_in_picture/window_picture_in_picture.h
new file mode 100644
index 0000000..62e1674d
--- /dev/null
+++ b/third_party/blink/renderer/modules/picture_in_picture/window_picture_in_picture.h
@@ -0,0 +1,31 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PICTURE_IN_PICTURE_WINDOW_PICTURE_IN_PICTURE_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_PICTURE_IN_PICTURE_WINDOW_PICTURE_IN_PICTURE_H_
+
+#include "third_party/blink/renderer/core/dom/qualified_name.h"
+
+namespace blink {
+
+class ExceptionState;
+class LocalDOMWindow;
+class PictureInPictureWindowOptions;
+class ScriptPromise;
+class ScriptState;
+
+class WindowPictureInPicture {
+  STATIC_ONLY(WindowPictureInPicture);
+
+ public:
+  static ScriptPromise requestPictureInPictureWindow(
+      ScriptState*,
+      LocalDOMWindow&,
+      PictureInPictureWindowOptions*,
+      ExceptionState&);
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_PICTURE_IN_PICTURE_WINDOW_PICTURE_IN_PICTURE_H_
diff --git a/third_party/blink/renderer/modules/picture_in_picture/window_picture_in_picture.idl b/third_party/blink/renderer/modules/picture_in_picture/window_picture_in_picture.idl
new file mode 100644
index 0000000..e8ac937
--- /dev/null
+++ b/third_party/blink/renderer/modules/picture_in_picture/window_picture_in_picture.idl
@@ -0,0 +1,11 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+[
+    ImplementedAs=WindowPictureInPicture,
+    RuntimeEnabled=PictureInPictureV2
+]
+partial interface Window {
+    [CallWith=ScriptState, RaisesException, Measure, NewObject] Promise<PictureInPictureWindow> requestPictureInPictureWindow(PictureInPictureWindowOptions options);
+};
diff --git a/third_party/blink/renderer/modules/screen_enumeration/window_screens.cc b/third_party/blink/renderer/modules/screen_enumeration/window_screens.cc
index aea0e9cc..1366e82 100644
--- a/third_party/blink/renderer/modules/screen_enumeration/window_screens.cc
+++ b/third_party/blink/renderer/modules/screen_enumeration/window_screens.cc
@@ -10,6 +10,8 @@
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/core/frame/settings.h"
+#include "third_party/blink/renderer/core/page/page.h"
 #include "third_party/blink/renderer/modules/permissions/permission_utils.h"
 #include "third_party/blink/renderer/modules/screen_enumeration/screen_details.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
@@ -61,18 +63,33 @@
     return ScriptPromise();
   }
 
-  ExecutionContext* context = ExecutionContext::From(script_state);
-  DCHECK(context->IsSecureContext());  // [SecureContext] in IDL.
+  LocalDOMWindow* window = LocalDOMWindow::From(script_state);
+  DCHECK(window->IsSecureContext());  // [SecureContext] in IDL.
   if (!permission_service_.is_bound()) {
     // See https://bit.ly/2S0zRAS for task types.
     ConnectToPermissionService(
-        context, permission_service_.BindNewPipeAndPassReceiver(
-                     context->GetTaskRunner(TaskType::kMiscPlatformAPI)));
+        window, permission_service_.BindNewPipeAndPassReceiver(
+                    window->GetTaskRunner(TaskType::kMiscPlatformAPI)));
   }
 
   auto permission_descriptor = CreatePermissionDescriptor(
       mojom::blink::PermissionName::WINDOW_PLACEMENT);
   auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
+
+  // Automatically grant permission if that enterprise policy is set.
+  bool always_allowed = false;
+  if (auto* frame = window->GetFrame()) {
+    if (auto* page = frame->GetPage()) {
+      if (page->GetSettings().GetWindowPlacementAlwaysAllowed())
+        always_allowed = true;
+    }
+  }
+  if (always_allowed) {
+    OnPermissionRequestComplete(resolver,
+                                mojom::blink::PermissionStatus::GRANTED);
+    return resolver->Promise();
+  }
+
   auto callback = WTF::Bind(&WindowScreens::OnPermissionRequestComplete,
                             WrapPersistent(this), WrapPersistent(resolver));
 
diff --git a/third_party/blink/renderer/platform/wtf/allocator/partitions.cc b/third_party/blink/renderer/platform/wtf/allocator/partitions.cc
index 853319d..be56aef 100644
--- a/third_party/blink/renderer/platform/wtf/allocator/partitions.cc
+++ b/third_party/blink/renderer/platform/wtf/allocator/partitions.cc
@@ -158,6 +158,14 @@
   }
 #endif  // defined(PA_ALLOW_PCSCAN)
 
+  if (!base::FeatureList::IsEnabled(
+          base::features::kPartitionAllocUseAlternateDistribution)) {
+#if !BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
+    fast_malloc_root_->SwitchToDenserBucketDistribution();
+#endif
+    buffer_root_->SwitchToDenserBucketDistribution();
+  }
+
   initialized_ = true;
   return initialized_;
 }
@@ -195,6 +203,10 @@
     base::internal::PCScan::RegisterNonScannableRoot(array_buffer_root_);
   }
 #endif  // defined(PA_ALLOW_PCSCAN)
+  if (!base::FeatureList::IsEnabled(
+          base::features::kPartitionAllocUseAlternateDistribution)) {
+    array_buffer_root_->SwitchToDenserBucketDistribution();
+  }
 }
 
 // static
diff --git a/third_party/blink/web_tests/FlagExpectations/skia-gl b/third_party/blink/web_tests/FlagExpectations/skia-gl
deleted file mode 100644
index 300e5c6..0000000
--- a/third_party/blink/web_tests/FlagExpectations/skia-gl
+++ /dev/null
@@ -1,57 +0,0 @@
-# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Win Win7 Win10 ]
-# tags: [ Release Debug ]
-# results: [ Timeout Crash Pass Failure Slow Skip ]
-
-# Viewport image is the wrong size.
-crbug.com/1009718 images/huge-image-viewport-scale.html [ Skip ]
-
-# Alpha Blending Video Failures
-crbug.com/1094635 media/alpha-video-playback.html [ Skip ]
-
-# Need Intel and NVIDIA specific baselines.
-crbug.com/1243824 compositing/masks/mask-with-added-filters.html [ Skip ]
-crbug.com/1243824 compositing/masks/mask-with-removed-filters.html [ Skip ]
-crbug.com/1243824 images/color-profile-background-image-repeat.html [ Skip ]
-crbug.com/1243824 images/rgb-png-with-cmyk-color-profile.html [ Skip ]
-
-# Flakily producing a slightly different but visually identical image.
-crbug.com/1245445 images/color-profile-group.html [ Failure Pass ]
-crbug.com/1245445 images/color-profile-image-canvas-pattern.html [ Failure Pass ]
-crbug.com/1245445 images/color-profile-image-canvas.html [ Failure Pass ]
-crbug.com/1245445 media/color-profile-video-poster-image.html [ Failure Pass ]
-
-# Flakily timing out.
-crbug.com/1245752 css3/background/background-repeat-round-padding.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/background-blend-mode-crossfade-image-gradient.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/background-blend-mode-default-value.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/background-blend-mode-gradient-image.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/background-blend-mode-image-color.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/background-blend-mode-image-image.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/background-blend-mode-image-svg.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/background-blend-mode-multiple-background-layers.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/background-blend-mode-single-layer-no-blending.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/background-blend-mode-tiled-gradient.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/effect-background-blend-mode-stacking.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/effect-background-blend-mode-tiled.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/effect-background-blend-mode.html [ Pass Timeout ]
-crbug.com/1245752 css3/masking/mask-repeat-round-content.html [ Pass Timeout ]
-crbug.com/1245752 css3/masking/mask-repeat-round-padding.html [ Pass Timeout ]
-crbug.com/1245752 css3/masking/mask-repeat-space-border.html [ Pass Timeout ]
-crbug.com/1245752 images/color-profile-background-image-space.html [ Pass Timeout ]
-crbug.com/1245752 media/controls-layout-direction.html [ Pass Timeout ]
-
-# Affected by both of the above flakes.
-crbug.com/1245445 crbug.com/1245752 images/color-profile-background-image-cover.html [ Failure Pass Timeout ]
-
-# Flaky, media controls not hiding.
-crbug.com/1245418 media/video-controls-hide-on-move-outside-controls.html [ Failure Pass ]
-
-# One portion of the image is offset.
-crbug.com/1002522 fast/canvas/canvas-toDataURL-webp.html [ Skip ]
-
-# Flaky on Linux.
-crbug.com/1150545 virtual/android/fullscreen/video-scrolled-iframe.html [ Pass Timeout ]
-
-# These tests have large image differences, need investigation.
-crbug.com/993384 css3/filters/effect-reference-colorspace.html [ Failure Pass ]
-crbug.com/993384 css3/filters/effect-reference-subregion.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/FlagExpectations/skia-vulkan-native b/third_party/blink/web_tests/FlagExpectations/skia-vulkan-native
deleted file mode 100644
index 3fe4bf6..0000000
--- a/third_party/blink/web_tests/FlagExpectations/skia-vulkan-native
+++ /dev/null
@@ -1,74 +0,0 @@
-# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Win Win7 Win10 ]
-# tags: [ Release Debug ]
-# results: [ Timeout Crash Pass Failure Slow Skip ]
-
-# Alpha Blending Video Failures
-crbug.com/1094635 fast/canvas/canvas-pattern-video.html [ Skip ]
-crbug.com/1094635 media/alpha-video-playback.html [ Skip ]
-crbug.com/1094635 fast/canvas/canvas-composite-video-shadow.html [ Skip ]
-crbug.com/1094635 fast/canvas/canvas-composite-video.html [ Skip ]
-
-# Viewport image is the wrong size.
-crbug.com/1009718 images/huge-image-viewport-scale.html [ Skip ]
-
-# Need Intel and NVIDIA specific baselines.
-crbug.com/1243824 compositing/masks/mask-with-added-filters.html [ Skip ]
-crbug.com/1243824 compositing/masks/mask-with-removed-filters.html [ Skip ]
-crbug.com/1243824 images/yuv-decode-eligible/color-profile-filter.html [ Skip ]
-
-# Flakily crashing.
-crbug.com/1245420 compositing/geometry/vertical-scroll-composited.html [ Crash Pass ]
-crbug.com/1245420 compositing/lots-of-img-layers.html [ Crash Pass ]
-crbug.com/1245420 css3/blending/background-blend-mode-default-value.html [ Crash Pass ]
-crbug.com/1245420 css3/blending/background-blend-mode-image-color.html [ Crash Pass ]
-crbug.com/1245420 css3/blending/effect-background-blend-mode-tiled.html [ Crash Pass ]
-crbug.com/1245420 css3/blending/mix-blend-mode-isolated-group-1.html [ Crash Pass ]
-crbug.com/1245420 css3/masking/mask-repeat-round-border.html [ Crash Pass ]
-crbug.com/1245420 images/yuv-decode-eligible/color-profile-border-radius.html [ Crash Pass ]
-crbug.com/1245420 images/yuv-decode-eligible/color-profile-image-profile-match.html [ Crash Pass ]
-crbug.com/1245420 images/yuv-decode-eligible/color-profile-image.html [ Crash Pass ]
-crbug.com/1245420 media/video-layer-crash.html [ Crash Pass ]
-crbug.com/1245420 virtual/android/fullscreen/model/fully-exit-fullscreen-single.html [ Crash Pass ]
-
-# Flakily producing a slightly different but visually identical image.
-crbug.com/1245445 images/color-profile-image-canvas-pattern.html [ Failure Pass ]
-crbug.com/1245445 images/color-profile-mask-image-svg.html [ Failure Pass ]
-crbug.com/1245445 images/color-profile-object.html [ Failure Pass ]
-
-# Flakily timing out.
-crbug.com/1245752 css3/blending/background-blend-mode-crossfade-image-gradient.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/background-blend-mode-single-layer-no-blending.html [ Pass Timeout ]
-crbug.com/1245752 css3/blending/effect-background-blend-mode-stacking.html [ Pass Timeout ]
-crbug.com/1245752 css3/masking/mask-repeat-space-border.html [ Pass Timeout ]
-crbug.com/1245752 media/controls-layout-direction.html [ Pass Timeout ]
-
-# Affected by multiple of the above flakes.
-crbug.com/1245420 crbug.com/1245752 css3/background/background-repeat-round-auto1.html [ Crash Pass Timeout ]
-crbug.com/1245420 crbug.com/1245752 css3/background/background-repeat-round-content.html [ Crash Pass Timeout ]
-crbug.com/1245420 crbug.com/1245752 css3/blending/background-blend-mode-gradient-image.html [ Crash Pass Timeout ]
-crbug.com/1245420 crbug.com/1245445 crbug.com/1245752 css3/blending/background-blend-mode-image-image.html [ Crash Failure Pass Timeout ]
-crbug.com/1245420 crbug.com/1245752 css3/blending/background-blend-mode-image-svg.html [ Crash Pass Timeout ]
-crbug.com/1245420 crbug.com/1245752 css3/blending/background-blend-mode-multiple-background-layers.html [ Crash Pass Timeout ]
-crbug.com/1245420 crbug.com/1245752 css3/blending/background-blend-mode-tiled-gradient.html [ Crash Pass Timeout ]
-crbug.com/1245420 crbug.com/1245752 css3/blending/mix-blend-mode-isolated-group-2.html [ Crash Pass Timeout ]
-crbug.com/1245420 crbug.com/1245445 images/color-profile-background-image-space.html [ Crash Failure Pass ]
-crbug.com/1245420 crbug.com/1245445 images/color-profile-image-canvas.html [ Crash Failure Pass ]
-
-# Flaky, media controls not hiding.
-crbug.com/1245418 media/video-controls-hide-on-move-outside-controls.html [ Failure Pass ]
-
-# One portion of the image is offset.
-crbug.com/1002522 fast/canvas/canvas-toDataURL-webp.html [ Skip ]
-
-# Flaky on Linux.
-crbug.com/1150545 virtual/android/fullscreen/video-scrolled-iframe.html [ Pass Timeout ]
-
-# These tests have large image differences, need investigation.
-crbug.com/993384 css3/filters/effect-reference-colorspace.html [ Failure Pass ]
-crbug.com/993384 css3/filters/effect-reference-subregion.html [ Failure Pass ]
-
-# Producing minor differences between NVIDIA and Intel GPUs with no good way to
-# accept both outputs.
-crbug.com/1278181 [ Linux ] images/color-profile-animate.html [ Failure ]
-crbug.com/1278181 [ Linux ] images/color-profile-image-filter-all.html [ Failure ]
-crbug.com/1278181 [ Linux ] images/color-profile-svg-fill-text.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index c5f175f..2ba8d3aa 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1596,6 +1596,7 @@
 virtual/layout_ng_grid_frag/external/wpt/css/css-break/grid/grid-item-fragmentation-034.html [ Pass ]
 virtual/layout_ng_grid_frag/external/wpt/css/css-break/grid/grid-item-fragmentation-037.html [ Pass ]
 virtual/layout_ng_grid_frag/external/wpt/css/css-break/grid/grid-item-fragmentation-038.html [ Pass ]
+virtual/layout_ng_grid_frag/external/wpt/css/css-break/grid/grid-item-fragmentation-041.html [ Pass ]
 
 ### With LayoutNGPrinting enabled:
 
@@ -4244,6 +4245,7 @@
 crbug.com/614667 external/wpt/css/css-break/grid/grid-item-fragmentation-037.html [ Failure ]
 crbug.com/614667 external/wpt/css/css-break/grid/grid-item-fragmentation-038.html [ Failure ]
 crbug.com/614667 external/wpt/css/css-break/grid/grid-item-fragmentation-039.html [ Failure ]
+crbug.com/614667 external/wpt/css/css-break/grid/grid-item-fragmentation-041.html [ Failure ]
 crbug.com/1058792 external/wpt/css/css-break/transform-007.html [ Failure ]
 crbug.com/1224888 external/wpt/css/css-break/transform-009.html [ Failure ]
 crbug.com/1156312 external/wpt/css/css-break/widows-orphans-017.html [ Failure ]
@@ -7596,4 +7598,3 @@
 crbug.com/1292889 [ Mac ] virtual/threaded/external/wpt/css/css-transforms/animation/perspective-origin-interpolation.html [ Failure Pass ]
 
 crbug.com/1197296 [ Mac10.12 ] virtual/unified-autoplay/external/wpt/feature-policy/feature-policy-frame-policy-timing.https.sub.html [ Pass Failure ]
-crbug.com/1291568 http/tests/inspector-protocol/no-crash-with-stack-id-and-stale-while-revalidate.js [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/linebox/scrollable-overflow.tentative.html b/third_party/blink/web_tests/external/wpt/css/CSS2/linebox/scrollable-overflow.tentative.html
deleted file mode 100644
index 8835455..0000000
--- a/third_party/blink/web_tests/external/wpt/css/CSS2/linebox/scrollable-overflow.tentative.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=996847">
-<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html">
-<meta name=assert content="This test checks that bottom half-leading of a line-box doesn't contribute to the scrollable overflow.">
-<p>Test passes if there is a filled green square.</p>
-<div style="overflow-y: auto; width: 100px; height: 100px;">
-  <div style="line-height: 120px; height: 100px; background: green;">
-    <span style="display: inline-block; width: 100px; height: 50px;"></span>
-  </div>
-</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-041.html b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-041.html
new file mode 100644
index 0000000..f26c726
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-041.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#pagination">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="margin-left:-100px; columns:2; height:200px; width:200px; column-gap:0; column-fill:auto;">
+  <div style="height:199px;"></div>
+  <div style="display: grid;">
+    <div style="columns:2; width:100%; column-gap:0; background:red; line-height: 0;">
+      <div style="display: inline-block; width: 100%; height: 20px; background: green;"></div>
+      <div style="height:180px; background:green;"></div>
+    </div>
+</div>
diff --git a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-div.html b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-div.html
index 0267838..22462a9 100644
--- a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-div.html
+++ b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-div.html
@@ -18,6 +18,7 @@
   #container {
     height: 185px;
     width: 600px;
+    line-height: 0;
   }
 
   .box {
diff --git a/third_party/blink/web_tests/fast/forms/date/date-text-height-appearance.html b/third_party/blink/web_tests/fast/forms/date/date-text-height-appearance.html
new file mode 100644
index 0000000..7042f14
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/date/date-text-height-appearance.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+
+<p>These pairs of inputs should each have the same height:</p>
+
+<div id=s1>
+  <input type="text" value="hello">
+  <input type="date" value="2022-01-01">
+</div>
+<div id=s2>
+  <input type="text" value="hello">
+  <input type="date" value="2022-01-01">
+</div>
+<div id=s3>
+  <input type="text" value="hello">
+  <input type="date" value="2022-01-01">
+</div>
+
+<style>
+* {
+  margin:0;
+  padding:0;
+  border:0;
+  font-family: serif;
+  font-size:0;
+}
+p {
+  font-size: 12pt;
+}
+input {
+  display:inline-block;
+}
+div {
+  margin-top: 10px;
+  border: 1px solid black;
+  width: max-content;
+  height: min-content;
+  max-height: min-content;
+  background:red;
+}
+#s1 input {
+  font-size:6pt;
+}
+#s2 input {
+  font-size:12pt;
+}
+#s3 input {
+  font-size:18pt;
+}
+</style>
diff --git a/third_party/blink/web_tests/fast/harness/results.html b/third_party/blink/web_tests/fast/harness/results.html
index 1742b7e..6305cd19 100644
--- a/third_party/blink/web_tests/fast/harness/results.html
+++ b/third_party/blink/web_tests/fast/harness/results.html
@@ -204,6 +204,15 @@
   padding-left: 10px;
 }
 
+.download-button {
+  display: inline-block;
+  width: 15px;
+  height: 15px;
+  margin-bottom: -2px;
+  margin-right: 0px;
+  content: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDIxMi45NzMgMjEyLjk3MyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjEyLjk3MyAyMTIuOTczOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8cGF0aCBkPSJNMjA1LjQ3Myw3Ni4xNDZjLTQuMTQzLDAtNy41LDMuMzU4LTcuNSw3LjV2MTAzLjMySDE1VjgzLjY0NmMwLTQuMTQyLTMuMzU3LTcuNS03LjUtNy41UzAsNzkuNTAzLDAsODMuNjQ2djExMC44Mg0KCQljMCw0LjE0MiwzLjM1Nyw3LjUsNy41LDcuNWgxOTcuOTczYzQuMTQzLDAsNy41LTMuMzU4LDcuNS03LjVWODMuNjQ2QzIxMi45NzMsNzkuNTAzLDIwOS42MTUsNzYuMTQ2LDIwNS40NzMsNzYuMTQ2eiIvPg0KCTxwYXRoIGQ9Ik0xMDEuMTcxLDE1NC43NDZjMS40MDcsMS40MDcsMy4zMTQsMi4xOTcsNS4zMDQsMi4xOTdjMS45ODksMCwzLjg5Ni0wLjc5LDUuMzA0LTIuMTk3bDMyLjM3My0zMi4zNzQNCgkJYzIuOTI5LTIuOTI5LDIuOTI5LTcuNjc4LDAtMTAuNjA2Yy0yLjkzLTIuOTMtNy42NzgtMi45MjktMTAuNjA3LDBsLTE5LjU2OSwxOS41NjlsMC4wMDQtMTEyLjgyOGMwLTQuMTQyLTMuMzU3LTcuNS03LjUtNy41DQoJCWMtNC4xNDIsMC03LjUsMy4zNTgtNy41LDcuNWwtMC4wMDQsMTEyLjgyOWwtMTkuNTQ2LTE5LjU0N2MtMi45MjktMi45MjktNy42NzctMi45My0xMC42MDcsMGMtMi45MjksMi45MjktMi45MjksNy42NzcsMCwxMC42MDYNCgkJTDEwMS4xNzEsMTU0Ljc0NnoiLz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K);
+}
+
 .stat-bar-count, .stat-bar-time {
   width: 12px;
   height: 8px;
@@ -535,6 +544,10 @@
     return this.dir + this.resultPrefix + resultName;
   }
 
+  resultFilename(resultName) {
+    return this.resultPrefix + resultName;
+  }
+
   repaintOverlayLink() {
     return this.resultLink("-overlay.html?") + encodeURIComponent(this.testHref);
   }
@@ -1846,6 +1859,9 @@
 
     let html = "image: ";
     html += `<a class="toggle" href="${pathParser.resultLink("-actual.png")}" title="Actual result">actual</a>`;
+    html += `<a download="${pathParser.resultFilename("-expected.png")}" href="${pathParser.resultLink("-actual.png")}" title="Download new expectation file">`;
+    html += '<img class="download-button" alt="Download new expectation file" />';
+    html += '</a>';
     html += `<a class="toggle" href="${pathParser.resultLink("-expected.png")}" title="Expected result">expected</a>`;
     if (test.reference) {
       html += `<span style="margin-left: -2px; margin-right: 2px">(` +
diff --git a/third_party/blink/web_tests/fast/multicol/span/overflow-on-multicol-expected.html b/third_party/blink/web_tests/fast/multicol/span/overflow-on-multicol-expected.html
index 7a49dca..274acfb 100644
--- a/third_party/blink/web_tests/fast/multicol/span/overflow-on-multicol-expected.html
+++ b/third_party/blink/web_tests/fast/multicol/span/overflow-on-multicol-expected.html
@@ -9,10 +9,7 @@
     <p>You should see the word 'PASS' below.</p>
 </div>
 <div id="target" style="overflow:scroll; line-height:2em; height:4em;">
-    <!-- We need the below block with restricted height, like in the test. One might think it
-         doesn't matter, but because of crbug.com/450202 (which might not even be a bug), it
-         does. -->
-    <div style="height:2em;">
+    <div>
         <br><br><br><br>PASS
     </div>
 </div>
diff --git a/third_party/blink/web_tests/fast/multicol/span/overflow-on-multicol.html b/third_party/blink/web_tests/fast/multicol/span/overflow-on-multicol.html
index 882bf1f..adece596 100644
--- a/third_party/blink/web_tests/fast/multicol/span/overflow-on-multicol.html
+++ b/third_party/blink/web_tests/fast/multicol/span/overflow-on-multicol.html
@@ -9,7 +9,7 @@
     <p>You should see the word 'PASS' below.</p>
 </div>
 <div id="target" style="overflow:scroll; line-height:2em; height:4em; -webkit-columns:4;">
-    <div style="-webkit-column-span:all; height:2em;">
+    <div style="-webkit-column-span:all;">
         <br><br><br><br>PASS
     </div>
 </div>
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
index 7212104c..e1b913f 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
index 2923e65..32e3840 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/date/date-appearance-basic-expected.png
index 4e37b1b..ad691c7 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
index 1682119..4abf678 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-appearance-basic-expected.png
index 9337485..bee2022 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-picker-appearance-zoom150-expected.png
index 14c5823..5fe7f61 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 3be45fa0..411ee99 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
index 821c9b2..88c0cb4 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
index d3f5448..d2a99c4 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/week/week-appearance-basic-expected.png
index 0d584594..dca3d0bf 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 218dcbc3..b232c62 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index ee2b9253..4a43b68 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index ee2b9253..4a43b68 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..88c0cb4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..d2a99c4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/calendar-picker/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
index f8573f3..95e57228 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
index 17be6af..6bd97078 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/month/month-picker-appearance-step-expected.png
index be9ff57..a4e1e2c 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/month/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
index edcc7b09..287f311 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/scrolled-within-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/scrolled-within-boxshadow-expected.png
deleted file mode 100644
index f892df7..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/scrolled-within-boxshadow-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/translated-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/translated-boxshadow-expected.png
deleted file mode 100644
index f4ae91f..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/translated-boxshadow-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/unscrolled-within-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/unscrolled-within-boxshadow-expected.png
deleted file mode 100644
index f892df7..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/unscrolled-within-boxshadow-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/fixed-background-after-style-recalc-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/fixed-background-after-style-recalc-expected.png
deleted file mode 100644
index 3c5231f..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/fixed-background-after-style-recalc-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/clipping-foreground-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/clipping-foreground-expected.png
deleted file mode 100644
index e60646fd..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/clipping-foreground-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/foreground-layer-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/foreground-layer-expected.png
deleted file mode 100644
index f340247..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/foreground-layer-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/vertical-scroll-composited-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/vertical-scroll-composited-expected.png
deleted file mode 100644
index df3fee3..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/vertical-scroll-composited-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/iframes/composited-iframe-alignment-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/iframes/composited-iframe-alignment-expected.png
deleted file mode 100644
index 18e6201..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/iframes/composited-iframe-alignment-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/lots-of-img-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/lots-of-img-layers-expected.png
deleted file mode 100644
index 2bd380d4..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/lots-of-img-layers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/masks/mask-with-added-filters-expected.png
deleted file mode 100644
index 883dfc2..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/masks/mask-with-added-filters-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/masks/mask-with-removed-filters-expected.png
deleted file mode 100644
index 93aac55..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/masks/mask-with-removed-filters-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/border-radius-above-composited-subframe-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/border-radius-above-composited-subframe-expected.png
deleted file mode 100644
index 9420be9..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/border-radius-above-composited-subframe-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/border-radius-composited-subframe-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/border-radius-composited-subframe-expected.png
deleted file mode 100644
index 957a113..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/border-radius-composited-subframe-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/mask-with-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/mask-with-filter-expected.png
deleted file mode 100644
index 42ad9838..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/mask-with-filter-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/transform-3d-scales-different-x-y-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/transform-3d-scales-different-x-y-expected.png
deleted file mode 100644
index 6f9d05a..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/compositing/transform-3d-scales-different-x-y-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t090501-c414-flt-02-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t090501-c414-flt-02-d-g-expected.png
deleted file mode 100644
index 41a51969..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t090501-c414-flt-02-d-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t090501-c414-flt-03-b-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t090501-c414-flt-03-b-g-expected.png
deleted file mode 100644
index aa3a80df..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t090501-c414-flt-03-b-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png
deleted file mode 100644
index 5cd9846..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png
deleted file mode 100644
index dbed180..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-auto1-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-auto1-expected.png
deleted file mode 100644
index 2a13c6c..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-auto1-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-border-expected.png
deleted file mode 100644
index 81c8165..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-border-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-content-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-content-expected.png
deleted file mode 100644
index 540b55d..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-content-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-padding-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-padding-expected.png
deleted file mode 100644
index 3ab12e4..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-padding-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
deleted file mode 100644
index 3b4b67b..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-default-value-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-default-value-expected.png
deleted file mode 100644
index a3addc5..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-default-value-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-gradient-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-gradient-gradient-expected.png
deleted file mode 100644
index 45fc8b1a..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-gradient-gradient-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-gradient-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-gradient-image-expected.png
deleted file mode 100644
index 5d07654..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-gradient-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-color-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-color-expected.png
deleted file mode 100644
index 9ab503d..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-color-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-image-expected.png
deleted file mode 100644
index 228c5d60..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-svg-expected.png
deleted file mode 100644
index 3645797b..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-svg-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-multiple-background-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-multiple-background-layers-expected.png
deleted file mode 100644
index d261b79..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-multiple-background-layers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-single-layer-no-blending-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-single-layer-no-blending-expected.png
deleted file mode 100644
index 53bd4dd..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-single-layer-no-blending-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-svg-color-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-svg-color-expected.png
deleted file mode 100644
index 085df7a2..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-svg-color-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-tiled-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-tiled-gradient-expected.png
deleted file mode 100644
index 9eb2088..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-tiled-gradient-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-expected.png
deleted file mode 100644
index c660ac5..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-stacking-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-stacking-expected.png
deleted file mode 100644
index 762f1fa0..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-stacking-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-tiled-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-tiled-expected.png
deleted file mode 100644
index a739808..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-tiled-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-1-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-1-expected.png
deleted file mode 100644
index 2a4cf3a..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-1-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-2-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-2-expected.png
deleted file mode 100644
index 5e7dd22..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-3-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-3-expected.png
deleted file mode 100644
index 4cfeeac5..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-3-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/blur-filter-page-scroll-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/blur-filter-page-scroll-expected.png
deleted file mode 100644
index 13199ce..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/blur-filter-page-scroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/blur-filter-page-scroll-parents-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/blur-filter-page-scroll-parents-expected.png
deleted file mode 100644
index 40e36254..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/blur-filter-page-scroll-parents-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/blur-filter-page-scroll-self-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/blur-filter-page-scroll-self-expected.png
deleted file mode 100644
index 435df40..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/blur-filter-page-scroll-self-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/crash-filter-change-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/crash-filter-change-expected.png
deleted file mode 100644
index 342569f..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/crash-filter-change-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-blur-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-blur-expected.png
deleted file mode 100644
index e8d6380..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-blur-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-brightness-clamping-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-brightness-clamping-expected.png
deleted file mode 100644
index 7eaa94d..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-brightness-clamping-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-combined-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-combined-expected.png
deleted file mode 100644
index 24b0124..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-combined-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-drop-shadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-drop-shadow-expected.png
deleted file mode 100644
index e867f579..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-drop-shadow-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-reference-colorspace-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-reference-colorspace-expected.png
deleted file mode 100644
index 8848e11..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-reference-colorspace-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-reference-subregion-expected.png
deleted file mode 100644
index 72f61363..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-reference-subregion-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-change-repaint-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-change-repaint-expected.png
deleted file mode 100644
index 358543cd..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-change-repaint-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-blur-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-blur-expected.png
deleted file mode 100644
index 78899f9..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-blur-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-child-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-child-layers-expected.png
deleted file mode 100644
index c43a03d1..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-child-layers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-expected.png
deleted file mode 100644
index 3487462..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-shadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-shadow-expected.png
deleted file mode 100644
index c630f90..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-shadow-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/regions-expanding-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/regions-expanding-expected.png
deleted file mode 100644
index a5fe160..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/regions-expanding-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-auto1-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-auto1-expected.png
deleted file mode 100644
index 0a78c2e..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-auto1-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-border-expected.png
deleted file mode 100644
index 16294b88..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-border-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-content-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-content-expected.png
deleted file mode 100644
index 7313af2a..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-content-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-padding-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-padding-expected.png
deleted file mode 100644
index a36baae..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-padding-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-space-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-space-border-expected.png
deleted file mode 100644
index 3ad19647..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-space-border-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/fast/canvas/pixelated-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/fast/canvas/pixelated-expected.png
deleted file mode 100644
index 336aff93..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/fast/canvas/pixelated-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-animate-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-animate-expected.png
deleted file mode 100644
index a0005890..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-animate-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-animate-rotate-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-animate-rotate-expected.png
deleted file mode 100644
index f5f0fd2e..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-animate-rotate-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cover-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cover-expected.png
deleted file mode 100644
index d0e95e9..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cover-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cross-fade-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cross-fade-expected.png
deleted file mode 100644
index 1708a70..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cross-fade-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cross-fade-png-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cross-fade-png-expected.png
deleted file mode 100644
index 1708a70..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cross-fade-png-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-repeat-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-repeat-expected.png
deleted file mode 100644
index 44db734..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-repeat-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-space-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-space-expected.png
deleted file mode 100644
index 35bcf31e..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-space-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-border-fade-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-border-fade-expected.png
deleted file mode 100644
index 2a828885..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-border-fade-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-border-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-border-image-expected.png
deleted file mode 100644
index ddf6c04..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-border-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-group-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-group-expected.png
deleted file mode 100644
index 47123e2..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-group-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-canvas-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-canvas-expected.png
deleted file mode 100644
index b49e59f..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-canvas-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-canvas-pattern-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-canvas-pattern-expected.png
deleted file mode 100644
index 9d72050..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-canvas-pattern-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-filter-all-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-filter-all-expected.png
deleted file mode 100644
index bca87bc..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-filter-all-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-svg-resource-url-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-svg-resource-url-expected.png
deleted file mode 100644
index bf5482c..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-svg-resource-url-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-mask-image-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-mask-image-svg-expected.png
deleted file mode 100644
index 8b69fc1b..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-mask-image-svg-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-object-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-object-expected.png
deleted file mode 100644
index c3e811c..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-object-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-svg-expected.png
deleted file mode 100644
index 8811964..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-svg-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-svg-fill-text-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-svg-fill-text-expected.png
deleted file mode 100644
index feaee0d..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-svg-fill-text-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/optimize-contrast-canvas-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/optimize-contrast-canvas-expected.png
deleted file mode 100644
index 4b949f6..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/optimize-contrast-canvas-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/optimize-contrast-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/optimize-contrast-image-expected.png
deleted file mode 100644
index 4b949f6..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/optimize-contrast-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/rgb-png-with-cmyk-color-profile-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/rgb-png-with-cmyk-color-profile-expected.png
deleted file mode 100644
index 198816d..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/rgb-png-with-cmyk-color-profile-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/ycbcr-with-cmyk-color-profile-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/ycbcr-with-cmyk-color-profile-expected.png
deleted file mode 100644
index 5d56b945..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/ycbcr-with-cmyk-color-profile-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-border-radius-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-border-radius-expected.png
deleted file mode 100644
index 6045346..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-border-radius-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-filter-expected.png
deleted file mode 100644
index 7d69255..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-filter-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-image-expected.png
deleted file mode 100644
index 9ae0ecc..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png
deleted file mode 100644
index 3958a23e..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-layer-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
deleted file mode 100644
index 9770ca8..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png
deleted file mode 100644
index bf09329..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/media/color-profile-video-poster-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/media/color-profile-video-poster-image-expected.png
deleted file mode 100644
index 4545b78..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/media/color-profile-video-poster-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/media/controls-layout-direction-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/media/controls-layout-direction-expected.png
deleted file mode 100644
index 5c384840..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/media/controls-layout-direction-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png
deleted file mode 100644
index 003529a..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/media/controls/paint-controls-webkit-appearance-none-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/media/controls/paint-controls-webkit-appearance-none-expected.png
deleted file mode 100644
index 23e8c9f..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/media/controls/paint-controls-webkit-appearance-none-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/media/video-no-audio-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/media/video-no-audio-expected.png
deleted file mode 100644
index ae97b49..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/media/video-no-audio-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/media/video-poster-scale-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/media/video-poster-scale-expected.png
deleted file mode 100644
index fec67ce..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/media/video-poster-scale-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png
deleted file mode 100644
index 6450ac7..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/transforms/shadows-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/transforms/shadows-expected.png
deleted file mode 100644
index d8fca81..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/transforms/shadows-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/transforms/svg-vs-css-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/transforms/svg-vs-css-expected.png
deleted file mode 100644
index 1e81382..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/transforms/svg-vs-css-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-gl/transforms/transformed-document-element-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/transforms/transformed-document-element-expected.png
deleted file mode 100644
index ccc4feb..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-gl/transforms/transformed-document-element-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/scrolled-within-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/scrolled-within-boxshadow-expected.png
deleted file mode 100644
index f892df7..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/scrolled-within-boxshadow-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/translated-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/translated-boxshadow-expected.png
deleted file mode 100644
index f4ae91f..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/translated-boxshadow-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/unscrolled-within-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/unscrolled-within-boxshadow-expected.png
deleted file mode 100644
index f892df7..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/unscrolled-within-boxshadow-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/fixed-background-after-style-recalc-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/fixed-background-after-style-recalc-expected.png
deleted file mode 100644
index 3c5231f..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/fixed-background-after-style-recalc-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/clipping-foreground-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/clipping-foreground-expected.png
deleted file mode 100644
index e60646fd..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/clipping-foreground-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/foreground-layer-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/foreground-layer-expected.png
deleted file mode 100644
index f340247..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/foreground-layer-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/vertical-scroll-composited-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/vertical-scroll-composited-expected.png
deleted file mode 100644
index df3fee3..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/vertical-scroll-composited-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/iframes/composited-iframe-alignment-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/iframes/composited-iframe-alignment-expected.png
deleted file mode 100644
index 18e6201..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/iframes/composited-iframe-alignment-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/lots-of-img-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/lots-of-img-layers-expected.png
deleted file mode 100644
index 2bd380d4..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/lots-of-img-layers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/masks/mask-with-added-filters-expected.png
deleted file mode 100644
index 883dfc2..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/masks/mask-with-added-filters-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/masks/mask-with-removed-filters-expected.png
deleted file mode 100644
index 93aac55..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/masks/mask-with-removed-filters-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/border-radius-above-composited-subframe-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/border-radius-above-composited-subframe-expected.png
deleted file mode 100644
index 9420be9..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/border-radius-above-composited-subframe-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/border-radius-composited-subframe-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/border-radius-composited-subframe-expected.png
deleted file mode 100644
index 957a113..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/border-radius-composited-subframe-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/mask-with-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/mask-with-filter-expected.png
deleted file mode 100644
index 42ad9838..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/mask-with-filter-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/transform-3d-scales-different-x-y-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/transform-3d-scales-different-x-y-expected.png
deleted file mode 100644
index 6f9d05a..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/transform-3d-scales-different-x-y-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t090501-c414-flt-02-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t090501-c414-flt-02-d-g-expected.png
deleted file mode 100644
index 41a51969..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t090501-c414-flt-02-d-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t090501-c414-flt-03-b-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t090501-c414-flt-03-b-g-expected.png
deleted file mode 100644
index aa3a80df..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t090501-c414-flt-03-b-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png
deleted file mode 100644
index 5cd9846..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png
deleted file mode 100644
index dbed180..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-auto1-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-auto1-expected.png
deleted file mode 100644
index 2a13c6c..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-auto1-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-border-expected.png
deleted file mode 100644
index 81c8165..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-border-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-content-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-content-expected.png
deleted file mode 100644
index 540b55d..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-content-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-padding-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-padding-expected.png
deleted file mode 100644
index 3ab12e4..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-padding-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
deleted file mode 100644
index 3b4b67b..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-default-value-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-default-value-expected.png
deleted file mode 100644
index a3addc5..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-default-value-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-gradient-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-gradient-gradient-expected.png
deleted file mode 100644
index 45fc8b1a..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-gradient-gradient-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-gradient-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-gradient-image-expected.png
deleted file mode 100644
index c2634a3..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-gradient-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-color-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-color-expected.png
deleted file mode 100644
index 9ab503d..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-color-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-image-expected.png
deleted file mode 100644
index f0fddb9..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-svg-expected.png
deleted file mode 100644
index a9b7fbf..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-svg-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-multiple-background-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-multiple-background-layers-expected.png
deleted file mode 100644
index d261b79..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-multiple-background-layers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-single-layer-no-blending-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-single-layer-no-blending-expected.png
deleted file mode 100644
index 53bd4dd..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-single-layer-no-blending-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-svg-color-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-svg-color-expected.png
deleted file mode 100644
index 085df7a2..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-svg-color-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-tiled-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-tiled-gradient-expected.png
deleted file mode 100644
index 9eb2088..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-tiled-gradient-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-expected.png
deleted file mode 100644
index c660ac5..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-stacking-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-stacking-expected.png
deleted file mode 100644
index 762f1fa0..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-stacking-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-tiled-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-tiled-expected.png
deleted file mode 100644
index a739808..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-tiled-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-1-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-1-expected.png
deleted file mode 100644
index 2a4cf3a..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-1-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-2-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-2-expected.png
deleted file mode 100644
index 5e7dd22..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-3-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-3-expected.png
deleted file mode 100644
index 4cfeeac5..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-3-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/blur-filter-page-scroll-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/blur-filter-page-scroll-expected.png
deleted file mode 100644
index 13199ce..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/blur-filter-page-scroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/blur-filter-page-scroll-parents-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/blur-filter-page-scroll-parents-expected.png
deleted file mode 100644
index 40e36254..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/blur-filter-page-scroll-parents-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/blur-filter-page-scroll-self-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/blur-filter-page-scroll-self-expected.png
deleted file mode 100644
index 435df40..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/blur-filter-page-scroll-self-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/crash-filter-change-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/crash-filter-change-expected.png
deleted file mode 100644
index 342569f..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/crash-filter-change-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-blur-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-blur-expected.png
deleted file mode 100644
index e8d6380..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-blur-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-brightness-clamping-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-brightness-clamping-expected.png
deleted file mode 100644
index 7eaa94d..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-brightness-clamping-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-combined-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-combined-expected.png
deleted file mode 100644
index 24b0124..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-combined-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-drop-shadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-drop-shadow-expected.png
deleted file mode 100644
index e867f579..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-drop-shadow-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-reference-colorspace-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-reference-colorspace-expected.png
deleted file mode 100644
index 8848e11..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-reference-colorspace-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-reference-subregion-expected.png
deleted file mode 100644
index 72f61363..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-reference-subregion-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-change-repaint-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-change-repaint-expected.png
deleted file mode 100644
index 358543cd..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-change-repaint-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-blur-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-blur-expected.png
deleted file mode 100644
index 78899f9..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-blur-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-child-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-child-layers-expected.png
deleted file mode 100644
index c43a03d1..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-child-layers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-expected.png
deleted file mode 100644
index 3487462..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-shadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-shadow-expected.png
deleted file mode 100644
index c630f90..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-shadow-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/regions-expanding-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/regions-expanding-expected.png
deleted file mode 100644
index a5fe160..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/regions-expanding-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-auto1-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-auto1-expected.png
deleted file mode 100644
index 0a78c2e..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-auto1-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-border-expected.png
deleted file mode 100644
index 16294b88..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-border-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-content-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-content-expected.png
deleted file mode 100644
index 7313af2a..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-content-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-padding-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-padding-expected.png
deleted file mode 100644
index a36baae..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-padding-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-space-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-space-border-expected.png
deleted file mode 100644
index 3ad19647..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-space-border-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/fast/canvas/pixelated-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/fast/canvas/pixelated-expected.png
deleted file mode 100644
index 336aff93..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/fast/canvas/pixelated-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-expected.png
deleted file mode 100644
index f89ed93..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-rotate-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-rotate-expected.png
deleted file mode 100644
index 8736e02..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-rotate-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cover-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cover-expected.png
deleted file mode 100644
index f31f678..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cover-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cross-fade-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cross-fade-expected.png
deleted file mode 100644
index 1708a70..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cross-fade-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cross-fade-png-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cross-fade-png-expected.png
deleted file mode 100644
index 1708a70..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cross-fade-png-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-repeat-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-repeat-expected.png
deleted file mode 100644
index 29fa56d..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-repeat-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-space-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-space-expected.png
deleted file mode 100644
index 2549378..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-space-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-fade-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-fade-expected.png
deleted file mode 100644
index ebfcbf0..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-fade-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-image-expected.png
deleted file mode 100644
index ddf6c04..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-group-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-group-expected.png
deleted file mode 100644
index 8561c37..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-group-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-canvas-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-canvas-expected.png
deleted file mode 100644
index b49e59f..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-canvas-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-canvas-pattern-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-canvas-pattern-expected.png
deleted file mode 100644
index 9d72050..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-canvas-pattern-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-filter-all-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-filter-all-expected.png
deleted file mode 100644
index 9989ff0..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-filter-all-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-svg-resource-url-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-svg-resource-url-expected.png
deleted file mode 100644
index bf5482c..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-svg-resource-url-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-mask-image-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-mask-image-svg-expected.png
deleted file mode 100644
index ed88c12..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-mask-image-svg-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-object-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-object-expected.png
deleted file mode 100644
index 0ce0793..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-object-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-svg-expected.png
deleted file mode 100644
index 8811964..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-svg-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-svg-fill-text-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-svg-fill-text-expected.png
deleted file mode 100644
index ee8d50e..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-svg-fill-text-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/optimize-contrast-canvas-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/optimize-contrast-canvas-expected.png
deleted file mode 100644
index 4b949f6..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/optimize-contrast-canvas-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/optimize-contrast-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/optimize-contrast-image-expected.png
deleted file mode 100644
index 4b949f6..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/optimize-contrast-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/rgb-png-with-cmyk-color-profile-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/rgb-png-with-cmyk-color-profile-expected.png
deleted file mode 100644
index ed95cd22..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/rgb-png-with-cmyk-color-profile-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/ycbcr-with-cmyk-color-profile-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/ycbcr-with-cmyk-color-profile-expected.png
deleted file mode 100644
index f978852..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/ycbcr-with-cmyk-color-profile-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-border-radius-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-border-radius-expected.png
deleted file mode 100644
index 6045346..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-border-radius-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-filter-expected.png
deleted file mode 100644
index 7d69255..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-filter-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-image-expected.png
deleted file mode 100644
index 9ae0ecc..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png
deleted file mode 100644
index a770804..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-layer-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
deleted file mode 100644
index 9770ca8..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-layer-filter-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png
deleted file mode 100644
index bf09329..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/color-profile-video-poster-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/color-profile-video-poster-image-expected.png
deleted file mode 100644
index 149fc763..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/color-profile-video-poster-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/controls-layout-direction-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/controls-layout-direction-expected.png
deleted file mode 100644
index eb1ddc9d..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/controls-layout-direction-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png
deleted file mode 100644
index 003529a..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/controls/paint-controls-webkit-appearance-none-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/controls/paint-controls-webkit-appearance-none-expected.png
deleted file mode 100644
index 23e8c9f..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/controls/paint-controls-webkit-appearance-none-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/video-no-audio-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/video-no-audio-expected.png
deleted file mode 100644
index ae97b49..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/video-no-audio-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/video-poster-scale-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/video-poster-scale-expected.png
deleted file mode 100644
index fec67ce..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/video-poster-scale-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png
deleted file mode 100644
index 6450ac7..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/shadows-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/shadows-expected.png
deleted file mode 100644
index 6978957..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/shadows-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/svg-vs-css-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/svg-vs-css-expected.png
deleted file mode 100644
index 1e81382..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/svg-vs-css-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/transformed-document-element-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/transformed-document-element-expected.png
deleted file mode 100644
index ccc4feb..0000000
--- a/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/transformed-document-element-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/no-crash-with-stack-id-and-stale-while-revalidate-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/no-crash-with-stack-id-and-stale-while-revalidate-expected.txt
index 3780745..7fbdb65 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/no-crash-with-stack-id-and-stale-while-revalidate-expected.txt
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/no-crash-with-stack-id-and-stale-while-revalidate-expected.txt
@@ -1,4 +1,2 @@
 Tests that checks for no crashes when stale-while-revalidate is on
-Request Will be Sent for stale-script.php
-Request Will be Sent for stale-script.php
 
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/no-crash-with-stack-id-and-stale-while-revalidate.js b/third_party/blink/web_tests/http/tests/inspector-protocol/no-crash-with-stack-id-and-stale-while-revalidate.js
index c031c78..15a3be8 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/no-crash-with-stack-id-and-stale-while-revalidate.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/no-crash-with-stack-id-and-stale-while-revalidate.js
@@ -9,15 +9,8 @@
   dp.Network.enable();
   dp.Network.setAttachDebugStack({enabled: true});
   await dp.Page.reload({ignoreCache: false});
-  dp.Network.onRequestWillBeSent(request => {
-    const url = request.params.request.url;
-    if (/stale-script\.php$/.test(url)) {
-      testRunner.log('Request Will be Sent for ' + url.substr(url.lastIndexOf('stale-script.php')));
-    }
-  });
 
   let numResponses = 0;
-
   dp.Network.onResponseReceived(request => {
     const url = request.params.response.url;
     if (/stale-script\.php$/.test(url)) {
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/image-document-default-src-none-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/image-document-default-src-none-expected.txt
index 1500b310..0ff6306 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/image-document-default-src-none-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/image-document-default-src-none-expected.txt
@@ -1,9 +1,9 @@
 CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-irYXJOS8dfWxS3v4lGnL1OcyQjamq/FGUi7NhXhtBOk='), or a nonce ('nonce-...') is required to enable inline execution. Note that hashes do not apply to event handlers, style attributes and javascript: navigations unless the 'unsafe-hashes' keyword is present. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
 
-CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-VPZ2mdsWWlqXOFgt1tAllbbJhG8t9bh6emP1o9GwJxY='), or a nonce ('nonce-...') is required to enable inline execution. Note that hashes do not apply to event handlers, style attributes and javascript: navigations unless the 'unsafe-hashes' keyword is present. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
+CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-mqLU0Zw7B/c6fYkvbRoA2V1jZ1apgellJyv17d18uTs='), or a nonce ('nonce-...') is required to enable inline execution. Note that hashes do not apply to event handlers, style attributes and javascript: navigations unless the 'unsafe-hashes' keyword is present. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
 
-CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-VPZ2mdsWWlqXOFgt1tAllbbJhG8t9bh6emP1o9GwJxY='), or a nonce ('nonce-...') is required to enable inline execution. Note that hashes do not apply to event handlers, style attributes and javascript: navigations unless the 'unsafe-hashes' keyword is present. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
+CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-mqLU0Zw7B/c6fYkvbRoA2V1jZ1apgellJyv17d18uTs='), or a nonce ('nonce-...') is required to enable inline execution. Note that hashes do not apply to event handlers, style attributes and javascript: navigations unless the 'unsafe-hashes' keyword is present. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
 
-CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-VPZ2mdsWWlqXOFgt1tAllbbJhG8t9bh6emP1o9GwJxY='), or a nonce ('nonce-...') is required to enable inline execution. Note that hashes do not apply to event handlers, style attributes and javascript: navigations unless the 'unsafe-hashes' keyword is present. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
+CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-mqLU0Zw7B/c6fYkvbRoA2V1jZ1apgellJyv17d18uTs='), or a nonce ('nonce-...') is required to enable inline execution. Note that hashes do not apply to event handlers, style attributes and javascript: navigations unless the 'unsafe-hashes' keyword is present. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
 
 Ensure that we don't crash when loading an ImageDocument that sets CSP headers 
diff --git a/third_party/blink/web_tests/images/huge-image-viewport-scale-expected.txt b/third_party/blink/web_tests/images/huge-image-viewport-scale-expected.txt
index a394685..67b7536 100644
--- a/third_party/blink/web_tests/images/huge-image-viewport-scale-expected.txt
+++ b/third_party/blink/web_tests/images/huge-image-viewport-scale-expected.txt
@@ -4,5 +4,5 @@
 
 
 viewport meta: <meta name="viewport" content="width=device-width, minimum-scale=0.1">
-image style: -webkit-user-select: none;margin: auto;cursor: zoom-in;background-color: hsl(0, 0%, 90%);transition: background-color 300ms;
+image style: display: block;-webkit-user-select: none;margin: auto;cursor: zoom-in;background-color: hsl(0, 0%, 90%);transition: background-color 300ms;
 image actual width: 100
diff --git a/third_party/blink/web_tests/platform/linux/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/linux/dark-mode/colors/web-theme-expected.png
index c815c74e..0b306bc 100644
--- a/third_party/blink/web_tests/platform/linux/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/linux/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
index a6e40bc..7bd20a1 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
index f24d71ca..578182b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
index f24d71ca..578182b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
index b59938c..8dac75f 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
index 9b1a926..aa88162 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
index 22544d46..33e117121 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
index f01e557c5..889d20e5 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
index b8a5d0e..0c008f0 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
index 3e84cc1a..54ed990 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
index 4876819..5c58bdc 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
index f24d71ca..578182b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
index 2ea5278..ce34721d 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
index a6e40bc..7bd20a1 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
index 01af686d..393ab40 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
index de471b91..ff9d0ca 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
index b527819..db5e26e 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
index 8c24098..34ddc3b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-expected.png
index 77a3992..b445031 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
index 78f307ae..fbe7bbf 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-expected.png
index ae914fd..cb76a157 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
index 30e564ad..6e8fc37 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index f24d71ca..578182b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 45633d5cc..0f752ccf 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 49e2ecca..1a4c6de4 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index 7e5c1d4..8802c83 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index d3bc585..c273a1c3 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index ba6b4d4..b24fa3a 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 5a6ae80..24bb8e0 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 83edb14..bb9ca6b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 8e01d4dc..7fbe1dc 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 3d16ac3..341c4d39 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
index b66bb9d..3aa0c113 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 44d8b2a..328fc1e 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 74dec6c..f5f21bab 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
index 9fbbc66..3e2923a 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index af835e7..3fad39a 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index 04e4cc0..3ce771a 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 66f3ef61..9786d43 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-basic-expected.png
index 59409ba0..29681f8 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-l10n-expected.png
index f2df5a39..9b834433 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-pseudo-elements-expected.png
index 184aa08..ed09a89 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-text-height-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-text-height-appearance-expected.png
new file mode 100644
index 0000000..efe37d1
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-text-height-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
index 2289e90..ccf4eec3 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
index eb108ce..abdda3c7 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
index e84d10d..13dc832 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-basic-expected.png
index 71e595e..b3afe7f 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-l10n-expected.png
index 8fffff82..0ccad93 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-pseudo-elements-expected.png
index 218e126d..23dc6256 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-disabled-today-expected.png
index 2f6edd0..b1f1dc6 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-disabled-today-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-disabled-today-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-rtl-expected.png
index 5a56a3d..72b65c0 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-step-expected.png
index 0bda3215..155c3db9 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
index 79d7bc49..c71bc6d 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-zoom150-expected.png
index 1ec0830..a91aeb3 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 3059687c..31a268c 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
index 010c86f9..5da1fce 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
index 6d0bf10..6f08c52 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 0cd7c02..d5c7a68 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
index 1f402ff..8dd2001 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
index 3ccf384b..60dd8cae7 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
index ed89690..5067c57c 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
index d09fa5a..671d4571 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
index 1ba49a1..aeeb87d9 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
index 81702759..7fbe697f 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
index ca89c85..098a9b2d 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
index 31dec7a7..a51f4dd 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
index 1ca0119..8c0be07 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-basic-expected.png
index 3f0a4ee..adf754a 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-pseudo-elements-expected.png
index b7b84199..4849b975 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 782c8252..a2aecce 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 2afee44..1359c52 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 2be8342..2476bdf 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index c3770e8..5e27703 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index aaf7bc96..1c67892 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index f97847b..7bcf999 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 679fa66..08262c8 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index f6d823d..bdf0cfdd 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 28aca2e6..29ee873 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 0f7f0ea..bbb9d79 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 82ba251..1baf6ad0c 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index ea5b105..da017fe 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 6f20f71..22d7702 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
index 09c9113..640a068 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index 3cbdbdec..00342f5 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index 2245ab0..531c173a 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 01206acd..2ca1e741 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-focus-ring-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-focus-ring-expected.png
index 21603e0d..41ced69d 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
index 1cf104a..b03cf16 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-open-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-open-expected.png
index c201490..805b57b 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-open-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-open-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
index 6fab181..5abf433 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
index dfb6320f..11397d2 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 79e0cdf..4b6ce05 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index a6b76af4..303e9cfd 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 3049d29..7bc9640b 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index 8fa9b68..fc5498f8 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 20c2f70..88e6c9e 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 2802b10d..460e41e5 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 28884fd3..080bfd3 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 3663643a..0c5f626 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 33e096c..0a3b7033e 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index ab5013a..fc487b2 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index 6009c4d..9a6bd4a4 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index afaa478..efce4490 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 5b127029..243fe79 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
index 6e6b90e..7da1797 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
index 6e6b90e..7da1797 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
index f8573f3..95e57228 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 7b8dd60..c31aa251 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
index 9a23caa1..0d8f917 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index ee2b9253..4a43b68 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
index 9a23caa1..0d8f917 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index ee2b9253..4a43b68 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
new file mode 100644
index 0000000..31a268c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..5da1fce
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..6f08c52
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
new file mode 100644
index 0000000..8dd2001
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..60dd8cae7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..5067c57c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
new file mode 100644
index 0000000..671d4571
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..aeeb87d9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..7fbe697f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
new file mode 100644
index 0000000..098a9b2d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..a51f4dd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..8c0be07
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
deleted file mode 100644
index a6d768f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
index 9b56399..b66de54 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
new file mode 100644
index 0000000..3a5beb75
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/date/date-text-height-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/date/date-text-height-appearance-expected.png
new file mode 100644
index 0000000..dad32dba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/date/date-text-height-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..7b190b9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-step-expected.png
new file mode 100644
index 0000000..e92bbaf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-zoom150-expected.png
index 3f8a4bafb..d522c03 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
index 80f4029..ef56db6 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
index 81fefe9..1dbfdcf 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
new file mode 100644
index 0000000..0a2fc8c2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..678b979
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
index 047777a..584f28f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-appearance-l10n-expected.png
index 6363b747..aed67c5 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-picker-appearance-step-expected.png
new file mode 100644
index 0000000..8d940d2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..ebb46c5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
new file mode 100644
index 0000000..1c16251d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/date/date-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/date/date-appearance-l10n-expected.png
index 832eca8..abfa1f40 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/date/date-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/date/date-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..47c66612
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
index 536ede29..84876274 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/month/month-appearance-l10n-expected.png
index 8f7ee6d9..456ef20 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/month/month-picker-appearance-step-expected.png
new file mode 100644
index 0000000..e92bbaf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..0bcd796
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..ce6bd97
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
index ed7ce9b..6b9a2b9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/month/month-appearance-l10n-expected.png
index 18f2dc4..e288ec7 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/month/month-picker-appearance-step-expected.png
new file mode 100644
index 0000000..8d940d2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..4d4bfcbc
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
new file mode 100644
index 0000000..5de2afc
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/month/month-picker-appearance-zoom150-expected.png
deleted file mode 100644
index 4fc9ca7..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac/dark-mode/colors/web-theme-expected.png
index a8e6cf6..23bbf00 100644
--- a/third_party/blink/web_tests/platform/mac/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/mac/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
similarity index 81%
copy from third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
copy to third_party/blink/web_tests/platform/mac/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
index f8f1c989..714a65a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
@@ -1,4 +1,4 @@
 This is a testharness.js-based test.
-FAIL scroll-margin on input widget assert_between_exclusive: Should honor date input scroll-margin expected a number greater than 4750 and less than 4850 but got 4720
+FAIL scroll-margin on input widget assert_between_exclusive: Should honor date input scroll-margin expected a number greater than 4750 and less than 4850 but got 4718.65625
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
index e7aaa99..4a42584 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
index fc16c2dc..7ddafcf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
index fc16c2dc..7ddafcf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
index 84c3b88..4b9c454 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
index 8a23de32..8a64b0f 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
index 913e970..b11c2a9 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
index aa4e3e2..e0ceb13 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
index f48a51b2..2ee3211 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
index df41e58..eb2d63e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
index d80742b..bf4aa49 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
index fc16c2dc..7ddafcf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
index 0df9fd24..a419cdf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
index e7aaa99..4a42584 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
index ecbc986..c10d30c1 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
index 4a4cea7..e327d83 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
index d70acec7..89916634 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
index 2ff0013f..41cb8a66 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-expected.png
index 8b08e354..f418b71 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
index cf866cd..31a1f20 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-expected.png
index cc3b881..b65ced553 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
index 5f98cb2..b1636ce 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index fc16c2dc..7ddafcf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index db1236bd..5220ee7e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 273c3df..232dcbbc4 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index fae63175..7e96037 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 035115e..9c35547 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 14470b0..8c85818e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index b8b22e9..ec899024 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index aa3c8c6e..52ba9e9 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index cdde3703..ad76227 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 7b1f2f4..157c408 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
index fde74cb1..e15dcc0e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index a31ec37a..afa56a57 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 1d968d6e..a0c424d 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
index 11f07cb..ab62ee8 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index 2e60dea..0a2fc8c2 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index 8e718aa..171a220 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 501e900..6a0b8b9 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-basic-expected.png
index 2dbf52d..4f4e092 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-l10n-expected.png
index cb58e8b..a2f15ea 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-pseudo-elements-expected.png
index 301e9ea..37f9ad7 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-text-height-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-text-height-appearance-expected.png
new file mode 100644
index 0000000..f59c00e1
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-text-height-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
index 42d0a7e..678b979 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
index 0594ff51..b174ddc 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
index d369ce88..36d2cf31 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-basic-expected.png
index 7ea28f68..496aa831 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-l10n-expected.png
index 1c33e7d..30aa04e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-pseudo-elements-expected.png
index b871f0e..2338f64 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-disabled-today-expected.png
index 85deb2a..623452f 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-disabled-today-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-disabled-today-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-rtl-expected.png
index ccb3667..379c82c6 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-step-expected.png
index f9f0508..e92bbaf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
index c0bac6c..1de545e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-zoom150-expected.png
index 3bbee40..8bb9456 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 2aa87fc..e9c3acc 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
index 911f3d74..a0aa077 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
index 5a3a0b8..6427aa8 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 7b9eb149..375e7e1 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
index 6722ef9..343192ad 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
index e359853c..ce6bd97 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
index 5985027a6..ebb46c5 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 87877a3..a1989ea 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
index 0356410..e8213804 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
index 4315cc1..1cdc28a 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
index a87d48661..c30c8bfc 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
index 67864ba..e97fe43 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
index fe308f7..b10879c 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-basic-expected.png
index cc27574..af692fd 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-pseudo-elements-expected.png
index 0bca035..995c592 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 76912b4..2552bd4 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 50d15bd..cfb480d3 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 5b8236182..ddf1dcc 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index ba0f38b..db52e60 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 79699e68..bc68d827 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 8e7e61d..91e94ef 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 0ee8d1c..4ed1ccea 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index b51a996..3e9b686 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 858a143..b4964ed9 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 0959094f..1fa6f82 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 10408733..93e1d6a 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 1b768dd..5300606 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 7292c7e8..141e63e 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
index bf4fd61..e57c91e 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index bc169ca..f98d299 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index 6338915..e338279 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 38b914e..ebe88e62 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-focus-ring-expected.png
index 07571313..0d2c575 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
index 98eb003..bb0cfe9 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-open-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-open-expected.png
index 031676b0..84632a5 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-open-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-open-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
index 6772933..0c920bd9 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
index 701c9d6..ec0a6418 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 4e8daa7..50b063e8 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 6784d41..981b720 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index eca3c935..1405a2a 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index d698ff0..85c6afb 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index a9dc7ed..dbc277f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 9f710e7..d8a7656 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index dd2b013..c5694b5 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 1771e9b..e2e1a46 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 25c4d9a6..c492c32 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index df9dc27..a08f2ba3 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index b823190..9852a0c2 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index e516f14..71049de9 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 187e80ac..e008dc8 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
index c6cfaca..6b7bf79f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
index c6cfaca..6b7bf79f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
index ea0c986..c7ab634 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index e1859b3..b1566ee4 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/win/dark-mode/colors/web-theme-expected.png
index e469293..de80442 100644
--- a/third_party/blink/web_tests/platform/win/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/win/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
similarity index 83%
rename from third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
rename to third_party/blink/web_tests/platform/win/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
index f8f1c989..48717ed 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
+++ b/third_party/blink/web_tests/platform/win/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
@@ -1,4 +1,4 @@
 This is a testharness.js-based test.
-FAIL scroll-margin on input widget assert_between_exclusive: Should honor date input scroll-margin expected a number greater than 4750 and less than 4850 but got 4720
+FAIL scroll-margin on input widget assert_between_exclusive: Should honor date input scroll-margin expected a number greater than 4750 and less than 4850 but got 4719
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
index 2abd583..fa142077 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
index d3953d0..51c2b82 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
index d3953d0..51c2b82 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
index f57dac18..5fe3aed 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
index 8f0279ca..bcba0f6 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
index 5dffab7..a0125ae4 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
index 73b39a49..58a98e6 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
index 5201f8aa..029a31f 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
index 137ef6a..24739a8 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
index 63e9daa..dd380c21 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
index d3953d0..51c2b82 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
index 624cdab..41ca588 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
index 2abd583..fa142077 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
index cce1caf..7e4a611 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
index 3037044..36385e1 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
index ff140fab..a170dfc 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
index 878963e..c2acba1 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-expected.png
index cd99842..8b6239a0 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
index 0709ed9..9ad068e 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-expected.png
index c0b892c..8269f62 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
index 5fc7e18..a2e8b23 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index d3953d0..51c2b82 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 124f51a..d4604c6 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 3ab2d54..c9a3663c 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index 62e4d24c..923130b 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 5f2df55..3773804 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 4e7179b..eecc3d2 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 4fefc39..3d2e915 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 8fbbd9a..abfa71c 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 0715a88..210cca1 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 3ef329ea..9e1a5d6 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 3a2c6c4..b9a5360 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 92305ae..8d04d56 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index d3dd9da1..10907dd 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
index 4f69a2b..5ac4d44c 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index 1c2709f..00c12c2 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index e70cdc0..4718e3b 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 384d34ad..3827c63e 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-basic-expected.png
index de48939b..9aa1aad 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-l10n-expected.png
index 4f8f223d..0ddee2a 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-pseudo-elements-expected.png
index 7b771b9..fedaf2e5 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/date/date-text-height-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/date/date-text-height-appearance-expected.png
new file mode 100644
index 0000000..8fd88a62
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/fast/forms/date/date-text-height-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
index 86f075a..9b189db 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
index 66716f2..832e907ce 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
index 6bb736e..54efc06 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-basic-expected.png
index 103853c5..db4067ef 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-l10n-expected.png
index e83014c..b4b4af2 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-pseudo-elements-expected.png
index 4358481..3e25dd7 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-disabled-today-expected.png
index d6cb3ae..f554d9a 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-disabled-today-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-disabled-today-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-rtl-expected.png
index 3224caa..80240c5 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-step-expected.png
index 0a84ae2..cd61859 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
index e588a68..be17577e 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-zoom150-expected.png
index fd97625c..b1969ca 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 49005e8..62cd725 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
index 8d40c3eb..61a20825 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
index 9539258..178ca29 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 9bf02c4..e69767e 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
index c003ac31..c1c0f45 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
index f1e2c7d..4990a07 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
index 3f7543cf..477ac19b 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 07a21ce6..4863c0b 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
index c34608e..c2fd011f 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
index 4b2cfbc..5020767 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
index 54e471d..a769a17 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
index a2b5d70c..09b4cce 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
index 04d05057..d08f3bb 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-basic-expected.png
index d9e24145..26d2bb4 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-pseudo-elements-expected.png
index cb89df1..61cb79c 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index b22e889..b5ea1a0 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 6ced17e..6a89275 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 53c03a8..82e9516d2 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index 62a20c5b..e3ca519d 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index c4c9b935..c690fa89 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 7266afd..72a6f8d 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index f9e20f33..56c5fb2 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 0262c356..70fea86 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 5c797fd..b14eeb1 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index cd55d1f..3eb402a 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 5ac842ab..e89c2c1b 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 3cf6a33..034a257 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 861ba0a..c521efad 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
index 5920803..101d4f3 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index ae8050b8..7a2e0bc9 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index c3faa86..d1e1bb7 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 5f82982..d5053c32 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-focus-ring-expected.png
index b97bc4d..5e56451 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
index 28c73d05..bc926b2 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-open-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-open-expected.png
index ca52697..44e0c25 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-open-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-open-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
index 075a478..a5a9548f8 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
index a49af54..e50590a 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 304a391..d905d16b 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index e855960..5f47e67 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index e46f788a..55d05b7 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index 2d2dff24..8bd1c22 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 9a36c7c3..ee5290f 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 97f27fd..0400e320 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 9cefea7..97b299a 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 4fc483b..76cd54ff 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 98de2ad..552439f 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 6ad77ca4..8d80e9e 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index e68514c..879f587 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index 443ec0f..daaec91 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 75ca996..5fa9e6d 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
index 74f077f..592c4ea4 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
index 74f077f..592c4ea4 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
index e2bb1948..c15cebfe 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 0aa666f..49419172 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
index 361c940..61341560 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index f2d9436..546026f 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
index 361c940..61341560 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 8e5abbd..546026f 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
index 18b0075..5a49087 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
index 474635c3..afb364a 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
index 474635c3..afb364a 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
index ba135e4..d0f480c0 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
index 9d01faae..2ebd5771 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
index bf1e377..2d63425 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
index a63a2434..d0316b088 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
index d7290f62..13a800b 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
index bff4f72..5f7fd6c8 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
index 474635c3..afb364a 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
index 11a06c8..caadefde 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
index 18b0075..5a49087 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
index ad30dccb..eec66e7 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
index 971f5b1d..306cceb 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
index 0da3c55..732a3d9 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
index 6e403495..0b9f05e 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-expected.png
index 09b719a5..8a6f329 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
index 11c6b400..b3a22bd 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-expected.png
index b0d878f..d84f3f9e 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
index 222788b..daaa0a7ea 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 474635c3..afb364a 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 7412d894..bb0fc3a 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index fd926ba6..38dd860 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 879da59..43c85ea 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index eb3af14..1b601ce 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index bf39923..7d718ed 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index b1dfd141..6228eaa 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 6454c142..8ee78ff 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 73a95cd..18170bd 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index 5493d5c..12ca136 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index 11514e8..d8a75f1 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/date/date-text-height-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/date/date-text-height-appearance-expected.png
new file mode 100644
index 0000000..1fd205a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/date/date-text-height-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
index 51ffa5c..3de79c6 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
index 0cb7ff9..2fe4e71 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-basic-expected.png
index 9c10dbe..c267e7b6 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png
index 4cc6c6ae..949f71b 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-pseudo-elements-expected.png
index 2e4272e..7032f70 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-disabled-today-expected.png
index 6a9025936..7a8df7ad 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-disabled-today-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-disabled-today-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-rtl-expected.png
index fb4fbb4..fb182ed 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-step-expected.png
index 3d54765c..d34745b1 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
index 284610e..7077b66 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-zoom150-expected.png
index a6788b6..06d8a3a 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
deleted file mode 100644
index cb4e704..0000000
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
deleted file mode 100644
index 9390d81..0000000
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
index f44c015..168085d 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
index 9f0ced1..c72df20e6 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
index 9b7dc92..97d8ce7d 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
deleted file mode 100644
index 41a74ca..0000000
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
deleted file mode 100644
index 6de1d43..0000000
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
deleted file mode 100644
index 423a022..0000000
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index ff77d15..ac3a68a 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index ae0118e..d9f6e17 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index b3f1003..a6fa3f36 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 32f7495..66f3346 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 88490f7..4ef71eb 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 3a3c840..7b50fb4 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 6e18317..9f8fc88 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 66372a1..fba2ade 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 06f2b79..6f16460 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index e4b5a4d..2edc244 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index d6d05f0..26ce1e8 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
index eb39917b..c48aa74 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-open-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-open-expected.png
index 75f249a5e..02c430c 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-open-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-open-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
index 954c9269..a735131d5 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 0e7cd628..02b6fb57 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 4319c97f..2801805 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index f8c56ba4..0d01f592 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index d49f620..2afd43f 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 869ecbc..b7a6847 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 51d4fa2..6b9b5352 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index c7012f1e..dabc52f 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index d2290b7..66e253a 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index 59636dc..5dbcf1b2 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index f91d5fd..2405d71c 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
index f0dbe7f..d9b9422 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index f0f9d804..22127ab 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
index fde4489..2e85da81 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 7bc8edb..6271ad1 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
index fde4489..2e85da81 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 309fdc9..6271ad1 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
index f44c015..168085d 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..c72df20e6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..97d8ce7d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/libxml/README.chromium b/third_party/libxml/README.chromium
index 1d1d773..03822a1 100644
--- a/third_party/libxml/README.chromium
+++ b/third_party/libxml/README.chromium
@@ -1,6 +1,6 @@
 Name: libxml
 URL: http://xmlsoft.org
-Version: dea91c97debeac7c1aaf9c19f79029809e23a353
+Version: eab86522163ec52602a020f62baa9f6cf87ec870
 CPEPrefix: cpe:/a:xmlsoft:libxml2:2.9.12
 License: MIT
 License File: src/Copyright
@@ -12,7 +12,6 @@
 
 Modifications:
 
-- chromium-issue-599427.patch: workaround for VS 2015 Update 2 code-gen bug
 - chromium-issue-628581.patch: See https://crbug.com/628581#c18
 - chromium-issue-894933.patch: Use ptrdiff_t instead of unsigned long for
     pointer differences in parser.c
diff --git a/third_party/libxml/chromium/chromium-issue-599427.patch b/third_party/libxml/chromium/chromium-issue-599427.patch
deleted file mode 100644
index 20e26c5..0000000
--- a/third_party/libxml/chromium/chromium-issue-599427.patch
+++ /dev/null
@@ -1,28 +0,0 @@
---- a/xmlstring.c	2016-05-13 17:24:58.870079372 +0900
-+++ b/xmlstring.c	2016-04-25 13:58:09.879238595 +0900
-@@ -835,16 +835,20 @@
-     while ( len-- > 0) {
-         if ( !*ptr )
-             break;
--        if ( (ch = *ptr++) & 0x80)
--            while ((ch<<=1) & 0x80 ) {
--		if (*ptr == 0) break;
-+        if ( (ch = *ptr++) & 0x80) {
-+            // Workaround for an optimization bug in VS 2015 Update 2, remove
-+            // once the fix is released. crbug.com/599427
-+            // https://connect.microsoft.com/VisualStudio/feedback/details/2582138
-+            xmlChar ch2 = ch;
-+            while ((ch2<<=1) & 0x80 ) {
-                 ptr++;
--	    }
-+                if (*ptr == 0) break;
-+            }
-+        }
-     }
-     return (ptr - utf);
- }
- 
--
- /**
-  * xmlUTF8Strndup:
-  * @utf:  the input UTF8 *
diff --git a/third_party/libxml/chromium/roll.py b/third_party/libxml/chromium/roll.py
index ef23d4c3..e936c25 100755
--- a/third_party/libxml/chromium/roll.py
+++ b/third_party/libxml/chromium/roll.py
@@ -66,7 +66,6 @@
 #    e. Complete the review as usual
 
 PATCHES = [
-    'chromium-issue-599427.patch',
     'chromium-issue-628581.patch',
     'libxml2-2.9.4-security-xpath-nodetab-uaf.patch',
     'chromium-issue-708434.patch',
diff --git a/third_party/libxml/linux/config.h b/third_party/libxml/linux/config.h
index 25172b5..bccbf1e 100644
--- a/third_party/libxml/linux/config.h
+++ b/third_party/libxml/linux/config.h
@@ -22,7 +22,8 @@
 /* Define to 1 if you have the <ctype.h> header file. */
 #define HAVE_CTYPE_H 1
 
-/* Define to 1 if you have the <dirent.h> header file. */
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
 #define HAVE_DIRENT_H 1
 
 /* Define to 1 if you have the <dlfcn.h> header file. */
@@ -61,18 +62,9 @@
 /* Define to 1 if you have the `isascii' function. */
 #define HAVE_ISASCII 1
 
-/* Define if isinf is there */
-#define HAVE_ISINF /**/
-
-/* Define if isnan is there */
-#define HAVE_ISNAN /**/
-
 /* Define if history library is there (-lhistory) */
 /* #undef HAVE_LIBHISTORY */
 
-/* Define if pthread library is there (-lpthread) */
-/* #undef HAVE_LIBPTHREAD */
-
 /* Define if readline library is there (-lreadline) */
 /* #undef HAVE_LIBREADLINE */
 
@@ -91,9 +83,6 @@
 /* Define to 1 if you have the <math.h> header file. */
 #define HAVE_MATH_H 1
 
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
 /* Define to 1 if you have the `mmap' function. */
 #define HAVE_MMAP 1
 
@@ -165,6 +154,9 @@
 /* Define to 1 if you have the <stdint.h> header file. */
 #define HAVE_STDINT_H 1
 
+/* Define to 1 if you have the <stdio.h> header file. */
+#define HAVE_STDIO_H 1
+
 /* Define to 1 if you have the <stdlib.h> header file. */
 #define HAVE_STDLIB_H 1
 
@@ -263,7 +255,9 @@
 /* Type cast for the send() function 2nd arg */
 #define SEND_ARG2_CAST /**/
 
-/* Define to 1 if you have the ANSI C header files. */
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+   required in a freestanding environment). This macro is provided for
+   backward compatibility; new code need not use it. */
 #define STDC_HEADERS 1
 
 /* Support for IPv6 */
diff --git a/third_party/libxml/mac/config.h b/third_party/libxml/mac/config.h
index 27a79ec..3341a76 100644
--- a/third_party/libxml/mac/config.h
+++ b/third_party/libxml/mac/config.h
@@ -22,7 +22,8 @@
 /* Define to 1 if you have the <ctype.h> header file. */
 #define HAVE_CTYPE_H 1
 
-/* Define to 1 if you have the <dirent.h> header file. */
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
 #define HAVE_DIRENT_H 1
 
 /* Define to 1 if you have the <dlfcn.h> header file. */
@@ -61,18 +62,9 @@
 /* Define to 1 if you have the `isascii' function. */
 #define HAVE_ISASCII 1
 
-/* Define if isinf is there */
-#define HAVE_ISINF /**/
-
-/* Define if isnan is there */
-#define HAVE_ISNAN /**/
-
 /* Define if history library is there (-lhistory) */
 /* #undef HAVE_LIBHISTORY */
 
-/* Define if pthread library is there (-lpthread) */
-/* #undef HAVE_LIBPTHREAD */
-
 /* Define if readline library is there (-lreadline) */
 /* #undef HAVE_LIBREADLINE */
 
diff --git a/third_party/libxml/src/CMakeLists.txt b/third_party/libxml/src/CMakeLists.txt
index 073869f..7e1aa08d 100644
--- a/third_party/libxml/src/CMakeLists.txt
+++ b/third_party/libxml/src/CMakeLists.txt
@@ -139,7 +139,10 @@
 		void __attribute__((destructor))
 		f(void) {}
 		int main(void) { return 0; }
-	" ATTRIBUTE_DESTRUCTOR)
+	" HAVE_ATTRIBUTE_DESTRUCTOR)
+	if(HAVE_ATTRIBUTE_DESTRUCTOR)
+		set(ATTRIBUTE_DESTRUCTOR "__attribute__((destructor))")
+	endif()
 	check_c_source_compiles("
 		#include <netdb.h>
 		int main() { (void) gethostbyname((const char*) \"\"); return 0; }
@@ -158,39 +161,27 @@
 	endif()
 	check_function_exists(class HAVE_CLASS)
 	check_include_files(ctype.h HAVE_CTYPE_H)
-	check_include_files(dirent.h HAVE_DIRENT_H)
 	check_include_files(dlfcn.h HAVE_DLFCN_H)
 	check_library_exists(dl dlopen "" HAVE_DLOPEN)
 	check_include_files(dl.h HAVE_DL_H)
 	check_include_files(errno.h HAVE_ERRNO_H)
 	check_include_files(fcntl.h HAVE_FCNTL_H)
-	check_function_exists(finite HAVE_FINITE)
 	check_include_files(float.h HAVE_FLOAT_H)
 	check_function_exists(fpclass HAVE_FPCLASS)
 	check_function_exists(fprintf HAVE_FPRINTF)
-	check_function_exists(fp_class HAVE_FP_CLASS)
 	check_function_exists(ftime HAVE_FTIME)
 	check_function_exists(getaddrinfo HAVE_GETADDRINFO)
 	check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
 	check_include_files(inttypes.h HAVE_INTTYPES_H)
 	check_function_exists(isascii HAVE_ISASCII)
-	check_function_exists(isinf HAVE_ISINF)
-	check_function_exists(isnan HAVE_ISNAN)
-	check_function_exists(isnand HAVE_ISNAND)
 	check_library_exists(history append_history "" HAVE_LIBHISTORY)
-	check_library_exists(lzma lzma_code "" HAVE_LIBLZMA)
-	check_library_exists(pthread pthread_join "" HAVE_LIBPTHREAD)
 	check_library_exists(readline readline "" HAVE_LIBREADLINE)
-	check_library_exists(z gzread "" HAVE_LIBZ)
 	check_include_files(limits.h HAVE_LIMITS_H)
 	check_function_exists(localtime HAVE_LOCALTIME)
-	check_include_files(lzma.h HAVE_LZMA_H)
 	check_include_files(malloc.h HAVE_MALLOC_H)
 	check_include_files(math.h HAVE_MATH_H)
-	check_include_files(memory.h HAVE_MEMORY_H)
 	check_function_exists(mmap HAVE_MMAP)
 	check_function_exists(munmap HAVE_MUNMAP)
-	check_symbol_exists(DIR ndir.h HAVE_NDIR_H)
 	check_include_files(netdb.h HAVE_NETDB_H)
 	check_include_files(netinet/in.h HAVE_NETINET_IN_H)
 	check_include_files(poll.h HAVE_POLL_H)
@@ -201,7 +192,6 @@
 	check_function_exists(rand_r HAVE_RAND_R)
 	check_include_files(resolv.h HAVE_RESOLV_H)
 	check_library_exists(dld shl_load "" HAVE_SHLLOAD)
-	check_function_exists(signal HAVE_SIGNAL)
 	check_include_files(signal.h HAVE_SIGNAL_H)
 	check_function_exists(snprintf HAVE_SNPRINTF)
 	check_function_exists(sprintf HAVE_SPRINTF)
@@ -214,9 +204,7 @@
 	check_function_exists(strftime HAVE_STRFTIME)
 	check_include_files(strings.h HAVE_STRINGS_H)
 	check_include_files(string.h HAVE_STRING_H)
-	check_symbol_exists(DIR sys/dir.h HAVE_SYS_DIR_H)
 	check_include_files(sys/mman.h HAVE_SYS_MMAN_H)
-	check_symbol_exists(DIR sys/ndir.h HAVE_SYS_NDIR_H)
 	check_include_files(sys/select.h HAVE_SYS_SELECT_H)
 	check_include_files(sys/socket.h HAVE_SYS_SOCKET_H)
 	check_include_files(sys/stat.h HAVE_SYS_STAT_H)
diff --git a/third_party/libxml/src/HTMLparser.c b/third_party/libxml/src/HTMLparser.c
index b56363a..82859b0 100644
--- a/third_party/libxml/src/HTMLparser.c
+++ b/third_party/libxml/src/HTMLparser.c
@@ -3045,7 +3045,7 @@
         NEXT;
     }
 
-    if (CUR != '"') {
+    if (CUR != quote) {
         htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED,
                      "Unfinished PubidLiteral\n", NULL, NULL);
     } else {
@@ -3958,13 +3958,25 @@
 	htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED,
 	             "htmlParseStartTag: invalid element name\n",
 		     NULL, NULL);
+        /*
+         * The recovery code is disabled for now as it can result in
+         * quadratic behavior with the push parser. htmlParseStartTag
+         * must consume all content up to the final '>' in order to avoid
+         * rescanning for this terminator.
+         *
+         * For a proper fix in line with HTML5, htmlParseStartTag and
+         * htmlParseElement should only be called when there's an ASCII
+         * alpha character following the initial '<'. Otherwise, the '<'
+         * should be emitted as text (unless followed by '!', '/' or '?').
+         */
+#if 0
 	/* if recover preserve text on classic misconstructs */
 	if ((ctxt->recovery) && ((IS_BLANK_CH(CUR)) || (CUR == '<') ||
 	    (CUR == '=') || (CUR == '>') || (((CUR >= '0') && (CUR <= '9'))))) {
 	    htmlParseCharDataInternal(ctxt, '<');
 	    return(-1);
 	}
-
+#endif
 
 	/* Dump the bogus tag like browsers do */
 	while ((CUR != 0) && (CUR != '>') &&
@@ -5185,6 +5197,7 @@
 
     input = xmlNewInputStream(ctxt);
     if (input == NULL) {
+	xmlFreeParserInputBuffer(buf);
 	xmlFreeParserCtxt(ctxt);
 	return(NULL);
     }
@@ -5992,32 +6005,12 @@
 		    } else if (cur == '<') {
                         if ((!terminate) && (next == 0))
                             goto done;
-                        /*
-                         * Only switch to START_TAG if the next character
-                         * starts a valid name. Otherwise, htmlParseStartTag
-                         * might return without consuming all characters
-                         * up to the final '>'.
-                         */
-                        if ((IS_ASCII_LETTER(next)) ||
-                            (next == '_') || (next == ':') || (next == '.')) {
-                            ctxt->instate = XML_PARSER_START_TAG;
-                            ctxt->checkIndex = 0;
+                        ctxt->instate = XML_PARSER_START_TAG;
+                        ctxt->checkIndex = 0;
 #ifdef DEBUG_PUSH
-                            xmlGenericError(xmlGenericErrorContext,
-                                    "HPP: entering START_TAG\n");
+                        xmlGenericError(xmlGenericErrorContext,
+                                "HPP: entering START_TAG\n");
 #endif
-                        } else {
-                            htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED,
-                                         "htmlParseTryOrFinish: "
-                                         "invalid element name\n",
-                                         NULL, NULL);
-                            htmlCheckParagraph(ctxt);
-                            if ((ctxt->sax != NULL) &&
-                                (ctxt->sax->characters != NULL))
-                                ctxt->sax->characters(ctxt->userData,
-                                                      in->cur, 1);
-                            NEXT;
-                        }
 			break;
 		    } else {
 		        /*
@@ -6999,7 +6992,9 @@
  * @encoding:  the document encoding, or NULL
  * @options:  a combination of htmlParserOption(s)
  *
- * parse an XML from a file descriptor and build a tree.
+ * parse an HTML from a file descriptor and build a tree.
+ * NOTE that the file descriptor will not be closed when the
+ *      reader is closed or reset.
  *
  * Returns the resulting document tree
  */
@@ -7008,17 +7003,17 @@
 {
     htmlParserCtxtPtr ctxt;
     xmlParserInputBufferPtr input;
-    xmlParserInputPtr stream;
+    htmlParserInputPtr stream;
 
     if (fd < 0)
         return (NULL);
-    xmlInitParser();
 
     xmlInitParser();
     input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE);
     if (input == NULL)
         return (NULL);
-    ctxt = xmlNewParserCtxt();
+    input->closecallback = NULL;
+    ctxt = htmlNewParserCtxt();
     if (ctxt == NULL) {
         xmlFreeParserInputBuffer(input);
         return (NULL);
@@ -7026,7 +7021,7 @@
     stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE);
     if (stream == NULL) {
         xmlFreeParserInputBuffer(input);
-	xmlFreeParserCtxt(ctxt);
+	htmlFreeParserCtxt(ctxt);
         return (NULL);
     }
     inputPush(ctxt, stream);
diff --git a/third_party/libxml/src/Makefile.am b/third_party/libxml/src/Makefile.am
index a9284b9..eb906b07 100644
--- a/third_party/libxml/src/Makefile.am
+++ b/third_party/libxml/src/Makefile.am
@@ -1273,27 +1273,27 @@
 #
 # Install the tests program sources as examples 
 #
-BASE_DIR=$(datadir)/doc
-DOC_MODULE=libxml2-$(VERSION)
-EXAMPLES_DIR=$(BASE_DIR)/$(DOC_MODULE)/examples
+EXAMPLES_DIR=$(docdir)/examples
 
 install-data-local: 
-	$(MKDIR_P) $(DESTDIR)$(BASE_DIR)/$(DOC_MODULE)
-	-$(INSTALL) -m 0644 $(srcdir)/Copyright $(DESTDIR)$(BASE_DIR)/$(DOC_MODULE)
+	$(MKDIR_P) $(DESTDIR)$(docdir)
+	-$(INSTALL) -m 0644 $(srcdir)/Copyright $(DESTDIR)$(docdir)
 	$(MKDIR_P) $(DESTDIR)$(EXAMPLES_DIR)
 	-$(INSTALL) -m 0644 $(srcdir)/xmllint.c $(DESTDIR)$(EXAMPLES_DIR)
 	-$(INSTALL) -m 0644 $(srcdir)/testSAX.c $(DESTDIR)$(EXAMPLES_DIR)
 	-$(INSTALL) -m 0644 $(srcdir)/testHTML.c $(DESTDIR)$(EXAMPLES_DIR)
 	-$(INSTALL) -m 0644 $(srcdir)/testXPath.c $(DESTDIR)$(EXAMPLES_DIR)
+	@echo "If the documentation is installed, please also look at html/examples for more." > $(DESTDIR)$(EXAMPLES_DIR)/README
 
 uninstall-local:
+	rm -f $(DESTDIR)$(EXAMPLES_DIR)/README
 	rm -f $(DESTDIR)$(EXAMPLES_DIR)/testXPath.c
 	rm -f $(DESTDIR)$(EXAMPLES_DIR)/testHTML.c
 	rm -f $(DESTDIR)$(EXAMPLES_DIR)/testSAX.c
 	rm -f $(DESTDIR)$(EXAMPLES_DIR)/xmllint.c
 	rm -rf $(DESTDIR)$(EXAMPLES_DIR)
-	rm -f $(DESTDIR)$(BASE_DIR)/$(DOC_MODULE)/Copyright
-	rm -rf $(DESTDIR)$(BASE_DIR)/$(DOC_MODULE)
+	rm -f $(DESTDIR)$(docdir)/Copyright
+	rm -rf $(DESTDIR)$(docdir)
 
 tst: tst.c
 	$(CC) $(CFLAGS) -Iinclude -o tst tst.c .libs/libxml2.a -lpthread -lm -lz -llzma
diff --git a/third_party/libxml/src/SAX2.c b/third_party/libxml/src/SAX2.c
index 99019a9..0319246 100644
--- a/third_party/libxml/src/SAX2.c
+++ b/third_party/libxml/src/SAX2.c
@@ -742,6 +742,7 @@
         xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR,
 	     "SAX.xmlSAX2AttributeDecl(%s) called while not in subset\n",
 	               name, NULL);
+	xmlFree(name);
 	xmlFreeEnumeration(tree);
 	return;
     }
@@ -1622,10 +1623,10 @@
     ctxt->nodemem = -1;
     if (ctxt->linenumbers) {
 	if (ctxt->input != NULL) {
-	    if (ctxt->input->line < 65535)
-		ret->line = (short) ctxt->input->line;
+	    if (ctxt->input->line < USHRT_MAX)
+		ret->line = (unsigned short) ctxt->input->line;
 	    else
-	        ret->line = 65535;
+	        ret->line = USHRT_MAX;
 	}
     }
 
@@ -1886,10 +1887,10 @@
 
     if (ctxt->linenumbers) {
 	if (ctxt->input != NULL) {
-	    if (ctxt->input->line < 65535)
-		ret->line = (short) ctxt->input->line;
+	    if (ctxt->input->line < USHRT_MAX)
+		ret->line = (unsigned short) ctxt->input->line;
 	    else {
-	        ret->line = 65535;
+	        ret->line = USHRT_MAX;
 		if (ctxt->options & XML_PARSE_BIG_LINES)
 		    ret->psvi = (void *) (ptrdiff_t) ctxt->input->line;
 	    }
@@ -2266,10 +2267,10 @@
     }
     if (ctxt->linenumbers) {
 	if (ctxt->input != NULL) {
-	    if (ctxt->input->line < 65535)
-		ret->line = (short) ctxt->input->line;
+	    if (ctxt->input->line < USHRT_MAX)
+		ret->line = (unsigned short) ctxt->input->line;
 	    else
-	        ret->line = 65535;
+	        ret->line = USHRT_MAX;
 	}
     }
 
@@ -2688,10 +2689,10 @@
 
     if (ctxt->linenumbers) {
 	if (ctxt->input != NULL) {
-	    if (ctxt->input->line < 65535)
-		ret->line = (short) ctxt->input->line;
+	    if (ctxt->input->line < USHRT_MAX)
+		ret->line = (unsigned short) ctxt->input->line;
 	    else
-	        ret->line = 65535;
+	        ret->line = USHRT_MAX;
 	}
     }
     if (ctxt->inSubset == 1) {
@@ -2748,10 +2749,10 @@
     if (ret == NULL) return;
     if (ctxt->linenumbers) {
 	if (ctxt->input != NULL) {
-	    if (ctxt->input->line < 65535)
-		ret->line = (short) ctxt->input->line;
+	    if (ctxt->input->line < USHRT_MAX)
+		ret->line = (unsigned short) ctxt->input->line;
 	    else
-	        ret->line = 65535;
+	        ret->line = USHRT_MAX;
 	}
     }
 
diff --git a/third_party/libxml/src/aclocal.m4 b/third_party/libxml/src/aclocal.m4
index a671949..d6ebff5 100644
--- a/third_party/libxml/src/aclocal.m4
+++ b/third_party/libxml/src/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.16.3 -*- Autoconf -*-
+# generated automatically by aclocal 1.16.5 -*- Autoconf -*-
 
-# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -296,7 +296,7 @@
 AS_VAR_IF([$1], [""], [$5], [$4])dnl
 ])dnl PKG_CHECK_VAR
 
-# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -311,7 +311,7 @@
 [am__api_version='1.16'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.16.3], [],
+m4_if([$1], [1.16.5], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -327,14 +327,14 @@
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.16.3])dnl
+[AM_AUTOMAKE_VERSION([1.16.5])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -386,7 +386,7 @@
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+# Copyright (C) 1997-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -417,7 +417,7 @@
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -608,7 +608,7 @@
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -676,7 +676,7 @@
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -704,6 +704,10 @@
 # release and drop the old call support.
 AC_DEFUN([AM_INIT_AUTOMAKE],
 [AC_PREREQ([2.65])dnl
+m4_ifdef([_$0_ALREADY_INIT],
+  [m4_fatal([$0 expanded multiple times
+]m4_defn([_$0_ALREADY_INIT]))],
+  [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl
 dnl Autoconf wants to disallow AM_ names.  We explicitly allow
 dnl the ones we care about.
 m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
@@ -740,7 +744,7 @@
 [_AM_SET_OPTIONS([$1])dnl
 dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
 m4_if(
-  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]),
   [ok:ok],,
   [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
  AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
@@ -792,6 +796,20 @@
 		  [m4_define([AC_PROG_OBJCXX],
 			     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
 ])
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+  CTAGS=ctags
+fi
+AC_SUBST([CTAGS])
+if test -z "$ETAGS"; then
+  ETAGS=etags
+fi
+AC_SUBST([ETAGS])
+if test -z "$CSCOPE"; then
+  CSCOPE=cscope
+fi
+AC_SUBST([CSCOPE])
+
 AC_REQUIRE([AM_SILENT_RULES])dnl
 dnl The testsuite driver may need to know about EXEEXT, so add the
 dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
@@ -873,7 +891,7 @@
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -894,7 +912,7 @@
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2020 Free Software Foundation, Inc.
+# Copyright (C) 2003-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -916,7 +934,7 @@
 # Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 # From Jim Meyering
 
-# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -951,7 +969,7 @@
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -994,7 +1012,7 @@
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+# Copyright (C) 1997-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1028,7 +1046,7 @@
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1057,7 +1075,7 @@
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1104,7 +1122,7 @@
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1123,7 +1141,7 @@
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1204,7 +1222,7 @@
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2020 Free Software Foundation, Inc.
+# Copyright (C) 2009-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1264,7 +1282,7 @@
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1292,7 +1310,7 @@
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Copyright (C) 2006-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1311,7 +1329,7 @@
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2020 Free Software Foundation, Inc.
+# Copyright (C) 2004-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
diff --git a/third_party/libxml/src/config.h.cmake.in b/third_party/libxml/src/config.h.cmake.in
index 22b3c92..e093563 100644
--- a/third_party/libxml/src/config.h.cmake.in
+++ b/third_party/libxml/src/config.h.cmake.in
@@ -2,7 +2,7 @@
 /* config.h.in.  Generated from configure.ac by autoheader.  */
 
 /* Define if __attribute__((destructor)) is accepted */
-#cmakedefine ATTRIBUTE_DESTRUCTOR 1
+#cmakedefine ATTRIBUTE_DESTRUCTOR @ATTRIBUTE_DESTRUCTOR@
 
 /* Type cast for the gethostbyname() argument */
 #cmakedefine GETHOSTBYNAME_ARG_CAST @GETHOSTBYNAME_ARG_CAST@
@@ -19,9 +19,6 @@
 /* Define to 1 if you have the <ctype.h> header file. */
 #cmakedefine HAVE_CTYPE_H 1
 
-/* Define to 1 if you have the <dirent.h> header file. */
-#cmakedefine HAVE_DIRENT_H 1
-
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #cmakedefine HAVE_DLFCN_H 1
 
@@ -58,18 +55,9 @@
 /* Define to 1 if you have the `isascii' function. */
 #cmakedefine HAVE_ISASCII 1
 
-/* Define if isinf is there */
-#cmakedefine HAVE_ISINF 1
-
-/* Define if isnan is there */
-#cmakedefine HAVE_ISNAN 1
-
 /* Define if history library is there (-lhistory) */
 #cmakedefine HAVE_LIBHISTORY 1
 
-/* Define if pthread library is there (-lpthread) */
-#cmakedefine HAVE_LIBPTHREAD 1
-
 /* Define if readline library is there (-lreadline) */
 #cmakedefine HAVE_LIBREADLINE 1
 
@@ -79,18 +67,12 @@
 /* Define to 1 if you have the `localtime' function. */
 #cmakedefine HAVE_LOCALTIME 1
 
-/* Define to 1 if you have the <lzma.h> header file. */
-#cmakedefine HAVE_LZMA_H 1
-
 /* Define to 1 if you have the <malloc.h> header file. */
 #cmakedefine HAVE_MALLOC_H 1
 
 /* Define to 1 if you have the <math.h> header file. */
 #cmakedefine HAVE_MATH_H 1
 
-/* Define to 1 if you have the <memory.h> header file. */
-#cmakedefine HAVE_MEMORY_H 1
-
 /* Define to 1 if you have the `mmap' function. */
 #cmakedefine HAVE_MMAP 1
 
@@ -102,9 +84,6 @@
 #  undef /**/ HAVE_MMAP
 #endif
 
-/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
-#cmakedefine HAVE_NDIR_H 1
-
 /* Define to 1 if you have the <netdb.h> header file. */
 #cmakedefine HAVE_NETDB_H 1
 
@@ -135,9 +114,6 @@
 /* Have shl_load based dso */
 #cmakedefine HAVE_SHLLOAD 1
 
-/* Define to 1 if you have the `signal' function. */
-#cmakedefine HAVE_SIGNAL 1
-
 /* Define to 1 if you have the <signal.h> header file. */
 #cmakedefine HAVE_SIGNAL_H 1
 
@@ -174,17 +150,9 @@
 /* Define to 1 if you have the <string.h> header file. */
 #cmakedefine HAVE_STRING_H 1
 
-/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
-   */
-#cmakedefine HAVE_SYS_DIR_H 1
-
 /* Define to 1 if you have the <sys/mman.h> header file. */
 #cmakedefine HAVE_SYS_MMAN_H 1
 
-/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
-   */
-#cmakedefine HAVE_SYS_NDIR_H 1
-
 /* Define to 1 if you have the <sys/select.h> header file. */
 #cmakedefine HAVE_SYS_SELECT_H 1
 
diff --git a/third_party/libxml/src/config.h.in b/third_party/libxml/src/config.h.in
index a55d4e1..ed6ddec 100644
--- a/third_party/libxml/src/config.h.in
+++ b/third_party/libxml/src/config.h.in
@@ -21,7 +21,8 @@
 /* Define to 1 if you have the <ctype.h> header file. */
 #undef HAVE_CTYPE_H
 
-/* Define to 1 if you have the <dirent.h> header file. */
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
 #undef HAVE_DIRENT_H
 
 /* Define to 1 if you have the <dlfcn.h> header file. */
@@ -60,18 +61,9 @@
 /* Define to 1 if you have the `isascii' function. */
 #undef HAVE_ISASCII
 
-/* Define if isinf is there */
-#undef HAVE_ISINF
-
-/* Define if isnan is there */
-#undef HAVE_ISNAN
-
 /* Define if history library is there (-lhistory) */
 #undef HAVE_LIBHISTORY
 
-/* Define if pthread library is there (-lpthread) */
-#undef HAVE_LIBPTHREAD
-
 /* Define if readline library is there (-lreadline) */
 #undef HAVE_LIBREADLINE
 
diff --git a/third_party/libxml/src/configure.ac b/third_party/libxml/src/configure.ac
index 5b161a54..45e1df4 100644
--- a/third_party/libxml/src/configure.ac
+++ b/third_party/libxml/src/configure.ac
@@ -124,13 +124,12 @@
 [  --with-html             add the HTML support (on)])
 dnl Specific dir for HTML output ?
 AC_ARG_WITH(html-dir, AS_HELP_STRING([--with-html-dir=path],
-            [path to base html directory, default $datadir/doc/html]),
-            [HTML_DIR=$withval], [HTML_DIR='$(datadir)/doc'])
+            [path to base html directory, default $docdir/html]),
+            [HTML_DIR=$withval], [HTML_DIR='$(docdir)/html'])
 
 AC_ARG_WITH(html-subdir, AS_HELP_STRING([--with-html-subdir=path],
-            [directory used under html-dir, default $PACKAGE-$VERSION/html]),
-            [test "x$withval" != "x" && HTML_DIR="$HTML_DIR/$withval"],
-            [HTML_DIR="$HTML_DIR/\$(PACKAGE)-\$(VERSION)/html"])
+            [directory used under html-dir, default '']),
+            [test "x$withval" != "x" && HTML_DIR="$HTML_DIR/$withval"])
 AC_SUBST(HTML_DIR)
 AC_ARG_WITH(http,
 [  --with-http             add the HTTP support (on)])
@@ -475,7 +474,6 @@
 AC_CHECK_HEADERS([fcntl.h])
 AC_CHECK_HEADERS([unistd.h])
 AC_CHECK_HEADERS([ctype.h])
-AC_CHECK_HEADERS([dirent.h])
 AC_CHECK_HEADERS([errno.h])
 AC_CHECK_HEADERS([malloc.h])
 AC_CHECK_HEADERS([stdarg.h])
@@ -741,13 +739,6 @@
 
 dnl ******************************End IPv6 checks******************************
 
-dnl Checks for isnan in libm if not in libc
-AC_CHECK_FUNC(isnan, AC_DEFINE([HAVE_ISNAN],[], [Define if isnan is there]) , AC_CHECK_LIB(m, isnan,
-  [AC_DEFINE([HAVE_ISNAN],[], [Define if isnan is there])]))
-
-AC_CHECK_FUNC(isinf, AC_DEFINE([HAVE_ISINF], [], [Define if isinf is there]) , AC_CHECK_LIB(m, isinf,
-  [AC_DEFINE([HAVE_ISINF], [], [Define if isinf is there])]))
-
 XML_LIBDIR='-L${libdir}'
 XML_INCLUDEDIR='-I${includedir}/libxml2'
 
@@ -1063,7 +1054,6 @@
             AC_CHECK_HEADER(pthread.h,
                 AC_CHECK_LIB(pthread, pthread_join,[
                 THREAD_LIBS="-lpthread"
-                AC_DEFINE([HAVE_LIBPTHREAD], [], [Define if pthread library is there (-lpthread)])
                 AC_DEFINE([HAVE_PTHREAD_H], [], [Define if <pthread.h> is there])
                 WITH_THREADS="1"]))
         fi
@@ -1701,8 +1691,6 @@
 AC_SUBST(ICU_LIBS)
 AC_SUBST(XML_INCLUDEDIR)
 AC_SUBST(HTML_DIR)
-AC_SUBST(HAVE_ISNAN)
-AC_SUBST(HAVE_ISINF)
 AC_SUBST(PYTHON)
 AC_SUBST(PYTHON_VERSION)
 AC_SUBST(PYTHON_INCLUDES)
diff --git a/third_party/libxml/src/encoding.c b/third_party/libxml/src/encoding.c
index 5e50c15..3741c94 100644
--- a/third_party/libxml/src/encoding.c
+++ b/third_party/libxml/src/encoding.c
@@ -527,7 +527,7 @@
 	    in++;
 	}
         if ((c & 0xFC00) == 0xD800) {    /* surrogates */
-	    if (in >= inend) {           /* (in > inend) shouldn't happens */
+	    if (in >= inend) {           /* handle split mutli-byte characters */
 		break;
 	    }
 	    if (xmlLittleEndian) {
@@ -744,38 +744,39 @@
 {
     unsigned char* outstart = out;
     const unsigned char* processed = inb;
-    unsigned char* outend = out + *outlen;
+    unsigned char* outend;
     unsigned short* in = (unsigned short*) inb;
     unsigned short* inend;
     unsigned int c, d, inlen;
     unsigned char *tmp;
     int bits;
 
+    if (*outlen == 0) {
+        *inlenb = 0;
+        return(0);
+    }
+    outend = out + *outlen;
     if ((*inlenb % 2) == 1)
         (*inlenb)--;
     inlen = *inlenb / 2;
     inend= in + inlen;
-    while (in < inend) {
+    while ((in < inend) && (out - outstart + 5 < *outlen)) {
 	if (xmlLittleEndian) {
 	    tmp = (unsigned char *) in;
 	    c = *tmp++;
-	    c = c << 8;
-	    c = c | (unsigned int) *tmp;
+	    c = (c << 8) | (unsigned int) *tmp;
 	    in++;
 	} else {
 	    c= *in++;
 	}
         if ((c & 0xFC00) == 0xD800) {    /* surrogates */
-	    if (in >= inend) {           /* (in > inend) shouldn't happens */
-		*outlen = out - outstart;
-		*inlenb = processed - inb;
-	        return(-2);
+	    if (in >= inend) {           /* handle split mutli-byte characters */
+                break;
 	    }
 	    if (xmlLittleEndian) {
 		tmp = (unsigned char *) in;
 		d = *tmp++;
-		d = d << 8;
-		d = d | (unsigned int) *tmp;
+		d = (d << 8) | (unsigned int) *tmp;
 		in++;
 	    } else {
 		d= *in++;
@@ -1822,7 +1823,7 @@
     size_t icv_inlen, icv_outlen;
     const char *icv_in = (const char *) in;
     char *icv_out = (char *) out;
-    int ret;
+    size_t ret;
 
     if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) {
         if (outlen != NULL) *outlen = 0;
@@ -1833,7 +1834,7 @@
     ret = iconv(cd, (ICONV_CONST char **) &icv_in, &icv_inlen, &icv_out, &icv_outlen);
     *inlen -= icv_inlen;
     *outlen -= icv_outlen;
-    if ((icv_inlen != 0) || (ret == -1)) {
+    if ((icv_inlen != 0) || (ret == (size_t) -1)) {
 #ifdef EILSEQ
         if (errno == EILSEQ) {
             return -2;
@@ -2495,7 +2496,7 @@
      */
     toconv = xmlBufUse(in);
     if (toconv == 0)
-        return (0);
+        return (writtentot);
     if (toconv > 64 * 1024)
         toconv = 64 * 1024;
     if (toconv * 4 >= written) {
diff --git a/third_party/libxml/src/fuzz/Makefile.in b/third_party/libxml/src/fuzz/Makefile.in
index 47f1edb3..8e724f7 100644
--- a/third_party/libxml/src/fuzz/Makefile.in
+++ b/third_party/libxml/src/fuzz/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -250,8 +250,6 @@
   unique=`for i in $$list; do \
     if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
   done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
 am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp README
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -270,6 +268,8 @@
 CFLAGS = @CFLAGS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
 CYGPATH_W = @CYGPATH_W@
 CYGWIN_EXTRA_LDFLAGS = @CYGWIN_EXTRA_LDFLAGS@
 CYGWIN_EXTRA_PYTHON_LIBADD = @CYGWIN_EXTRA_PYTHON_LIBADD@
@@ -284,13 +284,12 @@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
+ETAGS = @ETAGS@
 EXEEXT = @EXEEXT@
 EXTRA_CFLAGS = @EXTRA_CFLAGS@
 FGREP = @FGREP@
 FTP_OBJ = @FTP_OBJ@
 GREP = @GREP@
-HAVE_ISINF = @HAVE_ISINF@
-HAVE_ISNAN = @HAVE_ISNAN@
 HTML_DIR = @HTML_DIR@
 HTML_OBJ = @HTML_OBJ@
 HTTP_OBJ = @HTTP_OBJ@
@@ -705,7 +704,6 @@
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
 distdir: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) distdir-am
 
diff --git a/third_party/libxml/src/hash.c b/third_party/libxml/src/hash.c
index afa094e..7b82d2f 100644
--- a/third_party/libxml/src/hash.c
+++ b/third_party/libxml/src/hash.c
@@ -86,7 +86,7 @@
 xmlHashComputeKey(xmlHashTablePtr table, const xmlChar *name,
 	          const xmlChar *name2, const xmlChar *name3) {
     unsigned long value = 0L;
-    char ch;
+    unsigned long ch;
 
 #ifdef HASH_RANDOMIZATION
     value = table->random_seed;
@@ -94,19 +94,19 @@
     if (name != NULL) {
 	value += 30 * (*name);
 	while ((ch = *name++) != 0) {
-	    value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch);
+	    value = value ^ ((value << 5) + (value >> 3) + ch);
 	}
     }
     value = value ^ ((value << 5) + (value >> 3));
     if (name2 != NULL) {
 	while ((ch = *name2++) != 0) {
-	    value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch);
+	    value = value ^ ((value << 5) + (value >> 3) + ch);
 	}
     }
     value = value ^ ((value << 5) + (value >> 3));
     if (name3 != NULL) {
 	while ((ch = *name3++) != 0) {
-	    value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch);
+	    value = value ^ ((value << 5) + (value >> 3) + ch);
 	}
     }
     return (value % table->size);
@@ -121,7 +121,7 @@
 		   const xmlChar *prefix2, const xmlChar *name2,
 		   const xmlChar *prefix3, const xmlChar *name3) {
     unsigned long value = 0L;
-    char ch;
+    unsigned long ch;
 
 #ifdef HASH_RANDOMIZATION
     value = table->random_seed;
@@ -133,37 +133,37 @@
 
     if (prefix != NULL) {
 	while ((ch = *prefix++) != 0) {
-	    value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch);
+	    value = value ^ ((value << 5) + (value >> 3) + ch);
 	}
 	value = value ^ ((value << 5) + (value >> 3) + (unsigned long)':');
     }
     if (name != NULL) {
 	while ((ch = *name++) != 0) {
-	    value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch);
+	    value = value ^ ((value << 5) + (value >> 3) + ch);
 	}
     }
     value = value ^ ((value << 5) + (value >> 3));
     if (prefix2 != NULL) {
 	while ((ch = *prefix2++) != 0) {
-	    value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch);
+	    value = value ^ ((value << 5) + (value >> 3) + ch);
 	}
 	value = value ^ ((value << 5) + (value >> 3) + (unsigned long)':');
     }
     if (name2 != NULL) {
 	while ((ch = *name2++) != 0) {
-	    value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch);
+	    value = value ^ ((value << 5) + (value >> 3) + ch);
 	}
     }
     value = value ^ ((value << 5) + (value >> 3));
     if (prefix3 != NULL) {
 	while ((ch = *prefix3++) != 0) {
-	    value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch);
+	    value = value ^ ((value << 5) + (value >> 3) + ch);
 	}
 	value = value ^ ((value << 5) + (value >> 3) + (unsigned long)':');
     }
     if (name3 != NULL) {
 	while ((ch = *name3++) != 0) {
-	    value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch);
+	    value = value ^ ((value << 5) + (value >> 3) + ch);
 	}
     }
     return (value % table->size);
diff --git a/third_party/libxml/src/libxml2.spec b/third_party/libxml/src/libxml2.spec
index b3eca4f..8a8165b 100644
--- a/third_party/libxml/src/libxml2.spec
+++ b/third_party/libxml/src/libxml2.spec
@@ -204,6 +204,6 @@
 %endif # with_python3
 
 %changelog
-* Tue Aug  3 2021 Daniel Veillard <veillard@redhat.com>
+* Mon Jan 31 2022 Daniel Veillard <veillard@redhat.com>
 - upstream release 2.9.12 see http://xmlsoft.org/news.html
 
diff --git a/third_party/libxml/src/macos/src/config-mac.h b/third_party/libxml/src/macos/src/config-mac.h
index ca6f9939..c82d2b9a 100644
--- a/third_party/libxml/src/macos/src/config-mac.h
+++ b/third_party/libxml/src/macos/src/config-mac.h
@@ -9,15 +9,11 @@
 #define PACKAGE
 #define VERSION
 
-#undef HAVE_LIBZ
 #undef HAVE_LIBM
-#undef HAVE_ISINF
-#undef HAVE_ISNAN
 #undef HAVE_LIBHISTORY
 #undef HAVE_LIBREADLINE
 
 #define XML_SOCKLEN_T socklen_t
-#define HAVE_LIBPTHREAD
 #define HAVE_PTHREAD_H
 #define LIBXML_THREAD_ENABLED
 
@@ -30,9 +26,6 @@
 /* Define if you have the printf function.  */
 #define HAVE_PRINTF
 
-/* Define if you have the signal function.  */
-#define HAVE_SIGNAL
-
 /* Define if you have the snprintf function.  */
 #define HAVE_SNPRINTF
 
@@ -63,9 +56,6 @@
 /* Define if you have the <ctype.h> header file.  */
 #define HAVE_CTYPE_H
 
-/* Define if you have the <dirent.h> header file.  */
-#define HAVE_DIRENT_H
-
 /* Define if you have the <dlfcn.h> header file.  */
 #define HAVE_DLFCN_H
 
@@ -84,9 +74,6 @@
 /* Define if you have the <math.h> header file.  */
 #define HAVE_MATH_H
 
-/* Define if you have the <ndir.h> header file.  */
-#define HAVE_NDIR_H
-
 /* Define if you have the <netdb.h> header file.  */
 #define HAVE_NETDB_H
 
@@ -105,15 +92,9 @@
 /* Define if you have the <string.h> header file.  */
 #define HAVE_STRING_H
 
-/* Define if you have the <sys/dir.h> header file.  */
-#define HAVE_SYS_DIR_H
-
 /* Define if you have the <sys/mman.h> header file.  */
 #undef HAVE_SYS_MMAN_H
 
-/* Define if you have the <sys/ndir.h> header file.  */
-#undef HAVE_SYS_NDIR_H
-
 /* Define if you have the <sys/select.h> header file.  */
 #define HAVE_SYS_SELECT_H
 
diff --git a/third_party/libxml/src/parser.c b/third_party/libxml/src/parser.c
index d5b72e4f..304f3be 100644
--- a/third_party/libxml/src/parser.c
+++ b/third_party/libxml/src/parser.c
@@ -2201,7 +2201,8 @@
      * It's Okay to use CUR/NEXT here since all the blanks are on
      * the ASCII range.
      */
-    if (ctxt->instate != XML_PARSER_DTD) {
+    if (((ctxt->inputNr == 1) && (ctxt->instate != XML_PARSER_DTD)) ||
+        (ctxt->instate == XML_PARSER_START)) {
 	const xmlChar *cur;
 	/*
 	 * if we are in the document content, go really fast
@@ -4594,6 +4595,9 @@
 	    }
 	}
 	COPY_BUF(l,buf,nbchar,cur);
+	/* move current position before possible calling of ctxt->sax->characters */
+	NEXTL(l);
+	cur = CUR_CHAR(l);
 	if (nbchar >= XML_PARSER_BIG_BUFFER_SIZE) {
 	    buf[nbchar] = 0;
 
@@ -4627,8 +4631,6 @@
             if (ctxt->instate == XML_PARSER_EOF)
 		return;
 	}
-	NEXTL(l);
-	cur = CUR_CHAR(l);
     }
     if (nbchar != 0) {
         buf[nbchar] = 0;
@@ -12643,6 +12645,7 @@
 	    xmlFree(ctxt->sax);
 	ctxt->sax = (xmlSAXHandlerPtr) xmlMalloc(sizeof(xmlSAXHandler));
 	if (ctxt->sax == NULL) {
+	    xmlFreeParserInputBuffer(buf);
 	    xmlErrMemory(ctxt, NULL);
 	    xmlFreeParserCtxt(ctxt);
 	    return(NULL);
diff --git a/third_party/libxml/src/parserInternals.c b/third_party/libxml/src/parserInternals.c
index a731c16..08c6faf 100644
--- a/third_party/libxml/src/parserInternals.c
+++ b/third_party/libxml/src/parserInternals.c
@@ -1551,8 +1551,10 @@
     }
 
     inputStream = xmlNewInputStream(ctxt);
-    if (inputStream == NULL)
+    if (inputStream == NULL) {
+	xmlFreeParserInputBuffer(buf);
 	return(NULL);
+    }
 
     inputStream->buf = buf;
     inputStream = xmlCheckHTTPInput(ctxt, inputStream);
diff --git a/third_party/libxml/src/runtest.c b/third_party/libxml/src/runtest.c
index 0f178cb..62b362d 100644
--- a/third_party/libxml/src/runtest.c
+++ b/third_party/libxml/src/runtest.c
@@ -1231,7 +1231,7 @@
     if (quiet)
 	return;
     for (i = 0;(i<len) && (i < 30);i++)
-	output[i] = ch[i];
+	output[i] = (char) ch[i];
     output[i] = 0;
 
     fprintf(SAXdebug, "SAX.characters(%s, %d)\n", output, len);
@@ -1273,7 +1273,7 @@
     if (quiet)
 	return;
     for (i = 0;(i<len) && (i < 30);i++)
-	output[i] = ch[i];
+	output[i] = (char) ch[i];
     output[i] = 0;
     fprintf(SAXdebug, "SAX.ignorableWhitespace(%s, %d)\n", output, len);
 }
@@ -2132,6 +2132,75 @@
     return(0);
 }
 
+/**
+ * fdParseTest:
+ * @filename: the file to parse
+ * @result: the file with expected result
+ * @err: the file with error messages
+ *
+ * Parse a file using the xmlReadFd API and check for errors.
+ *
+ * Returns 0 in case of success, an error code otherwise
+ */
+static int
+fdParseTest(const char *filename, const char *result, const char *err,
+             int options) {
+    xmlDocPtr doc;
+    const char *base = NULL;
+    int size, res = 0;
+
+    nb_tests++;
+    int fd = open(filename, RD_FLAGS);
+#ifdef LIBXML_HTML_ENABLED
+    if (options & XML_PARSE_HTML) {
+        doc = htmlReadFd(fd, filename, NULL, options);
+    } else
+#endif
+    {
+	xmlGetWarningsDefaultValue = 1;
+	doc = xmlReadFd(fd, filename, NULL, options);
+    }
+    close(fd);
+    xmlGetWarningsDefaultValue = 0;
+    if (result) {
+	if (doc == NULL) {
+	    base = "";
+	    size = 0;
+	} else {
+#ifdef LIBXML_HTML_ENABLED
+	    if (options & XML_PARSE_HTML) {
+		htmlDocDumpMemory(doc, (xmlChar **) &base, &size);
+	    } else
+#endif
+	    xmlDocDumpMemory(doc, (xmlChar **) &base, &size);
+	}
+	res = compareFileMem(result, base, size);
+    }
+    if (doc != NULL) {
+	if (base != NULL)
+	    xmlFree((char *)base);
+	xmlFreeDoc(doc);
+    }
+    if (res != 0) {
+        fprintf(stderr, "Result for %s failed in %s\n", filename, result);
+        return(-1);
+    }
+    if (err != NULL) {
+	res = compareFileMem(err, testErrors, testErrorsSize);
+	if (res != 0) {
+	    fprintf(stderr, "Error for %s failed\n", filename);
+	    return(-1);
+	}
+    } else if (options & XML_PARSE_DTDVALID) {
+        if (testErrorsSize != 0)
+	    fprintf(stderr, "Validation for %s failed\n", filename);
+    }
+
+    return(0);
+}
+
+
+
 #ifdef LIBXML_READER_ENABLED
 /************************************************************************
  *									*
@@ -4249,6 +4318,9 @@
     { "Error cases regression tests",
       errParseTest, "./test/errors/*.xml", "result/errors/", "", ".err",
       0 },
+    { "Error cases regression tests from file descriptor",
+      fdParseTest, "./test/errors/*.xml", "result/errors/", "", ".err",
+      0 },
     { "Error cases regression tests with entity substitution",
       errParseTest, "./test/errors/*.xml", "result/errors/", NULL, ".ent",
       XML_PARSE_NOENT },
@@ -4292,6 +4364,9 @@
     { "HTML regression tests" ,
       errParseTest, "./test/HTML/*", "result/HTML/", "", ".err",
       XML_PARSE_HTML },
+    { "HTML regression tests from file descriptor",
+      fdParseTest, "./test/HTML/*", "result/HTML/", "", ".err",
+      XML_PARSE_HTML },
 #ifdef LIBXML_PUSH_ENABLED
     { "Push HTML regression tests" ,
       pushParseTest, "./test/HTML/*", "result/HTML/", "", ".err",
diff --git a/third_party/libxml/src/testchar.c b/third_party/libxml/src/testchar.c
index 6866a17..51e4acf 100644
--- a/third_party/libxml/src/testchar.c
+++ b/third_party/libxml/src/testchar.c
@@ -32,7 +32,7 @@
 	lastError = 0;
 	xmlCtxtReset(ctxt);
 
-        data[0] = i;
+        data[0] = (char) i;
 
 	res = xmlReadMemory(document, len, "test", NULL, 0);
 
@@ -73,8 +73,8 @@
 	lastError = 0;
 	xmlCtxtReset(ctxt);
 
-        data[0] = i;
-        data[1] = j;
+        data[0] = (char) i;
+        data[1] = (char) j;
 
 	res = xmlReadMemory(document, len, "test", NULL, 0);
 
@@ -248,7 +248,7 @@
     data[2] = 0;
     data[3] = 0;
     for (i = 0;i <= 0xFF;i++) {
-        data[0] = i;
+        data[0] = (char) i;
 	ctxt->charset = XML_CHAR_ENCODING_UTF8;
 
 	lastError = 0;
@@ -275,8 +275,8 @@
     data[3] = 0;
     for (i = 0x80;i <= 0xFF;i++) {
 	for (j = 0;j <= 0xFF;j++) {
-	    data[0] = i;
-	    data[1] = j;
+	    data[0] = (char) i;
+	    data[1] = (char) j;
 	    ctxt->charset = XML_CHAR_ENCODING_UTF8;
 
 	    lastError = 0;
@@ -353,8 +353,8 @@
     for (i = 0xE0;i <= 0xFF;i++) {
     for (j = 0;j <= 0xFF;j++) {
     for (k = 0;k < 6;k++) {
-	data[0] = i;
-	data[1] = j;
+	data[0] = (char) i;
+	data[1] = (char) j;
 	K = lows[k];
 	data[2] = (char) K;
 	value = (K & 0x3F) + ((j & 0x3F) << 6) + ((i & 0xF) << 12);
@@ -440,8 +440,8 @@
     for (j = 0;j <= 0xFF;j++) {
     for (k = 0;k < 6;k++) {
     for (l = 0;l < 6;l++) {
-	data[0] = i;
-	data[1] = j;
+	data[0] = (char) i;
+	data[1] = (char) j;
 	K = lows[k];
 	data[2] = (char) K;
 	L = lows[l];
diff --git a/third_party/libxml/src/tree.c b/third_party/libxml/src/tree.c
index c707f598..50b6763 100644
--- a/third_party/libxml/src/tree.c
+++ b/third_party/libxml/src/tree.c
@@ -1596,6 +1596,10 @@
 			 */
 			if (!xmlBufIsEmpty(buf)) {
 			    node = xmlNewDocText(doc, NULL);
+			    if (node == NULL) {
+				if (val != NULL) xmlFree(val);
+				goto out;
+			    }
 			    node->content = xmlBufDetach(buf);
 
 			    if (last == NULL) {
diff --git a/third_party/libxml/src/uri.c b/third_party/libxml/src/uri.c
index 8204825..ccc26aa5 100644
--- a/third_party/libxml/src/uri.c
+++ b/third_party/libxml/src/uri.c
@@ -1638,23 +1638,24 @@
     out = ret;
     while(len > 0) {
 	if ((len > 2) && (*in == '%') && (is_hex(in[1])) && (is_hex(in[2]))) {
+            int c = 0;
 	    in++;
 	    if ((*in >= '0') && (*in <= '9'))
-	        *out = (*in - '0');
+	        c = (*in - '0');
 	    else if ((*in >= 'a') && (*in <= 'f'))
-	        *out = (*in - 'a') + 10;
+	        c = (*in - 'a') + 10;
 	    else if ((*in >= 'A') && (*in <= 'F'))
-	        *out = (*in - 'A') + 10;
+	        c = (*in - 'A') + 10;
 	    in++;
 	    if ((*in >= '0') && (*in <= '9'))
-	        *out = *out * 16 + (*in - '0');
+	        c = c * 16 + (*in - '0');
 	    else if ((*in >= 'a') && (*in <= 'f'))
-	        *out = *out * 16 + (*in - 'a') + 10;
+	        c = c * 16 + (*in - 'a') + 10;
 	    else if ((*in >= 'A') && (*in <= 'F'))
-	        *out = *out * 16 + (*in - 'A') + 10;
+	        c = c * 16 + (*in - 'A') + 10;
 	    in++;
 	    len -= 3;
-	    out++;
+	    *out++ = (char) c;
 	} else {
 	    *out++ = *in++;
 	    len--;
diff --git a/third_party/libxml/src/win32/configure.js b/third_party/libxml/src/win32/configure.js
index cec64c53..8f03b464 100644
--- a/third_party/libxml/src/win32/configure.js
+++ b/third_party/libxml/src/win32/configure.js
@@ -408,6 +408,14 @@
 			of.WriteLine(s.replace(/\@prefix\@/, buildPrefix));
 		} else if (s.search(/\@WITH_THREADS\@/) != -1) {
 			of.WriteLine(s.replace(/\@WITH_THREADS\@/, withThreads == "no"? "0" : "1"));
+		} else if (s.search(/\@WITH_ZLIB\@/) != -1) {
+			of.WriteLine(s.replace(/\@WITH_ZLIB\@/, withZlib? "1" : "0"));
+		} else if (s.search(/\@WITH_LZMA\@/) != -1) {
+			of.WriteLine(s.replace(/\@WITH_LZMA\@/, withLzma? "1" : "0"));
+		} else if (s.search(/\@WITH_ICONV\@/) != -1) {
+            of.WriteLine(s.replace(/\@WITH_ICONV\@/, withIconv? "1" : "0"));
+		} else if (s.search(/\@WITH_ICU\@/) != -1) {
+			of.WriteLine(s.replace(/\@WITH_ICU\@/, withIcu? "1" : "0"));
 		} else
 			of.WriteLine(ln);
 	}
diff --git a/third_party/libxml/src/xmlIO.c b/third_party/libxml/src/xmlIO.c
index f20c0fa0..007144c 100644
--- a/third_party/libxml/src/xmlIO.c
+++ b/third_party/libxml/src/xmlIO.c
@@ -2735,6 +2735,8 @@
 		    ret->writecallback = xmlGzfileWrite;
 		    ret->closecallback = xmlGzfileClose;
 		}
+		else
+		    xmlGzfileClose(context);
 		return(ret);
 	    }
 	}
diff --git a/third_party/libxml/src/xmlmemory.c b/third_party/libxml/src/xmlmemory.c
index c51f49a..e0b2531 100644
--- a/third_party/libxml/src/xmlmemory.c
+++ b/third_party/libxml/src/xmlmemory.c
@@ -78,7 +78,7 @@
  * Each of the blocks allocated begin with a header containing information
  */
 
-#define MEMTAG 0x5aa5
+#define MEMTAG 0x5aa5U
 
 #define MALLOC_TYPE 1
 #define REALLOC_TYPE 2
diff --git a/third_party/libxml/src/xmlstring.c b/third_party/libxml/src/xmlstring.c
index 62d3053..5a6875f5 100644
--- a/third_party/libxml/src/xmlstring.c
+++ b/third_party/libxml/src/xmlstring.c
@@ -18,6 +18,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <limits.h>
 #include <libxml/xmlmemory.h>
 #include <libxml/parserInternals.h>
 #include <libxml/xmlstring.h>
@@ -42,7 +43,7 @@
     xmlChar *ret;
 
     if ((cur == NULL) || (len < 0)) return(NULL);
-    ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar));
+    ret = (xmlChar *) xmlMallocAtomic(((size_t) len + 1) * sizeof(xmlChar));
     if (ret == NULL) {
         xmlErrMemory(NULL, NULL);
         return(NULL);
@@ -87,7 +88,7 @@
     xmlChar *ret;
 
     if ((cur == NULL) || (len < 0)) return(NULL);
-    ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar));
+    ret = (xmlChar *) xmlMallocAtomic(((size_t) len + 1) * sizeof(xmlChar));
     if (ret == NULL) {
         xmlErrMemory(NULL, NULL);
         return(NULL);
@@ -423,14 +424,14 @@
 
 int
 xmlStrlen(const xmlChar *str) {
-    int len = 0;
+    size_t len = 0;
 
     if (str == NULL) return(0);
     while (*str != 0) { /* non input consuming */
         str++;
         len++;
     }
-    return(len);
+    return(len > INT_MAX ? 0 : len);
 }
 
 /**
@@ -460,9 +461,9 @@
         return(xmlStrndup(add, len));
 
     size = xmlStrlen(cur);
-    if (size < 0)
+    if ((size < 0) || (size > INT_MAX - len))
         return(NULL);
-    ret = (xmlChar *) xmlRealloc(cur, (size + len + 1) * sizeof(xmlChar));
+    ret = (xmlChar *) xmlRealloc(cur, ((size_t) size + len + 1) * sizeof(xmlChar));
     if (ret == NULL) {
         xmlErrMemory(NULL, NULL);
         return(cur);
@@ -500,9 +501,9 @@
         return(xmlStrndup(str2, len));
 
     size = xmlStrlen(str1);
-    if (size < 0)
+    if ((size < 0) || (size > INT_MAX - len))
         return(NULL);
-    ret = (xmlChar *) xmlMalloc((size + len + 1) * sizeof(xmlChar));
+    ret = (xmlChar *) xmlMalloc(((size_t) size + len + 1) * sizeof(xmlChar));
     if (ret == NULL) {
         xmlErrMemory(NULL, NULL);
         return(xmlStrndup(str1, size));
@@ -667,7 +668,7 @@
  */
 int
 xmlUTF8Strlen(const xmlChar *utf) {
-    int ret = 0;
+    size_t ret = 0;
 
     if (utf == NULL)
         return(-1);
@@ -694,7 +695,7 @@
         }
         ret++;
     }
-    return(ret);
+    return(ret > INT_MAX ? 0 : ret);
 }
 
 /**
@@ -796,26 +797,28 @@
      *    1110xxxx 10xxxxxx 10xxxxxx                    valid 3-byte
      *    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx           valid 4-byte
      */
-    for (ix = 0; (c = utf[ix]);) {      /* string is 0-terminated */
+    while ((c = utf[0])) {      /* string is 0-terminated */
+        ix = 0;
         if ((c & 0x80) == 0x00) {	/* 1-byte code, starts with 10 */
-            ix++;
+            ix = 1;
 	} else if ((c & 0xe0) == 0xc0) {/* 2-byte code, starts with 110 */
-	    if ((utf[ix+1] & 0xc0 ) != 0x80)
+	    if ((utf[1] & 0xc0 ) != 0x80)
 	        return 0;
-	    ix += 2;
+	    ix = 2;
 	} else if ((c & 0xf0) == 0xe0) {/* 3-byte code, starts with 1110 */
-	    if (((utf[ix+1] & 0xc0) != 0x80) ||
-	        ((utf[ix+2] & 0xc0) != 0x80))
+	    if (((utf[1] & 0xc0) != 0x80) ||
+	        ((utf[2] & 0xc0) != 0x80))
 		    return 0;
-	    ix += 3;
+	    ix = 3;
 	} else if ((c & 0xf8) == 0xf0) {/* 4-byte code, starts with 11110 */
-	    if (((utf[ix+1] & 0xc0) != 0x80) ||
-	        ((utf[ix+2] & 0xc0) != 0x80) ||
-		((utf[ix+3] & 0xc0) != 0x80))
+	    if (((utf[1] & 0xc0) != 0x80) ||
+	        ((utf[2] & 0xc0) != 0x80) ||
+		((utf[3] & 0xc0) != 0x80))
 		    return 0;
-	    ix += 4;
+	    ix = 4;
 	} else				/* unknown encoding */
 	    return 0;
+        utf += ix;
       }
       return(1);
 }
@@ -834,8 +837,9 @@
 
 int
 xmlUTF8Strsize(const xmlChar *utf, int len) {
-    const xmlChar   *ptr=utf;
-    xmlChar         ch;
+    const xmlChar *ptr=utf;
+    int ch;
+    size_t ret;
 
     if (utf == NULL)
         return(0);
@@ -846,20 +850,17 @@
     while ( len-- > 0) {
         if ( !*ptr )
             break;
-        if ( (ch = *ptr++) & 0x80) {
-            // Workaround for an optimization bug in VS 2015 Update 2, remove
-            // once the fix is released. crbug.com/599427
-            // https://connect.microsoft.com/VisualStudio/feedback/details/2582138
-            xmlChar ch2 = ch;
-            while ((ch2<<=1) & 0x80 ) {
+        if ( (ch = *ptr++) & 0x80)
+            while ((ch<<=1) & 0x80 ) {
+		if (*ptr == 0) break;
                 ptr++;
-                if (*ptr == 0) break;
-            }
-        }
+	    }
     }
-    return (ptr - utf);
+    ret = ptr - utf;
+    return (ret > INT_MAX ? 0 : ret);
 }
 
+
 /**
  * xmlUTF8Strndup:
  * @utf:  the input UTF8 *
@@ -876,11 +877,8 @@
 
     if ((utf == NULL) || (len < 0)) return(NULL);
     i = xmlUTF8Strsize(utf, len);
-    ret = (xmlChar *) xmlMallocAtomic((i + 1) * sizeof(xmlChar));
+    ret = (xmlChar *) xmlMallocAtomic(((size_t) i + 1) * sizeof(xmlChar));
     if (ret == NULL) {
-        xmlGenericError(xmlGenericErrorContext,
-                "malloc of %ld byte failed\n",
-                (len + 1) * (long)sizeof(xmlChar));
         return(NULL);
     }
     memcpy(ret, utf, i * sizeof(xmlChar));
@@ -900,7 +898,7 @@
  */
 const xmlChar *
 xmlUTF8Strpos(const xmlChar *utf, int pos) {
-    xmlChar ch;
+    int ch;
 
     if (utf == NULL) return(NULL);
     if (pos < 0)
@@ -932,14 +930,15 @@
  */
 int
 xmlUTF8Strloc(const xmlChar *utf, const xmlChar *utfchar) {
-    int i, size;
-    xmlChar ch;
+    size_t i;
+    int size;
+    int ch;
 
     if (utf==NULL || utfchar==NULL) return -1;
     size = xmlUTF8Strsize(utfchar, 1);
         for(i=0; (ch=*utf) != 0; i++) {
             if (xmlStrncmp(utf, utfchar, size)==0)
-                return(i);
+                return(i > INT_MAX ? 0 : i);
             utf++;
             if ( ch & 0x80 ) {
                 /* if not simple ascii, verify proper format */
@@ -969,8 +968,8 @@
 
 xmlChar *
 xmlUTF8Strsub(const xmlChar *utf, int start, int len) {
-    int            i;
-    xmlChar ch;
+    int i;
+    int ch;
 
     if (utf == NULL) return(NULL);
     if (start < 0) return(NULL);
@@ -1026,6 +1025,8 @@
     if (count == 0)
         return(*msg);
 
+    if ((count > INT_MAX) || (msgLen > INT_MAX - count))
+        return(NULL);
     resultLen = msgLen + count + 1;
     result = (xmlChar *) xmlMallocAtomic(resultLen * sizeof(xmlChar));
     if (result == NULL) {
diff --git a/third_party/libxml/src/xpath.c b/third_party/libxml/src/xpath.c
index d9e9408..6735395 100644
--- a/third_party/libxml/src/xpath.c
+++ b/third_party/libxml/src/xpath.c
@@ -11120,7 +11120,9 @@
 	    name = NULL;
 	    if (CUR != ')') {
 		name = xmlXPathParseLiteral(ctxt);
-		CHECK_ERROR NULL;
+                if (name == NULL) {
+	            XP_ERRORNULL(XPATH_EXPR_ERROR);
+                }
 		*test = NODE_TEST_PI;
 		SKIP_BLANKS;
 	    }
diff --git a/tools/binary_size/libsupersize/apkanalyzer.py b/tools/binary_size/libsupersize/apkanalyzer.py
index 2285241..28f1b90 100644
--- a/tools/binary_size/libsupersize/apkanalyzer.py
+++ b/tools/binary_size/libsupersize/apkanalyzer.py
@@ -61,16 +61,6 @@
   return data
 
 
-def _ExpectedDexTotalSize(apk_path):
-  dex_total = 0
-  with zipfile.ZipFile(apk_path) as z:
-    for zip_info in z.infolist():
-      if not zip_info.filename.endswith('.dex'):
-        continue
-      dex_total += zip_info.file_size
-  return dex_total
-
-
 # VisibleForTesting
 def UndoHierarchicalSizing(data):
   """Subtracts child node sizes from parent nodes.
@@ -280,22 +270,20 @@
                        source_path=source_path)
 
 
-def CreateDexSymbols(apk_path, mapping_path, size_info_prefix):
+def CreateDexSymbols(apk_path, mapping_path, size_info_prefix, dex_total_size):
   source_map = _ParseJarInfoFile(size_info_prefix + '.jar.info')
 
   nodes = _RunApkAnalyzer(apk_path, mapping_path)
   nodes = UndoHierarchicalSizing(nodes)
 
-  dex_expected_size = _ExpectedDexTotalSize(apk_path)
   total_node_size = sum([x[2] for x in nodes])
   # TODO(agrieve): Figure out why this log is triggering for
   #     ChromeModernPublic.apk (https://crbug.com/851535).
-  # Reporting: dex_expected_size=6546088 total_node_size=6559549
-  if dex_expected_size < total_node_size:
+  # Reporting: dex_total_size=6546088 total_node_size=6559549
+  if dex_total_size < total_node_size:
     logging.error(
-      'Node size too large, check for node processing errors. '
-      'dex_expected_size=%d total_node_size=%d', dex_expected_size,
-      total_node_size)
+        'Node size too large, check for node processing errors. '
+        'dex_total_size=%d total_node_size=%d', dex_total_size, total_node_size)
   # Use (DEX_METHODS, DEX) buckets to speed up sorting.
   symbols = ([], [])
   lambda_normalizer = LambdaNormalizer()
diff --git a/tools/binary_size/libsupersize/archive.py b/tools/binary_size/libsupersize/archive.py
index fb19276a..f8095e6e 100644
--- a/tools/binary_size/libsupersize/archive.py
+++ b/tools/binary_size/libsupersize/archive.py
@@ -6,7 +6,6 @@
 import argparse
 import collections
 import dataclasses
-import functools
 import logging
 import os
 import posixpath
@@ -227,41 +226,38 @@
   return sorted(ret, key=lambda x: (x != 'base', x))
 
 
-def CreateMetadata(*, build_config, apk_spec, native_spec, source_directory,
-                   output_directory):
-  """Creates metadata dict while updating |build_config|.
+def CreateBuildConfig(output_directory, source_directory):
+  """Creates the dict to use for SizeInfo.build_info."""
+  logging.debug('Constructing build_config')
+  build_config = {}
+  if output_directory:
+    gn_args = _ParseGnArgs(os.path.join(output_directory, 'args.gn'))
+    build_config[models.BUILD_CONFIG_GN_ARGS] = gn_args
+
+  git_rev = _DetectGitRevision(source_directory)
+  if git_rev:
+    build_config[models.BUILD_CONFIG_GIT_REVISION] = git_rev
+
+  return build_config
+
+
+def CreateMetadata(*, apk_spec, native_spec, output_directory):
+  """Creates metadata dict.
 
   Returns:
     A dict of models.METADATA_* -> values. Performs "best effort" extraction
     using available data.
   """
   logging.debug('Constructing metadata')
-
-  def update_build_config(key, value):
-    if key in build_config:
-      old_value = build_config[key]
-      if value != old_value:
-        raise ValueError('Inconsistent {}: {} (was {})'.format(
-            key, value, old_value))
-    else:
-      build_config[key] = value
-
   metadata = {}
 
   # Ensure all paths are relative to output directory to make them hermetic.
   if output_directory:
     shorten_path = lambda path: os.path.relpath(path, output_directory)
-    gn_args = _ParseGnArgs(os.path.join(output_directory, 'args.gn'))
-    update_build_config(models.BUILD_CONFIG_GN_ARGS, gn_args)
   else:
     # If output directory is unavailable, just store basenames.
     shorten_path = os.path.basename
 
-  # Deduce GIT revision (cached via @lru_cache).
-  git_rev = _DetectGitRevision(source_directory)
-  if git_rev:
-    update_build_config(models.BUILD_CONFIG_GIT_REVISION, git_rev)
-
   if apk_spec:
     metadata[models.METADATA_APK_SIZE] = os.path.getsize(apk_spec.apk_path)
     if apk_spec.minimal_apks_path:
@@ -313,17 +309,14 @@
   logging.info('Analyzing classes.dex for %s', apk_spec.split_name
                or apk_spec.apk_path)
 
-  def compute_dex_size():
-    with zipfile.ZipFile(apk_spec.apk_path) as z:
-      return sum(i.file_size for i in z.infolist()
-                 if i.filename.endswith('.dex'))
+  with zipfile.ZipFile(apk_spec.apk_path) as z:
+    dex_total_size = sum(i.file_size for i in z.infolist()
+                         if i.filename.endswith('.dex'))
 
-  dex_size_result = parallel.CallOnThread(compute_dex_size)
   raw_symbols = apkanalyzer.CreateDexSymbols(apk_spec.apk_path,
                                              apk_spec.mapping_path,
-                                             apk_spec.size_info_prefix)
-  dex_size = dex_size_result.get()
-
+                                             apk_spec.size_info_prefix,
+                                             dex_total_size)
   sizes = collections.Counter()
   for s in raw_symbols:
     sizes[s.section_name] += s.pss
@@ -331,11 +324,11 @@
   dex_method_size = round(sizes[models.SECTION_DEX_METHOD])
   dex_other_size = round(sizes[models.SECTION_DEX])
 
-  unattributed_dex = dex_size - dex_method_size - dex_other_size
+  unattributed_dex = dex_total_size - dex_method_size - dex_other_size
   # Compare against -5 instead of 0 to guard against round-off errors.
   assert unattributed_dex >= -5, (
       'sum(dex_symbols.size) > filesize(classes.dex). {} vs {}'.format(
-          dex_method_size + dex_other_size, dex_size))
+          dex_method_size + dex_other_size, dex_total_size))
 
   if unattributed_dex > 0:
     raw_symbols.append(
@@ -349,7 +342,7 @@
   # "dex other" responsible for any unattributed bytes.
   section_ranges = {
       models.SECTION_DEX_METHOD: (0, dex_method_size),
-      models.SECTION_DEX: (0, dex_size - dex_method_size),
+      models.SECTION_DEX: (0, dex_total_size - dex_method_size),
   }
 
   return section_ranges, raw_symbols
@@ -458,7 +451,6 @@
   return models.SizeInfo(build_config, container_list, all_raw_symbols)
 
 
-@functools.lru_cache
 def _DetectGitRevision(directory):
   """Runs git rev-parse to get the SHA1 hash of the current revision.
 
@@ -477,7 +469,6 @@
     return None
 
 
-@functools.lru_cache
 def _ParseGnArgs(args_path):
   """Returns a list of normalized "key=value" strings."""
   args = {}
@@ -1050,7 +1041,7 @@
     except Exception as e:
       on_config_error(f'Bad --container-filter input: {e}')
 
-  build_config = {}
+  build_config = None
   seen_container_names = set()
   raw_symbols_list = []
   pak_id_map = pakfile.PakIdMap()
@@ -1058,6 +1049,10 @@
   # Iterate over each container.
   for (sub_args, apk_spec, pak_spec, native_specs, container_name,
        resources_pathmap_path) in _IterSubArgs(top_args, on_config_error):
+    if build_config is None:
+      # TODO(agrieve): Move this out of the loop.
+      build_config = CreateBuildConfig(sub_args.output_directory,
+                                       sub_args.source_directory)
     if not native_specs:
       native_specs = [None]
 
@@ -1071,10 +1066,8 @@
         continue
       logging.info('Starting on container %s', container_name)
 
-      metadata = CreateMetadata(build_config=build_config,
-                                apk_spec=apk_spec,
+      metadata = CreateMetadata(apk_spec=apk_spec,
                                 native_spec=native_spec,
-                                source_directory=sub_args.source_directory,
                                 output_directory=sub_args.output_directory)
       raw_symbols = CreateContainerSymbols(
           container_name=container_name,
diff --git a/tools/binary_size/libsupersize/integration_test.py b/tools/binary_size/libsupersize/integration_test.py
index 6ff07fb..a3eb729 100755
--- a/tools/binary_size/libsupersize/integration_test.py
+++ b/tools/binary_size/libsupersize/integration_test.py
@@ -259,15 +259,14 @@
             yield container_name, apk_spec, pak_spec, native_spec
 
       raw_symbols_list = []
-      build_config = {}
 
       with test_util.AddMocksToPath():
+        build_config = archive.CreateBuildConfig(output_directory,
+                                                 _TEST_SOURCE_DIR)
         pak_id_map = pakfile.PakIdMap()
         for container_name, apk_spec, pak_spec, native_spec in iter_specs():
-          metadata = archive.CreateMetadata(build_config=build_config,
-                                            apk_spec=apk_spec,
+          metadata = archive.CreateMetadata(apk_spec=apk_spec,
                                             native_spec=native_spec,
-                                            source_directory=_TEST_SOURCE_DIR,
                                             output_directory=output_directory)
           raw_symbols = archive.CreateContainerSymbols(
               container_name=container_name,
diff --git a/tools/mac/power/README.md b/tools/mac/power/README.md
index 1e16e6d..256d9c4 100644
--- a/tools/mac/power/README.md
+++ b/tools/mac/power/README.md
@@ -56,6 +56,12 @@
 <user> ALL = (ALL) NOPASSWD:ALL
 ```
 
+## power_sampler
+
+A compiled binary of power_sampler is required to run power measurements. It can be compiled using this command:
+`autoninja -C out/Release tools/mac/power:power_sampler`
+
+
 ## DTrace
 
 Running benchmark.py in profile mode uses `dtrace` to analyse the chromium processes. By default `dtrace` does not work well with [SIP](https://support.apple.com/en-us/HT204899). Disabling SIP as a whole is not recommended and instead should be done only for dtrace using these steps:
@@ -73,7 +79,7 @@
 * Profile the code that runs and/or is causing wake-ups. (chromium only)
 
 ```
-./benchmark.py --scenarios idle_on_wiki:chrome
+./benchmark.py --scenarios idle_on_wiki:chrome idle_on_wiki:safari
 ./benchmark.py --profile_mode cpu_time --scenarios idle_on_wiki:chromium
 ```
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index cf72432..3cb8b00 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -28461,6 +28461,7 @@
   <int value="948" label="FirstPartySetsEnabled"/>
   <int value="949" label="UserAgentForceMajorVersionToMinorPosition"/>
   <int value="950" label="AllHttpAuthSchemesAllowedForOrigins"/>
+  <int value="951" label="WindowPlacementAlwaysAllowed"/>
 </enum>
 
 <enum name="EnterprisePolicyDeviceIdValidity">
@@ -36986,6 +36987,7 @@
   <int value="4150" label="PrivateNetworkAccessWithinWorker"/>
   <int value="4151" label="ClientHintsUAWoW64"/>
   <int value="4152" label="FetchSetCookieInRequestGuardedHeaders"/>
+  <int value="4153" label="V8Window_RequestPictureInPictureWindow_Method"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
@@ -83161,7 +83163,7 @@
   <int value="12" label="AccountReconcilor::Reconcile"/>
   <int value="13" label="DiceResponseHandler::Signin"/>
   <int value="14" label="DiceResponseHandler::Signout"/>
-  <int value="15" label="DiceTurnOnSyncHelper::Abort"/>
+  <int value="15" label="TurnOnSyncHelper::Abort"/>
   <int value="16" label="MachineLogon::CredentialProvider"/>
   <int value="17" label="TokenService::ExtractCredentials"/>
   <int value="18"
diff --git a/tools/metrics/histograms/metadata/bookmarks/histograms.xml b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
index f6590be..e5d85c3 100644
--- a/tools/metrics/histograms/metadata/bookmarks/histograms.xml
+++ b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
@@ -155,23 +155,6 @@
   </summary>
 </histogram>
 
-<histogram name="Bookmarks.Count.OnProfileLoad.DuplicateUrl" units="bookmarks"
-    expires_after="2021-04-04">
-  <obsolete>
-    Replaced with Bookmarks.Count.OnProfileLoad.DuplicateUrl2 as of 11/2020 to
-    provide more granular buckets above 10K duplicates
-  </obsolete>
-  <owner>mamir@chromium.org</owner>
-  <owner>mastiz@chromium.org</owner>
-  <component>UI&gt;Browser&gt;Bookmarks</component>
-  <summary>
-    The number of bookmarks a user has saved with a URL that is also present in
-    at least one other bookmark. This excludes folders (which don't have a URL).
-    Recorded when bookmarks are loaded into storage from disk if there is at
-    least one duplicate.
-  </summary>
-</histogram>
-
 <histogram name="Bookmarks.Count.OnProfileLoad.Duplicate{UniquenessCriterion}"
     units="bookmarks" expires_after="2022-06-30">
   <owner>mastiz@chromium.org</owner>
@@ -231,47 +214,6 @@
   </summary>
 </histogram>
 
-<histogram name="Bookmarks.CreateBookmarkIndexTime" units="ms"
-    expires_after="M88">
-  <obsolete>
-    Removed in M88.
-  </obsolete>
-  <owner>mastiz@chromium.org</owner>
-  <owner>sky@chromium.org</owner>
-  <component>UI&gt;Browser&gt;Bookmarks</component>
-  <summary>
-    Time taken to build the bookmark index. Logged upon profile load when the
-    bookmarks JSON file is read.
-  </summary>
-</histogram>
-
-<histogram name="Bookmarks.DecodeTime" units="ms" expires_after="M88">
-  <obsolete>
-    Removed in M88.
-  </obsolete>
-  <owner>mastiz@chromium.org</owner>
-  <owner>sky@chromium.org</owner>
-  <component>UI&gt;Browser&gt;Bookmarks</component>
-  <summary>
-    Time taken to decode the bookmarks JSON file. Logged upon profile load when
-    the bookmarks JSON file is read.
-  </summary>
-</histogram>
-
-<histogram name="Bookmarks.DuplicateAndEmptyTitleDetectionTime" units="ms"
-    expires_after="2019-09-24">
-  <obsolete>
-    Removed in M88.
-  </obsolete>
-  <owner>mamir@chromium.org</owner>
-  <owner>mastiz@chromium.org</owner>
-  <component>UI&gt;Browser&gt;Bookmarks</component>
-  <summary>
-    Time to compute values to be logged for UMA metrics
-    Bookmarks.Count.OnProfileLoad.*.
-  </summary>
-</histogram>
-
 <histogram name="Bookmarks.EntryPoint" enum="BookmarksEntryPoint"
     expires_after="2022-06-05">
   <owner>ianwen@chromium.org</owner>
@@ -313,27 +255,6 @@
   </summary>
 </histogram>
 
-<histogram name="Bookmarks.OpenBookmarkTimeInterval.{BookmarkType}" units="ms"
-    expires_after="2022-02-15">
-  <obsolete>
-    Deprecated March 2021
-  </obsolete>
-  <owner>dtrainor@chromium.org</owner>
-  <owner>xingliu@chromium.org</owner>
-  <component>UI&gt;Browser&gt;Bookmarks</component>
-  <summary>
-    Logs the duration in milliseconds between bookmark creation time and
-    bookmark open time based on device local time. Recorded when {BookmarkType}
-    is opened. Bookmark folder is not considered. The creation and open can
-    happen on different runs of Chrome.
-  </summary>
-  <token key="BookmarkType">
-    <variant name="Normal" summary="a normal bookmark."/>
-    <variant name="Partner" summary="a partner bookmark."/>
-    <variant name="ReadingList" summary="a reading list article."/>
-  </token>
-</histogram>
-
 <histogram name="Bookmarks.OpenBookmarkTimeInterval2.{BookmarkType}" units="ms"
     expires_after="2022-02-15">
   <owner>dtrainor@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
index 9356bd5..21883d9 100644
--- a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
@@ -108,50 +108,6 @@
   </summary>
 </histogram>
 
-<histogram name="ChromeOS.Settings.Languages.Browser.Interaction"
-    enum="SettingsLanguagesPageBrowserInteraction" expires_after="2021-08-01">
-  <obsolete>
-    Deprecated as of M88, as the languages browser settings page has been
-    replaced with the languages OS settings page.
-  </obsolete>
-  <owner>myy@chromium.org</owner>
-  <owner>essential-inputs-team@google.com</owner>
-  <summary>
-    Records when users interact with an element in the Chrome OS's Languages
-    browser settings page.
-  </summary>
-</histogram>
-
-<histogram name="ChromeOS.Settings.Languages.Browser.OfferToTranslateCheckbox"
-    enum="BooleanChecked" expires_after="2021-05-30">
-  <obsolete>
-    Deprecated as of M88, as the languages browser settings page has been
-    replaced with the languages OS settings page.
-  </obsolete>
-  <owner>myy@chromium.org</owner>
-  <owner>essential-inputs-team@google.com</owner>
-  <summary>
-    Records when users check/uncheck &quot;Offer to translate pages in this
-    language&quot; checkbox.
-  </summary>
-</histogram>
-
-<histogram base="true" name="ChromeOS.Settings.Languages.Browser.Toggle"
-    enum="BooleanToggled" expires_after="2021-05-30">
-  <obsolete>
-    Deprecated as of M88, as the languages browser settings page has been
-    replaced with the languages OS settings page.
-  </obsolete>
-<!-- Name completed by histogram_suffixes name="SettingsLanguagesPageToggle" -->
-
-  <owner>myy@chromium.org</owner>
-  <owner>essential-inputs-team@google.com</owner>
-  <summary>
-    Records when users interact with a toggle in the Chrome OS's Languages
-    browser settings page.
-  </summary>
-</histogram>
-
 <histogram name="ChromeOS.Settings.Languages.Interaction"
     enum="SettingsLanguagesPageInteraction" expires_after="2022-04-10">
   <owner>myy@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
index 172efbb2..e5bd7f4 100644
--- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
+++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -9946,7 +9946,6 @@
   <suffix name="SpellCheck" label="Spell check"/>
   <suffix name="Translate"
       label="Offer to translate pages in a language you don't read"/>
-  <affected-histogram name="ChromeOS.Settings.Languages.Browser.Toggle"/>
   <affected-histogram name="ChromeOS.Settings.Languages.Toggle"/>
 </histogram_suffixes>
 
diff --git a/tools/metrics/histograms/metadata/navigation/histograms.xml b/tools/metrics/histograms/metadata/navigation/histograms.xml
index 5ea6fae3..673106d 100644
--- a/tools/metrics/histograms/metadata/navigation/histograms.xml
+++ b/tools/metrics/histograms/metadata/navigation/histograms.xml
@@ -1065,7 +1065,7 @@
 </histogram>
 
 <histogram name="Navigation.ThrottleDeferTime.{Event}" units="ms"
-    expires_after="2022-03-11">
+    expires_after="2022-09-11">
   <owner>cduvall@chromium.org</owner>
   <owner>jam@chromium.org</owner>
   <summary>
@@ -1076,7 +1076,7 @@
 </histogram>
 
 <histogram name="Navigation.ThrottleExecutionTime.{Event}" units="ms"
-    expires_after="2022-03-11">
+    expires_after="2022-09-11">
   <owner>cduvall@chromium.org</owner>
   <owner>jam@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml
index 53840d5..9d7ca021 100644
--- a/tools/metrics/histograms/metadata/optimization/histograms.xml
+++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -57,19 +57,6 @@
       summary="Validates bloom filer allowlist/blocklist based hints"/>
   <variant name="CompressPublicImages" summary="Compresses public images"/>
   <variant name="DeferAllScript" summary="Defers execution of script"/>
-  <variant name="DelayAsyncScriptExecution"
-      summary="Delays execution of async scripts">
-    <obsolete>
-      Removed in M94.
-    </obsolete>
-  </variant>
-  <variant name="DelayCompetingLowPriorityRequests"
-      summary="Delays low priority requests behind in-flight 'important'
-               requests">
-    <obsolete>
-      Removed in M94.
-    </obsolete>
-  </variant>
   <variant name="FastHostHints"
       summary="Provides information about hosts that historically provide a
                fast and responsive user experience"/>
@@ -78,12 +65,6 @@
                page"/>
   <variant name="LitePage"
       summary="HTTP server preview (served from the Data Reduction Proxy)"/>
-  <variant name="LitePageRedirect"
-      summary="HTTPS server preview (served from the litepages service)">
-    <obsolete>
-      Removed in M84.
-    </obsolete>
-  </variant>
   <variant name="LiteVideo"
       summary="Provides information on how to throttle media requests to
                reduce the adaptive bit rates of media streams."/>
@@ -99,24 +80,12 @@
       summary="Provides trust data related to the merchant -- version 2."/>
   <variant name="MetadataFetchValidation"
       summary="Validates metadata fetch on navigation"/>
-  <variant name="NoScript"
-      summary="Disables the fetching and execution of JavaScript">
-    <obsolete>
-      Removed in M89.
-    </obsolete>
-  </variant>
   <variant name="PageEntities"
       summary="Provides the entities that are present on the page"/>
   <variant name="PerformanceHints"
       summary="Provides aggregated performance information about the page"/>
   <variant name="PriceTracking"
       summary="Returns price related data for shopping websites"/>
-  <variant name="ResourceLoading"
-      summary="Applies a set of resource loading hints to load the page">
-    <obsolete>
-      Removed in M89.
-    </obsolete>
-  </variant>
   <variant name="ShoppingPagePredictor"
       summary="Determines if a page is shopping related or not"/>
 </variants>
@@ -127,11 +96,6 @@
 </variants>
 
 <variants name="RequestContext">
-  <variant name="BatchUpdate" summary="Batch update.">
-    <obsolete>
-      Obsolete as of 10/2021.
-    </obsolete>
-  </variant>
   <variant name="BatchUpdateActiveTabs"
       summary="Batch update of hints for active tabs"/>
   <variant name="BatchUpdateGoogleSRP"
@@ -458,25 +422,6 @@
 </histogram>
 
 <histogram
-    name="OptimizationGuide.ModelExecutor.ModelLoadingDuration.{OptimizationTarget}"
-    units="ms" expires_after="M106">
-  <obsolete>
-    Replaced by
-    OptimizationGuide.ModelExecutor.ModelLoadingDuration2.{OptimizationTarget}
-    in M99 becuase the metrics recorded here were incorrect and should not be
-    used.
-  </obsolete>
-  <owner>robertogden@chromium.org</owner>
-  <owner>chrome-intelligence-core@google.com</owner>
-  <summary>
-    Records the time duration it took to load a model file (un)successfully for
-    {OptimizationTarget}. Recorded once per model load attempt for
-    {OptimizationTarget}.
-  </summary>
-  <token key="OptimizationTarget" variants="OptimizationTarget"/>
-</histogram>
-
-<histogram
     name="OptimizationGuide.ModelExecutor.ModelLoadingDuration2.{OptimizationTarget}"
     units="ms" expires_after="M106">
   <owner>robertogden@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
index bdb14219..e646c29 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -157,28 +157,6 @@
   </summary>
 </histogram>
 
-<histogram name="SafeBrowsing.BlockingPage.ResourceType"
-    enum="ContentResourceType2" expires_after="2022-02-06">
-  <obsolete>
-    Removed from code in M94. Replaced with
-    SafeBrowsing.BlockingPage.RequestDestination.
-  </obsolete>
-  <owner>xinghuilu@chromium.org</owner>
-  <owner>chrome-safebrowsing-alerts@google.com</owner>
-  <summary>
-    Logs the resource type that triggers the safe browsing blocking page. Logged
-    each time a safe browsing blocking page is created. This metric is useful to
-    show the priority of checking each resource type in real time. Note that
-    this metric may be bias towards mainframe, because the default resource type
-    is set to mainframe.
-
-    Starting M89, this metric is derived from
-    network::mojom::RequestDestination. kPrefetch, kFavicon, kXhr, kPing,
-    kNavigationPreloadMainFrame, and kNavigationPreloadSubFrame are all mapped
-    to kSubResource.
-  </summary>
-</histogram>
-
 <histogram
     name="SafeBrowsing.BrowserThrottle.IsCheckCompletedOnProcessResponse"
     enum="BooleanCompleted" expires_after="2022-07-11">
diff --git a/tools/metrics/histograms/metadata/settings/histograms.xml b/tools/metrics/histograms/metadata/settings/histograms.xml
index a8200ea..ad4e39a 100644
--- a/tools/metrics/histograms/metadata/settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/settings/histograms.xml
@@ -160,13 +160,13 @@
 </histogram>
 
 <histogram name="Settings.PinUnlockSetup" enum="LockScreenProgress"
-    expires_after="2022-04-10">
-  <owner>rsorokin@chromium.org</owner>
-  <owner>jessejames@chromium.org</owner>
-  <owner>cros-oac@google.com</owner>
+    expires_after="2022-06-10">
+  <owner>anastasiian@chromium.org</owner>
+  <owner>teresachow@google.com</owner>
+  <owner>cros-lurs@google.com</owner>
   <summary>
     The users progress through the pin unlock setup wizard. Each type
-    corresponds to the user completeing a different stage of the setup wizard.
+    corresponds to the user completing a different stage of the setup wizard.
   </summary>
 </histogram>
 
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 34f8bd81..de8478d 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@
             "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "win": {
-            "hash": "54c262715852a43d1be2fd25f64d8727d6969d98",
-            "remote_path": "perfetto_binaries/trace_processor_shell/win/00b152a26effb7ba2ec1f2d1fdace9116ea470e4/trace_processor_shell.exe"
+            "hash": "6c0f92df430b8793a010905f73a4d1e7219d2fe7",
+            "remote_path": "perfetto_binaries/trace_processor_shell/win/bb04c2aa467ce4cb326836c2ebf73d862bb7ed37/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893",
@@ -14,7 +14,7 @@
         },
         "mac": {
             "hash": "1f298d105f2b7ac6bc376cfb74430f839ca6d625",
-            "remote_path": "perfetto_binaries/trace_processor_shell/mac/00b152a26effb7ba2ec1f2d1fdace9116ea470e4/trace_processor_shell"
+            "remote_path": "perfetto_binaries/trace_processor_shell/mac/bb04c2aa467ce4cb326836c2ebf73d862bb7ed37/trace_processor_shell"
         },
         "mac_arm64": {
             "hash": "c0397e87456ad6c6a7aa0133e5b81c97adbab4ab",
@@ -22,7 +22,7 @@
         },
         "linux": {
             "hash": "9ed307b2d52a0af8d2e30ff51e34cdcd1a224f26",
-            "remote_path": "perfetto_binaries/trace_processor_shell/linux/00b152a26effb7ba2ec1f2d1fdace9116ea470e4/trace_processor_shell"
+            "remote_path": "perfetto_binaries/trace_processor_shell/linux/bb04c2aa467ce4cb326836c2ebf73d862bb7ed37/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/rust/build.py b/tools/rust/build.py
index a1c7d8fe..e6a36c9 100755
--- a/tools/rust/build.py
+++ b/tools/rust/build.py
@@ -48,8 +48,8 @@
 from update import (CHROMIUM_DIR, CLANG_REVISION, CLANG_SUB_REVISION,
                     LLVM_BUILD_DIR, GetDefaultHostOs, RmTree, UpdatePackage)
 
-# Trunk on 1/26/2021
-RUST_REVISION = 'a7f3757'
+# Trunk on 1/31/2021
+RUST_REVISION = '24b8bb1'
 RUST_SUB_REVISION = 1
 
 PACKAGE_VERSION = '%s-%s-%s-%s' % (RUST_REVISION, RUST_SUB_REVISION,
diff --git a/tools/style_variable_generator/colors_test_expected.cc.generated b/tools/style_variable_generator/colors_test_expected.cc.generated
new file mode 100644
index 0000000..8b0e18ba
--- /dev/null
+++ b/tools/style_variable_generator/colors_test_expected.cc.generated
@@ -0,0 +1,60 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file is generated from:
+//   colors_test.json5
+//   colors_test_palette.json5
+
+#include "tools/style_variable_generator/colors_test_expected.h"
+
+#include "third_party/skia/include/core/SkColor.h"
+
+namespace colors_test_expected {
+
+SkAlpha GetOpacity(OpacityName opacity_name, bool is_dark_mode) {
+  switch (opacity_name) {
+    case OpacityName::kDisabledOpacity:
+      return 0x60;
+    case OpacityName::kReferenceOpacity:
+      if (is_dark_mode) {
+        return 0xFF;
+      } else {
+        return GetOpacity(OpacityName::kDisabledOpacity, is_dark_mode);
+      }
+  }
+}
+
+SkColor ResolveColor(ColorName color_name,
+                               bool is_dark_mode,
+                               bool use_debug_colors) {
+  switch (color_name) {
+    case ColorName::kGoogleGrey900:
+      return SkColorSetRGB(0x20, 0x21, 0x24);
+    case ColorName::kTextColorPrimary:
+      if (use_debug_colors)
+        return ResolveColor(ColorName::kToggleColor, is_dark_mode, use_debug_colors);
+      if (is_dark_mode)
+        return SkColorSetRGB(0xFF, 0xFF, 0xFF);
+      return ResolveColor(ColorName::kGoogleGrey900, is_dark_mode, use_debug_colors);
+    case ColorName::kToggleColor:
+      if (use_debug_colors)
+        return SkColorSetRGB(0xFF, 0xFF, 0xFF);
+      if (is_dark_mode)
+        return SkColorSetA(ResolveColor(ColorName::kTextColorPrimary, is_dark_mode, use_debug_colors), GetOpacity(OpacityName::kDisabledOpacity, is_dark_mode));
+      return SkColorSetA(ResolveColor(ColorName::kTextColorPrimary, is_dark_mode, use_debug_colors), 0x19);
+    case ColorName::kBgColorElevation1:
+      if (is_dark_mode)
+        return SkColorSetRGB(0x29, 0x2A, 0x2D);
+      return SkColorSetRGB(0xFF, 0xFF, 0xFF);
+  }
+}
+
+char kDebugOverrideCssString[] = "html:not(body) {\n"
+    "  --cros-text-color-primary-rgb: var(--cros-toggle-color-rgb);\n"
+    "  --cros-text-color-primary: var(--cros-toggle-color);\n"
+    "  --cros-toggle-color-rgb: 255, 255, 255;\n"
+    "  --cros-toggle-color: rgb(var(--cros-toggle-color-rgb));\n"
+    "}\n";
+
+}  // namespace colors_test_expected
diff --git a/tools/style_variable_generator/colors_test_expected.h.generated b/tools/style_variable_generator/colors_test_expected.h.generated
index a6cd52a..8bd1f723 100644
--- a/tools/style_variable_generator/colors_test_expected.h.generated
+++ b/tools/style_variable_generator/colors_test_expected.h.generated
@@ -9,7 +9,6 @@
 #ifndef TOOLS_STYLE_VARIABLE_GENERATOR_COLORS_TEST_EXPECTED_H_
 #define TOOLS_STYLE_VARIABLE_GENERATOR_COLORS_TEST_EXPECTED_H_
 
-#include "base/strings/strcat.h"
 #include "third_party/skia/include/core/SkColor.h"
 
 namespace colors_test_expected {
@@ -26,50 +25,14 @@
   kReferenceOpacity,
 };
 
-constexpr SkAlpha GetOpacity(OpacityName opacity_name, bool is_dark_mode) {
-  switch (opacity_name) {
-    case OpacityName::kDisabledOpacity:
-      return 0x60;
-    case OpacityName::kReferenceOpacity:
-      if (is_dark_mode) {
-        return 0xFF;
-      } else {
-        return GetOpacity(OpacityName::kDisabledOpacity, is_dark_mode);
-      }
-  }
-}
+SkAlpha GetOpacity(OpacityName opacity_name,
+                   bool is_dark_mode);
 
-constexpr SkColor ResolveColor(ColorName color_name,
-                               bool is_dark_mode,
-                               bool use_debug_colors) {
-  switch (color_name) {
-    case ColorName::kGoogleGrey900:
-      return SkColorSetRGB(0x20, 0x21, 0x24);
-    case ColorName::kTextColorPrimary:
-      if (use_debug_colors)
-        return ResolveColor(ColorName::kToggleColor, is_dark_mode, use_debug_colors);
-      if (is_dark_mode)
-        return SkColorSetRGB(0xFF, 0xFF, 0xFF);
-      return ResolveColor(ColorName::kGoogleGrey900, is_dark_mode, use_debug_colors);
-    case ColorName::kToggleColor:
-      if (use_debug_colors)
-        return SkColorSetRGB(0xFF, 0xFF, 0xFF);
-      if (is_dark_mode)
-        return SkColorSetA(ResolveColor(ColorName::kTextColorPrimary, is_dark_mode, use_debug_colors), GetOpacity(OpacityName::kDisabledOpacity, is_dark_mode));
-      return SkColorSetA(ResolveColor(ColorName::kTextColorPrimary, is_dark_mode, use_debug_colors), 0x19);
-    case ColorName::kBgColorElevation1:
-      if (is_dark_mode)
-        return SkColorSetRGB(0x29, 0x2A, 0x2D);
-      return SkColorSetRGB(0xFF, 0xFF, 0xFF);
-  }
-}
+SkColor ResolveColor(ColorName color_name,
+                     bool is_dark_mode,
+                     bool use_debug_colors);
 
-constexpr char kDebugOverrideCssString[] = "html:not(body) {\n"
-    "  --cros-text-color-primary-rgb: var(--cros-toggle-color-rgb);\n"
-    "  --cros-text-color-primary: var(--cros-toggle-color);\n"
-    "  --cros-toggle-color-rgb: 255, 255, 255;\n"
-    "  --cros-toggle-color: rgb(var(--cros-toggle-color-rgb));\n"
-    "}\n";
+extern char kDebugOverrideCssString[];
 
 }  // namespace colors_test_expected
 #endif  // TOOLS_STYLE_VARIABLE_GENERATOR_COLORS_TEST_EXPECTED_H_
diff --git a/tools/style_variable_generator/main.py b/tools/style_variable_generator/main.py
index 3768487..40811999 100755
--- a/tools/style_variable_generator/main.py
+++ b/tools/style_variable_generator/main.py
@@ -12,7 +12,7 @@
 from style_variable_generator.css_generator import CSSStyleGenerator
 from style_variable_generator.ts_generator import TSStyleGenerator
 from style_variable_generator.proto_generator import ProtoStyleGenerator, ProtoJSONStyleGenerator
-from style_variable_generator.views_generator import ViewsStyleGenerator
+from style_variable_generator.views_generator import ViewsCCStyleGenerator, ViewsHStyleGenerator
 from style_variable_generator.base_generator import Modes
 
 
@@ -32,8 +32,8 @@
         description='Generate style variables from JSON5 color file.')
 
     generators = [
-        CSSStyleGenerator, ViewsStyleGenerator, ProtoStyleGenerator,
-        ProtoJSONStyleGenerator, TSStyleGenerator
+        CSSStyleGenerator, ViewsCCStyleGenerator, ViewsHStyleGenerator,
+        ProtoStyleGenerator, ProtoJSONStyleGenerator, TSStyleGenerator
     ]
 
     parser.add_argument('--generator',
diff --git a/tools/style_variable_generator/style_variable_generator.gni b/tools/style_variable_generator/style_variable_generator.gni
index 1ccaca7..dde4d70 100644
--- a/tools/style_variable_generator/style_variable_generator.gni
+++ b/tools/style_variable_generator/style_variable_generator.gni
@@ -56,7 +56,7 @@
            ] + rebase_path(sources, root_build_dir)
   }
 
-  action("${target_name}_views_generator") {
+  action("${target_name}_views_h_generator") {
     script = script_file
     forward_variables_from(invoker,
                            [
@@ -71,15 +71,44 @@
     out_file = "$target_gen_dir/${original_target_name}.h"
     outputs = [ out_file ]
     args = [
-             "--generator=Views",
+             "--generator=ViewsH",
+             "--out-file",
+             rebase_path("$out_file", root_build_dir),
+           ] + rebase_path(sources, root_build_dir)
+  }
+
+  action("${target_name}_views_cc_generator") {
+    script = script_file
+    forward_variables_from(invoker,
+                           [
+                             "deps",
+                             "sources",
+                           ])
+
+    inputs = common_inputs + [
+               "//tools/style_variable_generator/views_generator.py",
+               "//tools/style_variable_generator/views_generator_cc.tmpl",
+             ]
+    out_file = "$target_gen_dir/${original_target_name}.cc"
+    outputs = [ out_file ]
+    args = [
+             "--generator=ViewsCC",
              "--out-file",
              rebase_path("$out_file", root_build_dir),
            ] + rebase_path(sources, root_build_dir)
   }
 
   source_set("${target_name}_views") {
-    sources = [ "$target_gen_dir/${original_target_name}.h" ]
-    deps = [ ":${original_target_name}_views_generator" ]
+    sources = [
+      "$target_gen_dir/${original_target_name}.cc",
+      "$target_gen_dir/${original_target_name}.h",
+    ]
+    deps = [
+      ":${original_target_name}_views_cc_generator",
+      ":${original_target_name}_views_h_generator",
+      "//base",
+      "//skia",
+    ]
   }
 
   action("${target_name}_proto") {
diff --git a/tools/style_variable_generator/style_variable_generator_test.py b/tools/style_variable_generator/style_variable_generator_test.py
index b536109..c37f6e96 100755
--- a/tools/style_variable_generator/style_variable_generator_test.py
+++ b/tools/style_variable_generator/style_variable_generator_test.py
@@ -10,7 +10,7 @@
 from style_variable_generator.base_generator import Modes
 from style_variable_generator.css_generator import CSSStyleGenerator
 from style_variable_generator.proto_generator import ProtoStyleGenerator, ProtoJSONStyleGenerator
-from style_variable_generator.views_generator import ViewsStyleGenerator
+from style_variable_generator.views_generator import ViewsHStyleGenerator, ViewsCCStyleGenerator
 from style_variable_generator.ts_generator import TSStyleGenerator
 import unittest
 
@@ -28,14 +28,22 @@
                                self.expected_output_file)
 
 
-class ViewsStyleGeneratorTest(unittest.TestCase, BaseStyleGeneratorTest):
+class ViewsStyleHGeneratorTest(unittest.TestCase, BaseStyleGeneratorTest):
     def setUp(self):
-        self.generator = ViewsStyleGenerator()
+        self.generator = ViewsHStyleGenerator()
         self.generator.AddJSONFilesToModel(
             ['colors_test_palette.json5', 'colors_test.json5'])
         self.expected_output_file = 'colors_test_expected.h.generated'
 
 
+class ViewsStyleCCGeneratorTest(unittest.TestCase, BaseStyleGeneratorTest):
+    def setUp(self):
+        self.generator = ViewsCCStyleGenerator()
+        self.generator.AddJSONFilesToModel(
+            ['colors_test_palette.json5', 'colors_test.json5'])
+        self.expected_output_file = 'colors_test_expected.cc.generated'
+
+
 class CSSStyleGeneratorTest(unittest.TestCase, BaseStyleGeneratorTest):
     def setUp(self):
         self.generator = CSSStyleGenerator()
@@ -105,7 +113,8 @@
         self.assertEqualToFile(self.generator.Render(), expected_file_name)
 
     def testTypographyAndUntypedCSS(self):
-        expected_file_name = 'colors_test_typography_and_untyped_css_expected.ts'
+        expected_file_name = (
+            'colors_test_typography_and_untyped_css_expected.ts')
         self.generator.AddJSONFilesToModel(
             ['typography_test.json5', 'untyped_css_test.json5'])
         self.generator.generator_options = {'include_style_sheet': 'true'}
diff --git a/tools/style_variable_generator/views_generator.py b/tools/style_variable_generator/views_generator.py
index d0cb4d94..8fe3fb58 100644
--- a/tools/style_variable_generator/views_generator.py
+++ b/tools/style_variable_generator/views_generator.py
@@ -4,22 +4,17 @@
 
 import os
 import math
+import re
 from style_variable_generator.base_generator import Color, Modes, VariableType
 from style_variable_generator.css_generator import CSSStyleGenerator
 
 
 class ViewsStyleGenerator(CSSStyleGenerator):
     '''Generator for Views Variables'''
-
     @staticmethod
     def GetName():
         return 'Views'
 
-    def Render(self):
-        self.Validate()
-        return self.ApplyTemplate(self, 'views_generator_h.tmpl',
-                                  self.GetParameters())
-
     def GetParameters(self):
         return {
             'colors': self._CreateColorList(),
@@ -41,6 +36,7 @@
             'Modes': Modes,
             'out_file_path': None,
             'namespace_name': None,
+            'header_file': None,
             'in_files': sorted(self.in_file_to_context.keys()),
             'css_color_var': self.CSSColorVar,
         }
@@ -48,6 +44,10 @@
             globals['out_file_path'] = self.out_file_path
             globals['namespace_name'] = os.path.splitext(
                 os.path.basename(self.out_file_path))[0]
+            header_file = self.out_file_path.replace(".cc", ".h")
+            header_file = re.sub(r'.*gen/', '', header_file)
+            globals['header_file'] = header_file
+
         return globals
 
     def _CreateColorList(self):
@@ -91,3 +91,31 @@
                 c.opacity), c.r, c.g, c.b)
         else:
             return 'SkColorSetRGB(0x%X, 0x%X, 0x%X)' % (c.r, c.g, c.b)
+
+
+class ViewsCCStyleGenerator(ViewsStyleGenerator):
+    @staticmethod
+    def GetName():
+        return 'ViewsCC'
+
+    def GetContextKey(self):
+        return ViewsStyleGenerator.GetName()
+
+    def Render(self):
+        self.Validate()
+        return self.ApplyTemplate(self, 'views_generator_cc.tmpl',
+                                  self.GetParameters())
+
+
+class ViewsHStyleGenerator(ViewsStyleGenerator):
+    @staticmethod
+    def GetName():
+        return 'ViewsH'
+
+    def GetContextKey(self):
+        return ViewsStyleGenerator.GetName()
+
+    def Render(self):
+        self.Validate()
+        return self.ApplyTemplate(self, 'views_generator_h.tmpl',
+                                  self.GetParameters())
diff --git a/tools/style_variable_generator/views_generator_cc.tmpl b/tools/style_variable_generator/views_generator_cc.tmpl
new file mode 100644
index 0000000..386a1d08
--- /dev/null
+++ b/tools/style_variable_generator/views_generator_cc.tmpl
@@ -0,0 +1,67 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file is generated from:
+{%- for path in in_files %}
+//   {{path}}
+{%-  endfor %}
+
+#include "{{header_file}}"
+
+#include "third_party/skia/include/core/SkColor.h"
+
+namespace {{namespace_name}} {
+
+{%- if opacities %}
+
+SkAlpha GetOpacity(OpacityName opacity_name, bool is_dark_mode) {
+  switch (opacity_name) {
+{%-   for name, mode_values in opacities.items() %}
+    case OpacityName::{{name | to_const_name}}:
+{%-   if mode_values[Modes.DARK] %}
+      if (is_dark_mode) {
+        return {{mode_values[Modes.DARK] | cpp_opacity}};
+      } else {
+        return {{mode_values[Modes.LIGHT] | cpp_opacity}};
+      }
+{%-    else %}
+      return {{mode_values[Modes.LIGHT] | cpp_opacity}};
+{%-    endif %}
+{%-   endfor %}
+  }
+}
+
+{%- endif %}
+
+SkColor ResolveColor(ColorName color_name,
+                               bool is_dark_mode,
+                               bool use_debug_colors) {
+  switch (color_name) {
+{%- for obj in colors %}
+    case ColorName::{{obj.name | to_const_name}}:
+{%-   if obj.mode_values[Modes.DEBUG] %}
+      if (use_debug_colors)
+        return {{obj.mode_values[Modes.DEBUG] | cpp_color}};
+
+{%-    endif %}
+{%-   if obj.mode_values[Modes.DARK] %}
+      if (is_dark_mode)
+        return {{obj.mode_values[Modes.DARK] | cpp_color}};
+
+{%-    endif %}
+      return {{obj.mode_values[Modes.LIGHT] | cpp_color}};
+{%-  endfor %}
+  }
+}
+
+char kDebugOverrideCssString[] = "html:not(body) {\n"
+{%- for obj in colors %}
+{%-   if obj.mode_values[Modes.DEBUG] %}
+    "  {{obj.name | to_css_var_name}}-rgb: {{obj.mode_values[Modes.DEBUG] | css_color_rgb}};\n"
+    "  {{obj.name | to_css_var_name}}: {{css_color_var(obj.name, obj.mode_values[Modes.DEBUG])}};\n"
+{%-    endif %}
+{%-  endfor %}
+    "}\n";
+
+}  // namespace {{namespace_name}}
diff --git a/tools/style_variable_generator/views_generator_h.tmpl b/tools/style_variable_generator/views_generator_h.tmpl
index 4d5ef4c..cfdfab1 100644
--- a/tools/style_variable_generator/views_generator_h.tmpl
+++ b/tools/style_variable_generator/views_generator_h.tmpl
@@ -14,7 +14,6 @@
 #ifndef {{header_guard}}
 #define {{header_guard}}
 
-#include "base/strings/strcat.h"
 #include "third_party/skia/include/core/SkColor.h"
 
 namespace {{namespace_name}} {
@@ -33,53 +32,15 @@
 {%-   endfor %}
 };
 
-constexpr SkAlpha GetOpacity(OpacityName opacity_name, bool is_dark_mode) {
-  switch (opacity_name) {
-{%-   for name, mode_values in opacities.items() %}
-    case OpacityName::{{name | to_const_name}}:
-{%-   if mode_values[Modes.DARK] %}
-      if (is_dark_mode) {
-        return {{mode_values[Modes.DARK] | cpp_opacity}};
-      } else {
-        return {{mode_values[Modes.LIGHT] | cpp_opacity}};
-      }
-{%-    else %}
-      return {{mode_values[Modes.LIGHT] | cpp_opacity}};
-{%-    endif %}
-{%-   endfor %}
-  }
-}
+SkAlpha GetOpacity(OpacityName opacity_name,
+                   bool is_dark_mode);
 {%- endif %}
 
-constexpr SkColor ResolveColor(ColorName color_name,
-                               bool is_dark_mode,
-                               bool use_debug_colors) {
-  switch (color_name) {
-{%- for obj in colors %}
-    case ColorName::{{obj.name | to_const_name}}:
-{%-   if obj.mode_values[Modes.DEBUG] %}
-      if (use_debug_colors)
-        return {{obj.mode_values[Modes.DEBUG] | cpp_color}};
+SkColor ResolveColor(ColorName color_name,
+                     bool is_dark_mode,
+                     bool use_debug_colors);
 
-{%-    endif %}
-{%-   if obj.mode_values[Modes.DARK] %}
-      if (is_dark_mode)
-        return {{obj.mode_values[Modes.DARK] | cpp_color}};
-
-{%-    endif %}
-      return {{obj.mode_values[Modes.LIGHT] | cpp_color}};
-{%-  endfor %}
-  }
-}
-
-constexpr char kDebugOverrideCssString[] = "html:not(body) {\n"
-{%- for obj in colors %}
-{%-   if obj.mode_values[Modes.DEBUG] %}
-    "  {{obj.name | to_css_var_name}}-rgb: {{obj.mode_values[Modes.DEBUG] | css_color_rgb}};\n"
-    "  {{obj.name | to_css_var_name}}: {{css_color_var(obj.name, obj.mode_values[Modes.DEBUG])}};\n"
-{%-    endif %}
-{%-  endfor %}
-    "}\n";
+extern char kDebugOverrideCssString[];
 
 }  // namespace {{namespace_name}}
 #endif  // {{header_guard}}
diff --git a/ui/lottie/animation.cc b/ui/lottie/animation.cc
index e500da9..edfab73 100644
--- a/ui/lottie/animation.cc
+++ b/ui/lottie/animation.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/check.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/trace_event/trace_event.h"
 #include "cc/paint/skottie_wrapper.h"
 #include "third_party/skia/include/core/SkBitmap.h"
@@ -41,8 +42,8 @@
   base::TimeDelta completed_cycles_duration =
       completed_cycles_ * cycle_duration_;
   if (progress_ >= completed_cycles_duration + cycle_duration_) {
-    completed_cycles_++;
-    completed_cycles_duration += cycle_duration_;
+    completed_cycles_ = base::ClampFloor(progress_ / cycle_duration_);
+    completed_cycles_duration = cycle_duration_ * completed_cycles_;
   }
 
   current_cycle_progress_ =
diff --git a/ui/lottie/animation_unittest.cc b/ui/lottie/animation_unittest.cc
index 3ff4750..712239ed 100644
--- a/ui/lottie/animation_unittest.cc
+++ b/ui/lottie/animation_unittest.cc
@@ -1053,4 +1053,22 @@
               FloatEq(kCanvasImageScale));
 }
 
+TEST_F(AnimationTest, HandlesTimeStepGreaterThanAnimationDuration) {
+  AdvanceClock(base::Milliseconds(300));
+
+  animation_->Start(Animation::Style::kLoop);
+
+  animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+
+  ASSERT_FLOAT_EQ(animation_->GetCurrentProgress(), 0);
+
+  AdvanceClock(kAnimationDuration / 2);
+  animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+  EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 0.5f);
+
+  AdvanceClock(kAnimationDuration * 5);
+  animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+  EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 0.5f);
+}
+
 }  // namespace lottie
diff --git a/ui/views/view.h b/ui/views/view.h
index bc6f04c..094f0c6d 100644
--- a/ui/views/view.h
+++ b/ui/views/view.h
@@ -621,6 +621,9 @@
   // Transformations -----------------------------------------------------------
 
   // Methods for setting transformations for a view (e.g. rotation, scaling).
+  // Care should be taken not to transform a view in such a way that its bounds
+  // lie outside those of its parent, or else the default ViewTargeterDelegate
+  // implementation will not pass mouse events to the view.
 
   gfx::Transform GetTransform() const;