diff --git a/.gn b/.gn
index c04e609..7ad6b3bc 100644
--- a/.gn
+++ b/.gn
@@ -508,6 +508,7 @@
   "//third_party/pystache/*",
   "//third_party/py_trace_event/*",
   "//third_party/pywebsocket/*",
+  "//third_party/pywebsocket3/*",
   "//third_party/qcms/*",
   "//third_party/quic_trace/*",
   "//third_party/qunit/*",
diff --git a/DEPS b/DEPS
index 91bbca18..aece20d 100644
--- a/DEPS
+++ b/DEPS
@@ -156,7 +156,7 @@
   # luci-go CIPD package version.
   # Make sure the revision is uploaded by infra-packagers builder.
   # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console
-  'luci_go': 'git_revision:02ba678a47594da180904851f3e6f809da7e0fc5',
+  'luci_go': 'git_revision:3d22d4e5a77a3d9cbe4b1bf5ed2fc85b61c1e3e6',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -175,7 +175,7 @@
   # 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': '35cb0b3a46979d30f2b863a8af4b556dead4414a',
+  'skia_revision': '93a2a6b8badbca9da7fe260431c4f745812d1336',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -187,7 +187,7 @@
   # 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': '9acaf662604246d482f735339ef7d1d03d268e67',
+  'angle_revision': '81cee994e1d2c2b839d3b24439b9f95db01a328f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -246,7 +246,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '9cabb00b326128d173167c3fa883c0e815813648',
+  'devtools_frontend_revision': '93731aec6bd28ad766db227981c78506f265c154',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -286,7 +286,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.
-  'spv_tools_revision': '044ecc0b2c65e840270fe57b9d72e0fa0c31b1e7',
+  'spv_tools_revision': '66a682b6a8f973ba79b0e250221d53a4fbd11f4c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -302,11 +302,11 @@
   # 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': '1d54767364a8a813b74667499cb5a9a4f9b4fda9',
+  'dawn_revision': 'e3f3e9a80d5f937470aacda7b810a88fc85e8b19',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'quiche_revision': 'c7e392d65eb927dc0c8a60f4a2f542a9b7a9b885',
+  'quiche_revision': 'c3316f30c075206c876096435de47add03d692a6',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -955,7 +955,7 @@
     Var('chromium_git') + '/codecs/libgav1.git' + '@' + 'fa1c3c4e673cf12ffa22b8fbe4a7c79314571f1b',
 
   'src/third_party/glslang/src':
-    Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + 'c6a4c6d3d8b5b85b93308336534adf9c1ef0ae66',
+    Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + 'aa95c80e1a89f3db3088dde85b0146fabd595be6',
 
   'src/third_party/google_toolbox_for_mac/src': {
       'url': Var('chromium_git') + '/external/github.com/google/google-toolbox-for-mac.git' + '@' + Var('google_toolbox_for_mac_revision'),
@@ -1250,7 +1250,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'da7fe17f810a6393bec1ed0ab78d1b4ca6de3452',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '0b1579a826afd538ce1ae6c9f56373430d6aa40b',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1454,7 +1454,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'ec18cc3262922e7dcdbe70243c6f40606f979144',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '5415e4d9aec4361c4bd5718e9b7b84551614f2d4',
+    Var('webrtc_git') + '/src.git' + '@' + '8e9fd4857e2eaf85986c135ce0a9f80999e8f5bd',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1529,7 +1529,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b26fbdde1b2dcf8575b5dc703e35a159d61fdc4d',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@9e85398565d3f2c59b67b3277d8b2beaaf4f5530',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/aw_browser_main_parts.cc b/android_webview/browser/aw_browser_main_parts.cc
index 757dc41..3fc4f11 100644
--- a/android_webview/browser/aw_browser_main_parts.cc
+++ b/android_webview/browser/aw_browser_main_parts.cc
@@ -24,6 +24,7 @@
 #include "base/android/build_info.h"
 #include "base/android/memory_pressure_listener_android.h"
 #include "base/base_paths_android.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index 0c91405a..c78890b72 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -42,6 +42,7 @@
 #include "base/base_paths_android.h"
 #include "base/base_switches.h"
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/feature_list.h"
 #include "base/files/scoped_file.h"
diff --git a/android_webview/browser/gfx/skia_output_surface_dependency_webview.cc b/android_webview/browser/gfx/skia_output_surface_dependency_webview.cc
index 32ed17e..f80986e 100644
--- a/android_webview/browser/gfx/skia_output_surface_dependency_webview.cc
+++ b/android_webview/browser/gfx/skia_output_surface_dependency_webview.cc
@@ -9,6 +9,7 @@
 #include "android_webview/browser/gfx/parent_output_surface.h"
 #include "android_webview/browser/gfx/task_forwarding_sequence.h"
 #include "android_webview/browser/gfx/task_queue_web_view.h"
+#include "base/callback_helpers.h"
 
 namespace android_webview {
 
diff --git a/android_webview/browser/safe_browsing/aw_safe_browsing_subresource_helper.cc b/android_webview/browser/safe_browsing/aw_safe_browsing_subresource_helper.cc
index f25261b..2036f3c 100644
--- a/android_webview/browser/safe_browsing/aw_safe_browsing_subresource_helper.cc
+++ b/android_webview/browser/safe_browsing/aw_safe_browsing_subresource_helper.cc
@@ -10,6 +10,7 @@
 #include "android_webview/browser/network_service/aw_web_resource_request.h"
 #include "android_webview/browser/safe_browsing/aw_safe_browsing_blocking_page.h"
 #include "android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.h"
+#include "base/memory/ptr_util.h"
 #include "components/security_interstitials/content/security_interstitial_tab_helper.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
diff --git a/android_webview/renderer/aw_url_loader_throttle_provider.cc b/android_webview/renderer/aw_url_loader_throttle_provider.cc
index e34b9e14..d9a2326b 100644
--- a/android_webview/renderer/aw_url_loader_throttle_provider.cc
+++ b/android_webview/renderer/aw_url_loader_throttle_provider.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "components/safe_browsing/content/renderer/renderer_url_loader_throttle.h"
 #include "components/safe_browsing/core/features.h"
 #include "content/public/common/content_features.h"
diff --git a/android_webview/renderer/aw_websocket_handshake_throttle_provider.cc b/android_webview/renderer/aw_websocket_handshake_throttle_provider.cc
index 9fae185..71b4525 100644
--- a/android_webview/renderer/aw_websocket_handshake_throttle_provider.cc
+++ b/android_webview/renderer/aw_websocket_handshake_throttle_provider.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "components/safe_browsing/content/renderer/websocket_sb_handshake_throttle.h"
 #include "components/safe_browsing/core/features.h"
 #include "content/public/common/content_features.h"
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc
index 2d173c8..6b4ee23 100644
--- a/ash/accelerators/accelerator_controller_impl.cc
+++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -79,6 +79,7 @@
 #include "ash/wm/window_util.h"
 #include "ash/wm/wm_event.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/json/json_reader.h"
diff --git a/ash/accessibility/accessibility_controller_impl.cc b/ash/accessibility/accessibility_controller_impl.cc
index 77292b0..00e5266 100644
--- a/ash/accessibility/accessibility_controller_impl.cc
+++ b/ash/accessibility/accessibility_controller_impl.cc
@@ -35,6 +35,7 @@
 #include "ash/system/power/scoped_backlights_forced_off.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/user_metrics.h"
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc
index 0567828..883b9f4 100644
--- a/ash/app_list/app_list_controller_impl.cc
+++ b/ash/app_list/app_list_controller_impl.cc
@@ -47,6 +47,8 @@
 #include "ash/wm/splitview/split_view_controller.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "ash/wm/window_state.h"
+#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
diff --git a/ash/app_list/app_list_presenter_impl.cc b/ash/app_list/app_list_presenter_impl.cc
index bbd539c..2ff52de 100644
--- a/ash/app_list/app_list_presenter_impl.cc
+++ b/ash/app_list/app_list_presenter_impl.cc
@@ -19,6 +19,7 @@
 #include "ash/public/cpp/shell_window_ids.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/optional.h"
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc
index 2b47d966d..8490629c 100644
--- a/ash/app_list/views/apps_grid_view.cc
+++ b/ash/app_list/views/apps_grid_view.cc
@@ -32,6 +32,7 @@
 #include "ash/public/cpp/app_list/app_list_switches.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/pagination/pagination_controller.h"
+#include "base/bind_helpers.h"
 #include "base/guid.h"
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/ash/app_list/views/horizontal_page_container.cc b/ash/app_list/views/horizontal_page_container.cc
index 6f7dcd0..b96688ca 100644
--- a/ash/app_list/views/horizontal_page_container.cc
+++ b/ash/app_list/views/horizontal_page_container.cc
@@ -13,6 +13,7 @@
 #include "ash/public/cpp/app_list/app_list_config.h"
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "ash/public/cpp/pagination/pagination_controller.h"
+#include "base/bind_helpers.h"
 #include "base/strings/utf_string_conversions.h"
 #include "ui/chromeos/search_box/search_box_constants.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
diff --git a/ash/autotest_private_api_utils.cc b/ash/autotest_private_api_utils.cc
index 245a48f..0c1b766 100644
--- a/ash/autotest_private_api_utils.cc
+++ b/ash/autotest_private_api_utils.cc
@@ -10,6 +10,7 @@
 #include "ash/shell.h"
 #include "ash/wm/mru_window_tracker.h"
 #include "ash/wm/tablet_mode/scoped_skip_user_session_blocked_check.h"
+#include "base/bind_helpers.h"
 
 namespace ash {
 namespace {
diff --git a/ash/home_screen/drag_window_from_shelf_controller.cc b/ash/home_screen/drag_window_from_shelf_controller.cc
index 739da24f..e300475 100644
--- a/ash/home_screen/drag_window_from_shelf_controller.cc
+++ b/ash/home_screen/drag_window_from_shelf_controller.cc
@@ -31,6 +31,7 @@
 #include "ash/wm/window_state.h"
 #include "ash/wm/window_transient_descendant_iterator.h"
 #include "ash/wm/window_util.h"
+#include "base/bind_helpers.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/numerics/ranges.h"
 #include "ui/aura/window_tree_host.h"
diff --git a/ash/home_screen/swipe_home_to_overview_controller.cc b/ash/home_screen/swipe_home_to_overview_controller.cc
index 5c15d7f..d2d2e965 100644
--- a/ash/home_screen/swipe_home_to_overview_controller.cc
+++ b/ash/home_screen/swipe_home_to_overview_controller.cc
@@ -14,6 +14,7 @@
 #include "ash/shell.h"
 #include "ash/wm/overview/overview_controller.h"
 #include "ash/wm/overview/overview_session.h"
+#include "base/bind_helpers.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/numerics/ranges.h"
 #include "base/optional.h"
diff --git a/ash/login/ui/login_auth_user_view.cc b/ash/login/ui/login_auth_user_view.cc
index 56066cd..b2647e6 100644
--- a/ash/login/ui/login_auth_user_view.cc
+++ b/ash/login/ui/login_auth_user_view.cc
@@ -31,6 +31,7 @@
 #include "ash/wallpaper/wallpaper_controller_impl.h"
 #include "base/bind.h"
 #include "base/i18n/time_formatting.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/timer/timer.h"
 #include "components/user_manager/user.h"
diff --git a/ash/login/ui/note_action_launch_button_unittest.cc b/ash/login/ui/note_action_launch_button_unittest.cc
index df179ea..c90cd3ac 100644
--- a/ash/login/ui/note_action_launch_button_unittest.cc
+++ b/ash/login/ui/note_action_launch_button_unittest.cc
@@ -13,6 +13,7 @@
 #include "ash/shell.h"
 #include "ash/tray_action/test_tray_action_client.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/time/time.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/gfx/geometry/point.h"
diff --git a/ash/login/ui/pin_request_view.h b/ash/login/ui/pin_request_view.h
index 2d060010..c1d8eed3 100644
--- a/ash/login/ui/pin_request_view.h
+++ b/ash/login/ui/pin_request_view.h
@@ -11,6 +11,7 @@
 #include "ash/public/cpp/login_types.h"
 #include "ash/public/cpp/tablet_mode_observer.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
diff --git a/ash/login/ui/pin_request_view_unittest.cc b/ash/login/ui/pin_request_view_unittest.cc
index 0f9fa33..b9a69ed 100644
--- a/ash/login/ui/pin_request_view_unittest.cc
+++ b/ash/login/ui/pin_request_view_unittest.cc
@@ -23,6 +23,7 @@
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "ash/wm/work_area_insets.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/optional.h"
 #include "base/test/bind_test_util.h"
diff --git a/ash/media/media_notification_controller_impl.cc b/ash/media/media_notification_controller_impl.cc
index 59f0660..53323b7 100644
--- a/ash/media/media_notification_controller_impl.cc
+++ b/ash/media/media_notification_controller_impl.cc
@@ -12,6 +12,7 @@
 #include "ash/shell.h"
 #include "ash/shell_delegate.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/stl_util.h"
 #include "components/media_message_center/media_notification_util.h"
 #include "services/media_session/public/mojom/media_session_service.mojom.h"
diff --git a/ash/public/cpp/presentation_time_recorder.cc b/ash/public/cpp/presentation_time_recorder.cc
index e6545483..abf2f8b 100644
--- a/ash/public/cpp/presentation_time_recorder.cc
+++ b/ash/public/cpp/presentation_time_recorder.cc
@@ -7,6 +7,7 @@
 #include <ostream>
 
 #include "base/callback.h"
+#include "base/memory/ptr_util.h"
 #include "ui/gfx/presentation_feedback.h"
 
 namespace ash {
diff --git a/ash/public/cpp/session/user_info.h b/ash/public/cpp/session/user_info.h
index c1eabe02..6570c175 100644
--- a/ash/public/cpp/session/user_info.h
+++ b/ash/public/cpp/session/user_info.h
@@ -11,7 +11,6 @@
 #include <vector>
 
 #include "ash/public/cpp/ash_public_export.h"
-#include "ash/public/cpp/session/user_info.h"
 #include "base/optional.h"
 #include "base/token.h"
 #include "components/account_id/account_id.h"
diff --git a/ash/shell/content/test/ash_content_test.cc b/ash/shell/content/test/ash_content_test.cc
index 27d654e5..5a52a744 100644
--- a/ash/shell/content/test/ash_content_test.cc
+++ b/ash/shell/content/test/ash_content_test.cc
@@ -15,6 +15,7 @@
 #include "ash/wm/mru_window_tracker.h"
 #include "base/auto_reset.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
diff --git a/ash/system/network/tray_network_state_model.cc b/ash/system/network/tray_network_state_model.cc
index 5eaf2a6c..28b3fd1 100644
--- a/ash/system/network/tray_network_state_model.cc
+++ b/ash/system/network/tray_network_state_model.cc
@@ -10,6 +10,7 @@
 #include "ash/public/cpp/network_config_service.h"
 #include "ash/system/network/vpn_list.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/location.h"
 #include "chromeos/services/network_config/public/cpp/cros_network_config_util.h"
 #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
diff --git a/ash/system/power/power_prefs_unittest.cc b/ash/system/power/power_prefs_unittest.cc
index 0498c77..1d5bc34 100644
--- a/ash/system/power/power_prefs_unittest.cc
+++ b/ash/system/power/power_prefs_unittest.cc
@@ -15,6 +15,7 @@
 #include "ash/session/test_session_controller_client.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
+#include "base/bind_helpers.h"
 #include "base/json/json_reader.h"
 #include "base/macros.h"
 #include "base/test/simple_test_tick_clock.h"
diff --git a/ash/wallpaper/wallpaper_controller_impl.cc b/ash/wallpaper/wallpaper_controller_impl.cc
index c90f5f7..50cfa28 100644
--- a/ash/wallpaper/wallpaper_controller_impl.cc
+++ b/ash/wallpaper/wallpaper_controller_impl.cc
@@ -34,6 +34,7 @@
 #include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
diff --git a/ash/wm/overview/overview_item.cc b/ash/wm/overview/overview_item.cc
index 0b3eb53..b0f015e 100644
--- a/ash/wm/overview/overview_item.cc
+++ b/ash/wm/overview/overview_item.cc
@@ -38,6 +38,7 @@
 #include "ash/wm/wm_event.h"
 #include "base/auto_reset.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/metrics/user_metrics.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/aura/client/aura_constants.h"
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc
index 273737f..d00824c2 100644
--- a/ash/wm/splitview/split_view_controller_unittest.cc
+++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -52,6 +52,7 @@
 #include "ash/wm/window_state_delegate.h"
 #include "ash/wm/window_util.h"
 #include "ash/wm/wm_event.h"
+#include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
diff --git a/ash/wm/workspace/multi_window_resize_controller_unittest.cc b/ash/wm/workspace/multi_window_resize_controller_unittest.cc
index cce94e2..00e68cf3 100644
--- a/ash/wm/workspace/multi_window_resize_controller_unittest.cc
+++ b/ash/wm/workspace/multi_window_resize_controller_unittest.cc
@@ -18,6 +18,7 @@
 #include "ash/wm/workspace/workspace_event_handler_test_helper.h"
 #include "ash/wm/workspace_controller.h"
 #include "ash/wm/workspace_controller_test_api.h"
+#include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/test/test_window_delegate.h"
diff --git a/base/android/java/src/org/chromium/base/library_loader/ProcessInitException.java b/base/android/java/src/org/chromium/base/library_loader/ProcessInitException.java
index 3f83a44..f19f951 100644
--- a/base/android/java/src/org/chromium/base/library_loader/ProcessInitException.java
+++ b/base/android/java/src/org/chromium/base/library_loader/ProcessInitException.java
@@ -17,9 +17,9 @@
 
     /**
      * @param errorCode This will be one of the LoaderErrors error codes.
-     * @param throwable The wrapped throwable obj.
+     * @param failureCause The wrapped Throwable obj.
      */
-    public ProcessInitException(@LoaderErrors int errorCode, Throwable throwable) {
-        super("errorCode=" + errorCode, throwable);
+    public ProcessInitException(@LoaderErrors int errorCode, Throwable failureCause) {
+        super("errorCode=" + errorCode, failureCause);
     }
 }
diff --git a/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc b/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
index f19cbea..0de47b1 100644
--- a/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
+++ b/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
@@ -5,6 +5,7 @@
 #include "base/task/sequence_manager/thread_controller_with_message_pump_impl.h"
 
 #include "base/auto_reset.h"
+#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_pump.h"
 #include "base/threading/hang_watcher.h"
 #include "base/time/tick_clock.h"
diff --git a/base/task_runner_util.h b/base/task_runner_util.h
index 26e771f..79e86a3 100644
--- a/base/task_runner_util.h
+++ b/base/task_runner_util.h
@@ -14,11 +14,6 @@
 #include "base/post_task_and_reply_with_result_internal.h"
 #include "base/task_runner.h"
 
-// TODO: Remove these unused includes after fixing IWYU usage in
-// affected files.
-#include "base/bind_helpers.h"
-#include "base/callback_helpers.h"
-
 namespace base {
 
 // When you have these methods
diff --git a/build/toolchain/win/BUILD.gn b/build/toolchain/win/BUILD.gn
index 75a48a3..21ed68b 100644
--- a/build/toolchain/win/BUILD.gn
+++ b/build/toolchain/win/BUILD.gn
@@ -185,6 +185,16 @@
       coverage_wrapper = ""
     }
 
+    if (toolchain_args.is_clang) {
+      # This flag omits system includes from /showIncludes output, to reduce the
+      # amount of data to parse and store in .ninja_deps. We do this on non-Windows too,
+      # and already make sure rebuilds after win sdk / libc++ / clang header updates happen via
+      # changing commandline flags.
+      show_includes = "/showIncludes:user"
+    } else {
+      show_includes = "/showIncludes"
+    }
+
     tool("cc") {
       precompiled_header_type = "msvc"
       pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb"
@@ -196,7 +206,7 @@
       description = "CC {{output}}"
       outputs = [ "$object_subdir/{{source_name_part}}.obj" ]
 
-      command = "$coverage_wrapper$env_wrapper$cl /nologo /showIncludes $sys_include_flags{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
+      command = "$coverage_wrapper$env_wrapper$cl /nologo $show_includes $sys_include_flags{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
     }
 
     tool("cxx") {
@@ -210,7 +220,7 @@
       description = "CXX {{output}}"
       outputs = [ "$object_subdir/{{source_name_part}}.obj" ]
 
-      command = "$coverage_wrapper$env_wrapper$cl /nologo /showIncludes $sys_include_flags{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
+      command = "$coverage_wrapper$env_wrapper$cl /nologo $show_includes $sys_include_flags{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
     }
 
     tool("rc") {
diff --git a/cc/input/scrollbar_animation_controller.cc b/cc/input/scrollbar_animation_controller.cc
index 60d7ecb..2435aa1 100644
--- a/cc/input/scrollbar_animation_controller.cc
+++ b/cc/input/scrollbar_animation_controller.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/numerics/ranges.h"
 #include "base/time/time.h"
 #include "cc/trees/layer_tree_impl.h"
diff --git a/cc/layers/painted_overlay_scrollbar_layer_impl.cc b/cc/layers/painted_overlay_scrollbar_layer_impl.cc
index 3a865b2..ba485239 100644
--- a/cc/layers/painted_overlay_scrollbar_layer_impl.cc
+++ b/cc/layers/painted_overlay_scrollbar_layer_impl.cc
@@ -4,6 +4,7 @@
 
 #include "cc/layers/painted_overlay_scrollbar_layer_impl.h"
 
+#include "base/memory/ptr_util.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "components/viz/common/quads/solid_color_draw_quad.h"
 #include "components/viz/common/quads/texture_draw_quad.h"
diff --git a/cc/layers/render_surface_unittest.cc b/cc/layers/render_surface_unittest.cc
index f3f53072..30e41c9 100644
--- a/cc/layers/render_surface_unittest.cc
+++ b/cc/layers/render_surface_unittest.cc
@@ -21,6 +21,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/transform.h"
 
+#include "base/memory/ptr_util.h"
 #include "cc/test/fake_raster_source.h"
 
 namespace cc {
diff --git a/cc/metrics/frame_sequence_tracker.cc b/cc/metrics/frame_sequence_tracker.cc
index cd9f70cb..2c76232 100644
--- a/cc/metrics/frame_sequence_tracker.cc
+++ b/cc/metrics/frame_sequence_tracker.cc
@@ -4,6 +4,7 @@
 
 #include "cc/metrics/frame_sequence_tracker.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
diff --git a/cc/test/push_properties_counting_layer_impl.cc b/cc/test/push_properties_counting_layer_impl.cc
index 13659b4..3bfe7a9 100644
--- a/cc/test/push_properties_counting_layer_impl.cc
+++ b/cc/test/push_properties_counting_layer_impl.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "cc/test/push_properties_counting_layer_impl.h"
+#include "base/memory/ptr_util.h"
 
 namespace cc {
 
diff --git a/cc/trees/damage_tracker_unittest.cc b/cc/trees/damage_tracker_unittest.cc
index a1c7002..86d46336 100644
--- a/cc/trees/damage_tracker_unittest.cc
+++ b/cc/trees/damage_tracker_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <stddef.h>
 
+#include "base/memory/ptr_util.h"
 #include "cc/base/math_util.h"
 #include "cc/layers/layer_impl.h"
 #include "cc/paint/filter_operation.h"
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index 11e1b3d..708d155 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -18,6 +18,7 @@
 #include "base/command_line.h"
 #include "base/containers/adapters.h"
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/numerics/safe_math.h"
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 73c7ae9..7beb8473 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -385,6 +385,8 @@
     "//third_party/android_deps:com_android_support_preference_v7_java",
     "//third_party/android_deps:com_android_support_recyclerview_v7_java",
     "//third_party/android_deps:com_android_support_support_compat_java",
+
+    # TODO(bjoyce): Change to Androidx after fragment has been converted.
     "//third_party/android_deps:com_android_support_viewpager_java",
     "//third_party/android_deps:com_google_dagger_dagger_java",
     "//third_party/android_deps:com_google_guava_listenablefuture_java",
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingCoordinatorTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingCoordinatorTest.java
index 72e4463e..24d9186 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingCoordinatorTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingCoordinatorTest.java
@@ -39,11 +39,11 @@
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.chrome.autofill_assistant.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayCoordinator;
 import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayModel;
 import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayState;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java
index b837b7f..2fab2e05 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java
@@ -26,11 +26,11 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantActionsCarouselCoordinator;
 import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantCarouselModel;
 import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAutostartTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAutostartTest.java
index f6a96ed..3d476207 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAutostartTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAutostartTest.java
@@ -19,7 +19,6 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipType;
@@ -28,6 +27,7 @@
 import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto.PresentationProto;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 import java.util.Collections;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantBottomsheetTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantBottomsheetTest.java
index e422eb0b..10f3bc5e 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantBottomsheetTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantBottomsheetTest.java
@@ -54,7 +54,6 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.autofill_assistant.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipIcon;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto;
@@ -78,6 +77,7 @@
 import org.chromium.chrome.browser.autofill_assistant.proto.UserFormSectionProto;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.Criteria;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataIntegrationTest.java
index 6b79139..0a2daf1 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataIntegrationTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataIntegrationTest.java
@@ -53,7 +53,6 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.autofill_assistant.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.autofill_assistant.carousel.ButtonView;
 import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
@@ -88,6 +87,7 @@
 import org.chromium.chrome.browser.autofill_assistant.proto.VisibilityRequirement;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.WebContents;
 
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 defb58d..3bc9f4e 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
@@ -51,7 +51,6 @@
 import org.chromium.base.LocaleUtils;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.autofill_assistant.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.autofill_assistant.AutofillAssistantCollectUserDataTestHelper.ViewHolder;
 import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue;
@@ -68,6 +67,7 @@
 import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantTextInputSection.TextInputFactory;
 import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantTextInputType;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.AutofillAddress;
 import org.chromium.chrome.browser.payments.AutofillContact;
 import org.chromium.chrome.browser.payments.AutofillPaymentInstrument;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDetailsUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDetailsUiTest.java
index 0f2705f..a3df00cc 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDetailsUiTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDetailsUiTest.java
@@ -39,11 +39,11 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.autofill_assistant.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.details.AssistantDetails;
 import org.chromium.chrome.browser.autofill_assistant.details.AssistantDetailsCoordinator;
 import org.chromium.chrome.browser.autofill_assistant.details.AssistantDetailsModel;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 /** Tests for the Autofill Assistant details. */
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandlerTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandlerTest.java
index 3d6002c..4151acb 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandlerTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandlerTest.java
@@ -32,11 +32,11 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.autofill_assistant.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.directactions.DirectActionHandler;
 import org.chromium.chrome.browser.directactions.DirectActionReporter;
 import org.chromium.chrome.browser.directactions.DirectActionReporter.Type;
 import org.chromium.chrome.browser.directactions.FakeDirectActionReporter;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantFormActionTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantFormActionTest.java
index 7f23b2ad..e78c2724 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantFormActionTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantFormActionTest.java
@@ -54,7 +54,6 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.chrome.autofill_assistant.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipType;
@@ -75,6 +74,7 @@
 import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto.PresentationProto;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 import java.util.ArrayList;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java
index e196068..edeafa2 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java
@@ -38,7 +38,6 @@
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.autofill_assistant.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.BooleanAndProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.BooleanList;
@@ -87,6 +86,7 @@
 import org.chromium.chrome.browser.autofill_assistant.proto.ViewProto;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 import java.util.ArrayList;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantHeaderUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantHeaderUiTest.java
index 3f50e85..56838b7 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantHeaderUiTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantHeaderUiTest.java
@@ -40,7 +40,6 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.autofill_assistant.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip;
 import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip.Icon;
 import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderCoordinator;
@@ -48,6 +47,7 @@
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.browser_ui.widget.MaterialProgressBar;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInfoBoxUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInfoBoxUiTest.java
index df2589b9..eeae888 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInfoBoxUiTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInfoBoxUiTest.java
@@ -27,11 +27,11 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.autofill_assistant.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBox;
 import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBoxCoordinator;
 import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBoxModel;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayIntegrationTest.java
index 5a0b600..45e0858f 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayIntegrationTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayIntegrationTest.java
@@ -26,7 +26,6 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ElementAreaProto;
@@ -38,6 +37,7 @@
 import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto.PresentationProto;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.WebContents;
 
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java
index a30a5ba..21f809c 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java
@@ -34,13 +34,13 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayCoordinator;
 import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayImage;
 import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayModel;
 import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayState;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.test.util.TestCallbackHelperContainer;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java
index 744354f3..fde7a1e5 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java
@@ -49,7 +49,6 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.autofill_assistant.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.CollectUserDataProto;
@@ -62,6 +61,7 @@
 import org.chromium.chrome.browser.autofill_assistant.proto.UseAddressProto.RequiredField;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.WebContents;
 
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTextUtilsTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTextUtilsTest.java
index a68f30a1..f67bdbd 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTextUtilsTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTextUtilsTest.java
@@ -28,8 +28,8 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 /** Tests for {@code AssistantTextUtils}. */
diff --git a/chrome/android/features/keyboard_accessory/internal/BUILD.gn b/chrome/android/features/keyboard_accessory/internal/BUILD.gn
index 3b03fe6..f96c9367 100644
--- a/chrome/android/features/keyboard_accessory/internal/BUILD.gn
+++ b/chrome/android/features/keyboard_accessory/internal/BUILD.gn
@@ -26,6 +26,9 @@
     "//content/public/android:content_java",
     "//third_party/android_deps:android_support_v7_appcompat_java",
     "//third_party/android_deps:com_android_support_recyclerview_v7_java",
+
+    # TODO(bjoyce): Migrate to androidx after clearbrowsingdatatabsfragment has
+    # been converted to androidx.
     "//third_party/android_deps:com_android_support_viewpager_java",
     "//third_party/android_deps:com_google_android_material_material_java",
     "//ui/android:ui_java",
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
index 13c1d92b..94d1f32f 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
@@ -7,12 +7,12 @@
 import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SKIP_CLOSING_ANIMATION;
 import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
 
-import android.support.v4.view.ViewPager;
 import android.view.ViewStub;
 
 import androidx.annotation.Nullable;
 import androidx.annotation.Px;
 import androidx.annotation.VisibleForTesting;
+import androidx.viewpager.widget.ViewPager;
 
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessoryPagerAdapter.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessoryPagerAdapter.java
index c1f95e0..a4d7802 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessoryPagerAdapter.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessoryPagerAdapter.java
@@ -4,14 +4,14 @@
 
 package org.chromium.chrome.browser.keyboard_accessory.sheet_component;
 
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.ViewPager;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.viewpager.widget.PagerAdapter;
+import androidx.viewpager.widget.ViewPager;
 
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Tab;
 import org.chromium.ui.modelutil.ListModel;
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java
index c49b2cd4..84c61d2 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java
@@ -12,14 +12,14 @@
 import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.TOP_SHADOW_VISIBLE;
 import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
 
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.ViewPager;
 import android.support.v7.widget.RecyclerView;
 import android.view.ViewStub;
 
 import androidx.annotation.Nullable;
 import androidx.annotation.Px;
 import androidx.annotation.VisibleForTesting;
+import androidx.viewpager.widget.PagerAdapter;
+import androidx.viewpager.widget.ViewPager;
 
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.ui.DeferredViewStubInflationProvider;
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator.java
index e0888a3..d8c8feb 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator.java
@@ -11,12 +11,12 @@
 import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.TOP_SHADOW_VISIBLE;
 import static org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetProperties.VISIBLE;
 
-import android.support.v4.view.ViewPager;
 import android.support.v7.widget.RecyclerView;
 
 import androidx.annotation.Nullable;
 import androidx.annotation.Px;
 import androidx.annotation.VisibleForTesting;
+import androidx.viewpager.widget.ViewPager;
 
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.ui.modelutil.PropertyKey;
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetProperties.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetProperties.java
index 4a7cabe..99042ad 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetProperties.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetProperties.java
@@ -4,7 +4,7 @@
 
 package org.chromium.chrome.browser.keyboard_accessory.sheet_component;
 
-import android.support.v4.view.ViewPager;
+import androidx.viewpager.widget.ViewPager;
 
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Tab;
 import org.chromium.ui.modelutil.ListModel;
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetView.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetView.java
index 6d1e303..16448d2 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetView.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetView.java
@@ -7,13 +7,14 @@
 import static org.chromium.ui.base.LocalizationUtils.isLayoutRtl;
 
 import android.content.Context;
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.ViewPager;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 
+import androidx.viewpager.widget.PagerAdapter;
+import androidx.viewpager.widget.ViewPager;
+
 import org.chromium.chrome.browser.keyboard_accessory.R;
 
 /**
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/NoSwipeViewPager.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/NoSwipeViewPager.java
index 7da3bd2e..e906133 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/NoSwipeViewPager.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/NoSwipeViewPager.java
@@ -5,12 +5,12 @@
 package org.chromium.chrome.browser.keyboard_accessory.sheet_component;
 
 import android.content.Context;
-import android.support.v4.view.ViewPager;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.viewpager.widget.ViewPager;
 
 /**
  * This ViewPager disables all animations - swipes and smooth transitions.
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java
index b5998c7..32db0e8 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java
@@ -8,9 +8,8 @@
 import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TABS;
 import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TAB_SELECTION_CALLBACKS;
 
-import android.support.v4.view.ViewPager;
-
 import androidx.annotation.VisibleForTesting;
+import androidx.viewpager.widget.ViewPager;
 
 import com.google.android.material.tabs.TabLayout;
 
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java
index 754023f..7153278 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java
@@ -8,10 +8,9 @@
 import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TABS;
 import static org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TAB_SELECTION_CALLBACKS;
 
-import android.support.v4.view.ViewPager;
-
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
+import androidx.viewpager.widget.ViewPager;
 
 import com.google.android.material.tabs.TabLayout;
 
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java
index f56f563..988d557 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java
@@ -32,9 +32,9 @@
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeWindow;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingIntegrationTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingIntegrationTest.java
index 08e574e7..78de66d 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingIntegrationTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingIntegrationTest.java
@@ -38,8 +38,8 @@
 import org.chromium.base.task.PostTask;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBarIdentifier;
 import org.chromium.chrome.browser.infobar.SimpleConfirmInfoBarBuilder;
 import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingUiCaptureTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingUiCaptureTest.java
index f57a24b..bcfa671 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingUiCaptureTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingUiCaptureTest.java
@@ -26,8 +26,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.test.ScreenShooter;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/PasswordGenerationIntegrationTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/PasswordGenerationIntegrationTest.java
index 177afaa..17345f0 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/PasswordGenerationIntegrationTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/PasswordGenerationIntegrationTest.java
@@ -29,7 +29,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.IntegrationTest;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.sync.SyncTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java
index 6e0fced1..91d61d4 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java
@@ -49,9 +49,9 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.keyboard_accessory.R;
 import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.AutofillBarItem;
 import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java
index f95478e..f9f813b 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java
@@ -41,8 +41,8 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.keyboard_accessory.R;
 import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
 import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.TabLayoutBarItem;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewTest.java
index 2db6cbb..b316ca4 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewTest.java
@@ -39,7 +39,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
 import org.chromium.chrome.browser.keyboard_accessory.R;
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Tab;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java
index 690e8bf..27ffb7e 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java
@@ -24,7 +24,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
 import org.chromium.chrome.browser.keyboard_accessory.R;
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessoryIntegrationTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessoryIntegrationTest.java
index dddecba..020098ee 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessoryIntegrationTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessoryIntegrationTest.java
@@ -37,11 +37,11 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeWindow;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.keyboard_accessory.FakeKeyboard;
 import org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper;
 import org.chromium.chrome.browser.keyboard_accessory.R;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetViewTest.java
index b7c28d7..5ac8265 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetViewTest.java
@@ -26,7 +26,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
 import org.chromium.chrome.browser.keyboard_accessory.R;
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessoryIntegrationTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessoryIntegrationTest.java
index 3cafded..071cc7e 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessoryIntegrationTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessoryIntegrationTest.java
@@ -37,11 +37,11 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeWindow;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.keyboard_accessory.FakeKeyboard;
 import org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper;
 import org.chromium.chrome.browser.keyboard_accessory.R;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetViewTest.java
index f72b2447..8002d83 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetViewTest.java
@@ -26,7 +26,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
 import org.chromium.chrome.browser.keyboard_accessory.R;
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java
index 0fbd590..0002deac 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java
@@ -30,7 +30,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.keyboard_accessory.ManualFillingTestHelper;
 import org.chromium.chrome.browser.keyboard_accessory.R;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java
index 393b1370..ec5e4a4d 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java
@@ -25,7 +25,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
 import org.chromium.chrome.browser.keyboard_accessory.R;
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java
index d1c207bd..b75650c3 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java
@@ -27,7 +27,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
 import org.chromium.chrome.browser.keyboard_accessory.R;
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java
index 3c87af2..4bfea0f 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java
@@ -23,7 +23,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
 import org.chromium.chrome.browser.keyboard_accessory.R;
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
diff --git a/chrome/android/features/media_router/javatests/src/org/chromium/chrome/browser/media/router/MediaRouterIntegrationTest.java b/chrome/android/features/media_router/javatests/src/org/chromium/chrome/browser/media/router/MediaRouterIntegrationTest.java
index d9cce2e..71ce2620 100644
--- a/chrome/android/features/media_router/javatests/src/org/chromium/chrome/browser/media/router/MediaRouterIntegrationTest.java
+++ b/chrome/android/features/media_router/javatests/src/org/chromium/chrome/browser/media/router/MediaRouterIntegrationTest.java
@@ -25,7 +25,7 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.media.RouterTestUtils;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinderTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinderTest.java
index c887b2e..73e1f44 100644
--- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinderTest.java
+++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinderTest.java
@@ -26,8 +26,8 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.feed.FeedSurfaceCoordinator;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java
index 6b6eb02b..212b8d4 100644
--- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java
+++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java
@@ -33,12 +33,12 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.EnormousTest;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.compositor.animation.CompositorAnimator;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabFeatureUtilities;
 import org.chromium.chrome.browser.tab.TabSelectionType;
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
index 70673c2..aa1328d 100644
--- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
+++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
@@ -45,6 +45,7 @@
 import android.support.test.espresso.Espresso;
 import android.support.test.espresso.NoMatchingViewException;
 import android.support.test.espresso.ViewAssertion;
+import android.support.test.espresso.contrib.AccessibilityChecks;
 import android.support.test.espresso.contrib.RecyclerViewActions;
 import android.support.test.filters.MediumTest;
 import android.support.v7.widget.GridLayoutManager;
@@ -70,12 +71,12 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabFeatureUtilities;
@@ -154,6 +155,7 @@
 
     @Before
     public void setUp() {
+        AccessibilityChecks.enable();
         // After setUp, Chrome is launched and has one NTP.
         CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
 
@@ -1377,6 +1379,27 @@
         }
     }
 
+    @Test
+    @MediumTest
+    // clang-format off
+    @CommandLineFlags.Add({BASE_PARAMS})
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID,
+            ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
+    public void testCloseTabViaCloseButton() throws Exception {
+        // clang-format on
+        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
+
+        // Restart Chrome to have Group.
+        ApplicationTestUtils.finishActivity(mActivityTestRule.getActivity());
+        mActivityTestRule.startMainActivityFromLauncher();
+        mActivityTestRule.getActivity().getSnackbarManager().disableForTesting();
+        prepareTabs(1, 0, null);
+        enterGTSWithThumbnailChecking();
+
+        onView(allOf(withId(R.id.action_button), withParent(withId(R.id.content_view))))
+                .perform(click());
+    }
+
     private static class TabCountAssertion implements ViewAssertion {
         private int mExpectedCount;
 
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
index b250c612..e7b6920 100644
--- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
+++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
@@ -41,11 +41,11 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.OverviewModeState;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_grid_message_card_item.xml b/chrome/android/features/tab_ui/java/res/layout/tab_grid_message_card_item.xml
index a8253a08..dd76583 100644
--- a/chrome/android/features/tab_ui/java/res/layout/tab_grid_message_card_item.xml
+++ b/chrome/android/features/tab_ui/java/res/layout/tab_grid_message_card_item.xml
@@ -37,9 +37,8 @@
         android:layout_gravity="center"/>
     <org.chromium.ui.widget.ChromeImageView
         android:id="@+id/close_button"
-        android:layout_width="0dp"
+        android:layout_width="48dp"
         android:layout_height="match_parent"
-        android:layout_weight="1"
         style="@style/BottomToolbarButton"
         android:contentDescription="@string/close"
         android:tint="@color/default_icon_color" />
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
index 673886d2..3a28abc 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
@@ -101,7 +101,10 @@
             @Nullable PropertyKey propertyKey) {
         if (TabProperties.TITLE == propertyKey) {
             String title = model.get(TabProperties.TITLE);
-            ((TextView) view.fastFindViewById(R.id.tab_title)).setText(title);
+            TextView tabTitleView = (TextView) view.fastFindViewById(R.id.tab_title);
+            tabTitleView.setText(title);
+            tabTitleView.setContentDescription(
+                    view.getResources().getString(R.string.accessibility_tabstrip_tab, title));
         } else if (TabProperties.IS_SELECTED == propertyKey) {
             int selectedTabBackground =
                     model.get(TabProperties.SELECTED_TAB_BACKGROUND_DRAWABLE_ID);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
index 3957faa..48875b17 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -160,6 +160,14 @@
          * @return {@link Pair} that contains previous and target position of this action.
          */
         Pair<Integer, Integer> getPositionsOfReorderAction(View view, int action);
+
+        /**
+         * This method returns whether the given action is a type of the reordering actions.
+         *
+         * @param action The accessibility action.
+         * @return Whether the given action is a reordering action.
+         */
+        boolean isReorderAction(int action);
     }
 
     /**
@@ -1103,6 +1111,10 @@
 
             @Override
             public boolean performAccessibilityAction(View host, int action, Bundle args) {
+                if (!helper.isReorderAction(action)) {
+                    return super.performAccessibilityAction(host, action, args);
+                }
+
                 Pair<Integer, Integer> positions = helper.getPositionsOfReorderAction(host, action);
                 int currentPosition = positions.first;
                 int targetPosition = positions.second;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java
index afcd673..0755c73 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java
@@ -539,4 +539,10 @@
         }
         return new Pair<>(currentPosition, targetPosition);
     }
+
+    @Override
+    public boolean isReorderAction(int action) {
+        return action == R.id.move_tab_left || action == R.id.move_tab_right
+                || action == R.id.move_tab_up || action == R.id.move_tab_down;
+    }
 }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java
index 1f22267..ec19e9c 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java
@@ -41,11 +41,11 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.features.start_surface.StartSurfaceLayout;
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
index 1ee2069..94e05bf4 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
@@ -64,11 +64,11 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter;
 import org.chromium.chrome.features.start_surface.StartSurfaceLayout;
 import org.chromium.chrome.tab_ui.R;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java
index a8c03c3..95544f32 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java
@@ -38,11 +38,11 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.features.start_surface.StartSurfaceLayout;
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiTest.java
index d518123..d7bcee9 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiTest.java
@@ -43,11 +43,11 @@
 import org.chromium.base.test.util.CloseableOnMainThread;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.fullscreen.FullscreenManagerTestUtils;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.toolbar.bottom.BottomToolbarVariationManager;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java
index e96ce94..8cce250 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java
@@ -33,11 +33,11 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.features.start_surface.StartSurfaceLayout;
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java
index b968659..95859098 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java
@@ -16,9 +16,9 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
index 0fd5b69c..cb342de4 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
@@ -34,11 +34,11 @@
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.toolbar.IncognitoToggleTabLayout;
 import org.chromium.chrome.features.start_surface.StartSurfaceLayout;
 import org.chromium.chrome.tab_ui.R;
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
index 9f91865..df2ef8fc 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.tasks.tab_management;
 
+import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.ACTION_CLICK;
+
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.not;
@@ -1576,6 +1578,7 @@
         doReturn(new Pair<>(1, 0))
                 .when(mTabGridAccessibilityHelper)
                 .getPositionsOfReorderAction(mItemView1, action);
+        doReturn(true).when(mTabGridAccessibilityHelper).isReorderAction(action);
         assertNull(mMediator.getAccessibilityDelegateForTesting());
         mMediator.setupAccessibilityDelegate(mTabGridAccessibilityHelper);
         View.AccessibilityDelegate delegate = mMediator.getAccessibilityDelegateForTesting();
@@ -1589,6 +1592,28 @@
 
     @Test
     @Features.EnableFeatures({TAB_GROUPS_CONTINUATION_ANDROID})
+    public void testPerformAccessibilityAction_defaultAccessibilityAction() {
+        setUpForTabGroupOperation(TabListMediatorType.TAB_SWITCHER);
+        assertThat(mModel.get(0).model.get(TabProperties.TAB_ID), equalTo(TAB1_ID));
+        assertThat(mModel.get(1).model.get(TabProperties.TAB_ID), equalTo(TAB2_ID));
+
+        // Setup related mocks and initialize needed components.
+        Bundle args = mock(Bundle.class);
+        int action = ACTION_CLICK;
+        // Mock that the action indicates that tab2 will move to position 2 which is invalid.
+        doReturn(false).when(mTabGridAccessibilityHelper).isReorderAction(action);
+        assertNull(mMediator.getAccessibilityDelegateForTesting());
+        mMediator.setupAccessibilityDelegate(mTabGridAccessibilityHelper);
+        View.AccessibilityDelegate delegate = mMediator.getAccessibilityDelegateForTesting();
+        assertNotNull(delegate);
+
+        delegate.performAccessibilityAction(mItemView1, action, args);
+        verify(mTabGridAccessibilityHelper, never())
+                .getPositionsOfReorderAction(mItemView1, action);
+    }
+
+    @Test
+    @Features.EnableFeatures({TAB_GROUPS_CONTINUATION_ANDROID})
     public void testPerformAccessibilityAction_InvalidIndex() {
         setUpForTabGroupOperation(TabListMediatorType.TAB_SWITCHER);
         assertThat(mModel.get(0).model.get(TabProperties.TAB_ID), equalTo(TAB1_ID));
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java
index 4aa9db3..fb5e5b91 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java
@@ -22,8 +22,8 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.testing.local.LocalRobolectricTestRunner;
 
diff --git a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedAppLifecycleTest.java b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedAppLifecycleTest.java
index aecea783..c401bd6 100644
--- a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedAppLifecycleTest.java
+++ b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedAppLifecycleTest.java
@@ -28,7 +28,6 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.DeferredStartupHandler;
 import org.chromium.chrome.browser.feed.FeedAppLifecycle.AppLifecycleEvent;
@@ -37,6 +36,7 @@
 import org.chromium.chrome.browser.feed.library.hostimpl.storage.testing.InMemoryContentStorage;
 import org.chromium.chrome.browser.feed.library.hostimpl.storage.testing.InMemoryJournalStorage;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.multiwindow.MultiWindowTestHelper;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
diff --git a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedNewTabPageCardRenderTest.java b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedNewTabPageCardRenderTest.java
index 51c7dcb..13f4108 100644
--- a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedNewTabPageCardRenderTest.java
+++ b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedNewTabPageCardRenderTest.java
@@ -24,9 +24,9 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.IntegrationTest;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.ntp.snippets.SectionHeader;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
diff --git a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedNewTabPageTest.java b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedNewTabPageTest.java
index abd89b1..5af0fb8 100644
--- a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedNewTabPageTest.java
+++ b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedNewTabPageTest.java
@@ -41,8 +41,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.ntp.cards.SignInPromo;
 import org.chromium.chrome.browser.ntp.snippets.SectionHeader;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
diff --git a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedRefreshTaskTest.java b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedRefreshTaskTest.java
index 04580245..c4c96943 100644
--- a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedRefreshTaskTest.java
+++ b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/FeedRefreshTaskTest.java
@@ -14,8 +14,8 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.browser.Features;
diff --git a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/tooltip/FeedTooltipTest.java b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/tooltip/FeedTooltipTest.java
index f144bfa..276b44e 100644
--- a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/tooltip/FeedTooltipTest.java
+++ b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/tooltip/FeedTooltipTest.java
@@ -31,11 +31,11 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.feed.FeedNewTabPage;
 import org.chromium.chrome.browser.feed.FeedProcessScopeFactory;
 import org.chromium.chrome.browser.feed.library.api.client.stream.Stream;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index 8e54ae60..d648e93 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -83,6 +83,7 @@
 import org.chromium.chrome.browser.flags.ActivityType;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSessionState;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.gsa.ContextReporter;
 import org.chromium.chrome.browser.gsa.GSAAccountChangeListener;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java
index 29d15117..c671b19 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java
@@ -404,7 +404,7 @@
             }
 
             @Override
-            protected void onFailure() {
+            protected void onFailure(Exception failureCause) {
                 // Ignore failure. Problems with the variation seed can be ignored, and other
                 // problems will either recover or be repeated when Chrome is started synchronously.
                 latch.countDown();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java
index e305340..3294412 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java
@@ -17,6 +17,7 @@
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 
 import java.lang.reflect.Field;
 import java.util.ArrayList;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index 292e0d7..ac4f0a5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -79,6 +79,7 @@
 import org.chromium.chrome.browser.flags.ActivityType;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.gesturenav.NavigationSheet;
 import org.chromium.chrome.browser.gesturenav.TabbedSheetDelegate;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java
index ed24838e..b0e6fcd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java
@@ -37,6 +37,7 @@
 import org.chromium.chrome.browser.customtabs.PaymentHandlerActivity;
 import org.chromium.chrome.browser.customtabs.SeparateTaskCustomTabActivity;
 import org.chromium.chrome.browser.firstrun.FirstRunFlowSequencer;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.instantapps.InstantAppsHandler;
 import org.chromium.chrome.browser.metrics.MediaNotificationUma;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java
index 4ebaa39..4ed052e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -27,7 +27,6 @@
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ActivityTabProvider;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.banners.AppBannerManager;
 import org.chromium.chrome.browser.bookmarks.BookmarkBridge;
@@ -36,6 +35,7 @@
 import org.chromium.chrome.browser.download.DownloadUtils;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.incognito.IncognitoUtils;
 import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher;
 import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeNativeBackgroundTaskDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeNativeBackgroundTaskDelegate.java
index 0776178..a73fc30e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeNativeBackgroundTaskDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeNativeBackgroundTaskDelegate.java
@@ -39,7 +39,7 @@
                 return serviceManagerOnlyMode;
             }
             @Override
-            public void onStartupFailure() {
+            public void onStartupFailure(Exception failureCause) {
                 PostTask.postTask(UiThreadTaskTraits.DEFAULT, onFailure);
             }
         };
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java
index 921b0fe..97ffbd7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java
@@ -26,8 +26,8 @@
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.task.PostTask;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.IntentHandler;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.content_public.browser.BrowserStartupController;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataTabsFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataTabsFragment.java
index f8484f8eb..501aea2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataTabsFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataTabsFragment.java
@@ -14,6 +14,7 @@
 import android.support.v4.app.FragmentPagerAdapter;
 import android.support.v4.text.TextUtilsCompat;
 import android.support.v4.view.ViewCompat;
+// TODO(bjoyce): Need to convert viewpager after fragmentpageradatper.
 import android.support.v4.view.ViewPager;
 import android.view.LayoutInflater;
 import android.view.Menu;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
index b9cee37..e306a5fa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
@@ -32,10 +32,10 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.BooleanCachedFieldTrialParameter;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
index 18c07c1..508ab1db 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
@@ -11,8 +11,8 @@
 
 import org.chromium.base.CommandLine;
 import org.chromium.base.SysUtils;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.components.variations.VariationsAssociatedData;
 
 import java.lang.annotation.Retention;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIncognitoManager.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIncognitoManager.java
index 208c0ed..fc4db2b3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIncognitoManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIncognitoManager.java
@@ -9,11 +9,11 @@
 
 import org.chromium.base.CommandLine;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
 import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController;
 import org.chromium.chrome.browser.dependency_injection.ActivityScope;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.incognito.IncognitoTabHost;
 import org.chromium.chrome.browser.incognito.IncognitoTabHostRegistry;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/device/DeviceClassManager.java b/chrome/android/java/src/org/chromium/chrome/browser/device/DeviceClassManager.java
index de5749be..6fc173c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/device/DeviceClassManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/device/DeviceClassManager.java
@@ -5,9 +5,10 @@
 package org.chromium.chrome.browser.device;
 
 import org.chromium.base.CommandLine;
+import org.chromium.base.ContextUtils;
 import org.chromium.base.SysUtils;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.util.AccessibilityUtil;
@@ -44,9 +45,7 @@
         // Device based configurations.
         if (SysUtils.isLowEndDevice()) {
             mEnableLayerDecorationCache = true;
-            mEnableAccessibilityLayout =
-                    !ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID)
-                    || !ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_GROUPS_ANDROID);
+            mEnableAccessibilityLayout = true;
             mEnableAnimations = false;
             mEnablePrerendering = false;
             mEnableToolbarSwipe = false;
@@ -87,6 +86,15 @@
      * @return Whether or not should use the accessibility tab switcher.
      */
     public static boolean enableAccessibilityLayout() {
+        if (isPhone()
+                && ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID)
+                && (ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_GROUPS_ANDROID)
+                        || (!SysUtils.isLowEndDevice()
+                                && ChromeFeatureList.isEnabled(
+                                        ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID)))) {
+            return false;
+        }
+
         if (getInstance().mEnableAccessibilityLayout) return true;
         if (!AccessibilityUtil.isAccessibilityEnabled()) return false;
         return SharedPreferencesManager.getInstance().readBoolean(
@@ -123,4 +131,9 @@
     public static boolean enableToolbarSwipe() {
         return getInstance().mEnableToolbarSwipe;
     }
+
+    private static boolean isPhone() {
+        return !DeviceFormFactor.isNonMultiDisplayContextOnTablet(
+                ContextUtils.getApplicationContext());
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
index f85d6eb..d2defe0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
@@ -17,11 +17,11 @@
 import org.chromium.base.SysUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider;
 import org.chromium.chrome.browser.document.ChromeLauncherActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.infobar.ReaderModeInfoBar;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtils.java
index 53fbbca0..5e36035 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtils.java
@@ -24,7 +24,7 @@
 import org.chromium.base.StrictModeContext;
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.browser.AppHooks;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
 
 /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegate.java
index 87cb2574b..bcbebfa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegate.java
@@ -111,6 +111,15 @@
     /** Adds the package name of a specialized intent handler. */
     void maybeRecordAppHandlersInIntent(Intent intent, List<ResolveInfo> info);
 
+    /** Records the pending referrer if desired. */
+    void maybeSetPendingReferrer(Intent intent, @NonNull String referrerUrl);
+
+    /**
+     * Records the pending incognito URL if desired. Called only if the
+     * navigation is occurring in the context of incognito mode.
+     */
+    void maybeSetPendingIncognitoUrl(Intent intent);
+
     /**
      * Determine if the Chrome app is in the foreground.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
index 0d16e8d..6339289 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
@@ -588,6 +588,16 @@
     }
 
     @Override
+    public void maybeSetPendingReferrer(Intent intent, String referrerUrl) {
+        IntentHandler.setPendingReferrer(intent, referrerUrl);
+    }
+
+    @Override
+    public void maybeSetPendingIncognitoUrl(Intent intent) {
+        IntentHandler.setPendingIncognitoUrl(intent);
+    }
+
+    @Override
     public boolean isSerpReferrer() {
         // TODO (thildebr): Investigate whether or not we can use getLastCommittedUrl() instead of
         // the NavigationController.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
index 9774708..961fe25 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
@@ -26,7 +26,6 @@
 import org.chromium.base.Log;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
-import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.instantapps.InstantAppsHandler;
 import org.chromium.chrome.browser.tab.TabRedirectHandler;
@@ -671,10 +670,10 @@
         mDelegate.maybeRecordAppHandlersInIntent(targetIntent, resolvingInfos);
 
         if (params.getReferrerUrl() != null) {
-            IntentHandler.setPendingReferrer(targetIntent, params.getReferrerUrl());
+            mDelegate.maybeSetPendingReferrer(targetIntent, params.getReferrerUrl());
         }
 
-        if (params.isIncognito()) IntentHandler.setPendingIncognitoUrl(targetIntent);
+        if (params.isIncognito()) mDelegate.maybeSetPendingIncognitoUrl(targetIntent);
 
         if (shouldProxyForInstantApps) {
             RecordHistogram.recordEnumeratedHistogram("Android.InstantApps.DirectInstantAppsIntent",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
index 2fe5f65..27eed4f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
@@ -18,10 +18,10 @@
 import org.chromium.base.CommandLine;
 import org.chromium.base.IntentUtils;
 import org.chromium.base.Log;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.locale.LocaleManager;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
 import org.chromium.chrome.browser.services.AndroidChildAccountHelper;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunStatus.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunStatus.java
index d3c8776..b1724c4c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunStatus.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunStatus.java
@@ -5,7 +5,7 @@
 package org.chromium.chrome.browser.firstrun;
 
 import org.chromium.base.CommandLine;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunViewPager.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunViewPager.java
index 8d79c6089..fae14e86 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunViewPager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunViewPager.java
@@ -5,6 +5,8 @@
 package org.chromium.chrome.browser.firstrun;
 
 import android.content.Context;
+// TODO(bjoyce): Need to convert fragment in FirstRunActivity.java before this
+// can be converted to Androidx.
 import android.support.v4.view.ViewPager;
 import android.view.MotionEvent;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserStateBrowserControlsVisibilityDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserStateBrowserControlsVisibilityDelegate.java
index 1ab4d73..5796d1d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserStateBrowserControlsVisibilityDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserStateBrowserControlsVisibilityDelegate.java
@@ -12,7 +12,7 @@
 import org.chromium.base.CommandLine;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.Supplier;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.components.browser_ui.util.BrowserControlsVisibilityDelegate;
 import org.chromium.content_public.common.BrowserControlsState;
 import org.chromium.ui.util.TokenHolder;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitTaskRunner.java b/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitTaskRunner.java
index eb989c7..1b2f9de 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitTaskRunner.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitTaskRunner.java
@@ -30,12 +30,14 @@
  * - Fetching the variations seed on first run
  */
 public abstract class AsyncInitTaskRunner {
-    private boolean mFetchingVariations;
-    private boolean mLibraryLoaded;
     private boolean mAllocateChildConnection;
 
     private FetchSeedTask mFetchSeedTask;
 
+    // Barrier counter to determine when all tasks have completed and are
+    // successful. -1 indicates "terminal state".
+    private int mNumPendingSuccesses;
+
     @VisibleForTesting
     boolean shouldFetchVariationsSeedDuringFirstRun() {
         return ChromeVersionInfo.isOfficialBuild();
@@ -50,7 +52,6 @@
         private final String mRestrictMode;
         private final String mMilestone;
         private final String mChannel;
-        private boolean mShouldRun = true;
 
         public FetchSeedTask(String restrictMode) {
             mRestrictMode = restrictMode;
@@ -64,21 +65,11 @@
             PostTask.postTask(UiThreadTaskTraits.BOOTSTRAP, new Runnable() {
                 @Override
                 public void run() {
-                    if (!shouldRun()) return;
-                    mFetchingVariations = false;
-                    tasksPossiblyComplete(true);
+                    tasksPossiblyComplete(null);
                 }
             });
         }
 
-        public synchronized void cancel() {
-            mShouldRun = false;
-        }
-
-        private synchronized boolean shouldRun() {
-            return mShouldRun;
-        }
-
         private String getChannelString() {
             if (ChromeVersionInfo.isCanaryBuild()) {
                 return "canary";
@@ -106,7 +97,7 @@
     public void startBackgroundTasks(boolean allocateChildConnection, boolean fetchVariationSeed) {
         ThreadUtils.assertOnUiThread();
         if (fetchVariationSeed && shouldFetchVariationsSeedDuringFirstRun()) {
-            mFetchingVariations = true;
+            ++mNumPendingSuccesses;
 
             // Fetching variations restrict mode requires AccountManagerFacade to be initialized.
             ProcessInitializationHandler.getInstance().initializePreNative();
@@ -130,21 +121,19 @@
         // Load the library on a background thread. Using a plain Thread instead of AsyncTask
         // because the latter would be throttled, and this task is on the critical path of the
         // browser initialization.
+        ++mNumPendingSuccesses;
         getTaskPerThreadExecutor().execute(() -> {
-            final boolean libraryLoaded = loadNativeLibrary();
-            ThreadUtils.postOnUiThread(() -> {
-                mLibraryLoaded = libraryLoaded;
-                tasksPossiblyComplete(mLibraryLoaded);
-            });
+            final ProcessInitException libraryLoadException = loadNativeLibrary();
+            ThreadUtils.postOnUiThread(() -> { tasksPossiblyComplete(libraryLoadException); });
         });
     }
 
     /**
      * Loads the native library. Can be run on any thread.
      *
-     * @return true iff loading succeeded.
+     * @return null if loading succeeds, or ProcessInitException if loading fails.
      */
-    private boolean loadNativeLibrary() {
+    private ProcessInitException loadNativeLibrary() {
         try {
             LibraryLoader.getInstance().ensureInitialized();
             // The prefetch is done after the library load for two reasons:
@@ -159,27 +148,39 @@
             // For experimental results, see http://crbug.com/460438.
             prefetchLibrary();
         } catch (ProcessInitException e) {
-            return false;
+            return e;
         }
-        return true;
+        return null;
     }
 
-    private void tasksPossiblyComplete(boolean result) {
+    private void tasksPossiblyComplete(Exception failureCause) {
         ThreadUtils.assertOnUiThread();
 
-        if (!result) {
-            if (mFetchSeedTask != null) mFetchSeedTask.cancel();
-            onFailure();
+        if (mNumPendingSuccesses < 0) {
+            // Terminal state: Have called onSuccess() or onFailure(). Tasks that complete after
+            // onFailure() was triggered by a previous failure would arrive here for no-op.
+            return;
         }
 
-        if (mLibraryLoaded && !mFetchingVariations) {
-            if (CachedFeatureFlags.isNetworkServiceWarmUpEnabled()) {
-                ChildProcessLauncherHelper.warmUp(ContextUtils.getApplicationContext(), false);
+        if (failureCause == null) {
+            // Task succeeded.
+            --mNumPendingSuccesses;
+            if (mNumPendingSuccesses == 0) {
+                // All tasks succeeded: Finish tasks, call onSuccess(), and reach terminal state.
+                if (CachedFeatureFlags.isNetworkServiceWarmUpEnabled()) {
+                    ChildProcessLauncherHelper.warmUp(ContextUtils.getApplicationContext(), false);
+                }
+                if (mAllocateChildConnection) {
+                    ChildProcessLauncherHelper.warmUp(ContextUtils.getApplicationContext(), true);
+                }
+                onSuccess();
+                mNumPendingSuccesses = -1;
             }
-            if (mAllocateChildConnection) {
-                ChildProcessLauncherHelper.warmUp(ContextUtils.getApplicationContext(), true);
-            }
-            onSuccess();
+
+        } else {
+            // Task failed: Call onFailure(), and reach terminal state.
+            onFailure(failureCause);
+            mNumPendingSuccesses = -1;
         }
     }
 
@@ -195,6 +196,7 @@
 
     /**
      * Handle failed completion of the Async initialization tasks.
+     * @param failureCause The Exception from the original failure.
      */
-    protected abstract void onFailure();
+    protected abstract void onFailure(Exception failureCause);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
index 9879e08..7c0e78f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
@@ -247,8 +247,8 @@
 
     @CallSuper
     @Override
-    public void onStartupFailure() {
-        throw new ProcessInitException(LoaderErrors.NATIVE_STARTUP_FAILED);
+    public void onStartupFailure(Exception failureCause) {
+        throw new ProcessInitException(LoaderErrors.NATIVE_STARTUP_FAILED, failureCause);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/BrowserParts.java b/chrome/android/java/src/org/chromium/chrome/browser/init/BrowserParts.java
index b3bbe944..9641c42b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/BrowserParts.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/BrowserParts.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.init;
 
+import androidx.annotation.Nullable;
+
 /**
  * Interface that any {@link AsyncInitializationActivity} can use to interact with this delegate
  * during start up. Functions called by
@@ -70,8 +72,9 @@
     /**
      * Called during {@link ChromeBrowserInitializer#handlePostNativeStartup(BrowserParts)} if
      * there was an error during startup.
+     * @param failureCause The Exception from the original failure.
      */
-    void onStartupFailure();
+    void onStartupFailure(@Nullable Exception failureCause);
 
     /**
      * @return Whether the activity this delegate represents has been destroyed or is in the
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeActivityNativeDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeActivityNativeDelegate.java
index ee83345e..b90e8ee 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeActivityNativeDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeActivityNativeDelegate.java
@@ -6,6 +6,8 @@
 
 import android.content.Intent;
 
+import androidx.annotation.Nullable;
+
 /**
  * An activity level delegate to handle native initialization and activity lifecycle related tasks
  * that depend on native code. The lifecycle callbacks defined here are called synchronously with
@@ -68,6 +70,7 @@
 
     /**
      * Called when any failure about the initialization occurs.
+     * @param failureCause The Exception from the original failure.
      */
-    void onStartupFailure();
+    void onStartupFailure(@Nullable Exception failureCause);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
index 12f260c3..f80bd3b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
@@ -321,7 +321,7 @@
                     new BrowserStartupController.StartupCallback() {
                         @Override
                         public void onFailure() {
-                            delegate.onStartupFailure();
+                            delegate.onStartupFailure(null);
                         }
 
                         @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/EmptyBrowserParts.java b/chrome/android/java/src/org/chromium/chrome/browser/init/EmptyBrowserParts.java
index a87cdce..f842b915 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/EmptyBrowserParts.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/EmptyBrowserParts.java
@@ -39,8 +39,7 @@
     }
 
     @Override
-    public void onStartupFailure() {
-    }
+    public void onStartupFailure(Exception failureCause) {}
 
     @Override
     public boolean isActivityFinishingOrDestroyed() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/NativeInitializationController.java b/chrome/android/java/src/org/chromium/chrome/browser/init/NativeInitializationController.java
index d10640ce2..2bf817e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/NativeInitializationController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/NativeInitializationController.java
@@ -10,8 +10,8 @@
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.library_loader.LibraryLoader;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.firstrun.FirstRunFlowSequencer;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -92,11 +92,11 @@
             }
 
             @Override
-            protected void onFailure() {
+            protected void onFailure(Exception failureCause) {
                 // Initialization has failed, call onStartup failure to abandon the activity.
                 // This is not expected to return, so there is no need to set
                 // mBackgroundTasksComplete or do any other tidying up.
-                mActivityDelegate.onStartupFailure();
+                mActivityDelegate.onStartupFailure(failureCause);
             }
 
         }.startBackgroundTasks(allocateChildConnection, fetchVariationsSeed);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
index 1c1d607..8f9434a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
@@ -22,8 +22,8 @@
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.AppHooks;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java
index 0dc7052..52df01f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java
@@ -20,8 +20,8 @@
 import org.chromium.base.CommandLine;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.supplier.ObservableSupplier;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.Destroyable;
 import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateProviderHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateProviderHolder.java
index 0ad1f7f9..0b958de0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateProviderHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateProviderHolder.java
@@ -11,7 +11,7 @@
 
 import org.chromium.base.CommandLine;
 import org.chromium.chrome.browser.ChromeBaseAppCompatActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 
 /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateConfigs.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateConfigs.java
index 81ea1d94f..c690db2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateConfigs.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateConfigs.java
@@ -15,8 +15,8 @@
 import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.omaha.UpdateStatusProvider.UpdateState;
 import org.chromium.chrome.browser.omaha.inline.FakeAppUpdateManagerWrapper;
 import org.chromium.components.variations.VariationsAssociatedData;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
index 690fd49..34fb65992 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -35,9 +35,9 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ActivityTabProvider;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.WindowDelegate;
 import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.gsa.GSAState;
 import org.chromium.chrome.browser.locale.LocaleManager;
 import org.chromium.chrome.browser.native_page.NativePageFactory;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java b/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java
index 1390289..8c2763d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java
@@ -21,8 +21,8 @@
 import org.chromium.base.task.AsyncTask;
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.browser.AppHooks;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeVersionInfo;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.ntp.NewTabPage;
 import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksReader;
 import org.chromium.components.embedder_support.util.UrlConstants;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/AccountsChangedReceiver.java b/chrome/android/java/src/org/chromium/chrome/browser/services/AccountsChangedReceiver.java
index 0c32863..cfeb0ca 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/services/AccountsChangedReceiver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/services/AccountsChangedReceiver.java
@@ -71,7 +71,7 @@
             }
 
             @Override
-            public void onStartupFailure() {
+            public void onStartupFailure(Exception failureCause) {
                 // Startup failed. So notify SigninHelper of changed accounts via
                 // shared prefs.
                 SigninPreferencesManager.getInstance().markAccountsChangedPref();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java
index a4b113a..a7723d7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java
@@ -14,8 +14,8 @@
 import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.device.DeviceClassManager;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.survey.SurveyController;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivity.java
index 136975421..91dc4d2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivity.java
@@ -113,7 +113,7 @@
                 ManageSpaceActivity.this.finishNativeInitialization();
             }
             @Override
-            public void onStartupFailure() {
+            public void onStartupFailure(Exception failureCause) {
                 mSiteDataSizeText.setText(R.string.storage_management_startup_failure);
                 mUnimportantSiteDataSizeText.setText(R.string.storage_management_startup_failure);
             }
@@ -128,7 +128,7 @@
             String failedVersion = SharedPreferencesManager.getInstance().readString(
                     ChromePreferenceKeys.SETTINGS_WEBSITE_FAILED_BUILD_VERSION, null);
             if (TextUtils.equals(failedVersion, productVersion)) {
-                parts.onStartupFailure();
+                parts.onStartupFailure(null);
                 return;
             }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java b/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java
index 5551218..819f8b7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java
@@ -18,9 +18,9 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeVersionInfo;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.infobar.InfoBarIdentifier;
 import org.chromium.chrome.browser.infobar.SurveyInfoBar;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/ChromeWebApkHost.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/ChromeWebApkHost.java
index 15bab74..857da19 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/ChromeWebApkHost.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/ChromeWebApkHost.java
@@ -4,7 +4,7 @@
 
 package org.chromium.chrome.browser.webapps;
 
-import static org.chromium.chrome.browser.ChromeSwitches.SKIP_WEBAPK_VERIFICATION;
+import static org.chromium.chrome.browser.flags.ChromeSwitches.SKIP_WEBAPK_VERIFICATION;
 
 import org.chromium.base.ApplicationState;
 import org.chromium.base.ApplicationStatus;
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 7e165b6..4a655947 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
@@ -18,9 +18,9 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.dependency_injection.ActivityScope;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.Destroyable;
 import org.chromium.chrome.browser.metrics.WebApkUma;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkVersionManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkVersionManager.java
index 94af630..b8dbdf5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkVersionManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkVersionManager.java
@@ -13,7 +13,7 @@
 import org.chromium.base.FileUtils;
 import org.chromium.base.StrictModeContext;
 import org.chromium.base.ThreadUtils;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.webapk.lib.client.DexOptimizer;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java
index 4097aef7..9d8fec7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java
@@ -23,6 +23,7 @@
 import org.chromium.chrome.browser.ActivityTabProvider.ActivityTabTabObserver;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabSelectionType;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/AudioTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/AudioTest.java
index d1123807..1264d0b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/AudioTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/AudioTest.java
@@ -15,6 +15,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.FlakyTest;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeActivityTest.java
index 59bcbb24..946133c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeActivityTest.java
@@ -18,6 +18,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.device.DeviceClassManager;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.TabImpl;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.tabmodel.ChromeTabCreator;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ContentViewFocusTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ContentViewFocusTest.java
index 48d1e8e..70e59dd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ContentViewFocusTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ContentViewFocusTest.java
@@ -24,6 +24,7 @@
 import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeHandler;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.ScrollDirection;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java
index 786da3e..379da823 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java
@@ -21,6 +21,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.blink.mojom.WebPage;
 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ChromeTabUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ExampleUiCaptureTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ExampleUiCaptureTest.java
index e541989d..80971cd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ExampleUiCaptureTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ExampleUiCaptureTest.java
@@ -14,6 +14,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.test.ScreenShooter;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/FeaturesAnnotationsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/FeaturesAnnotationsTest.java
index 28a6277..0df066f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/FeaturesAnnotationsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/FeaturesAnnotationsTest.java
@@ -16,6 +16,7 @@
 
 import org.chromium.base.CommandLine;
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.Features;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/FocusedEditableTextFieldZoomTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/FocusedEditableTextFieldZoomTest.java
index cc9a0e9..b349aefe 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/FocusedEditableTextFieldZoomTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/FocusedEditableTextFieldZoomTest.java
@@ -18,6 +18,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/HTTPSTabsOpenedFromExternalAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/HTTPSTabsOpenedFromExternalAppTest.java
index d8cc178..95bdf78 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/HTTPSTabsOpenedFromExternalAppTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/HTTPSTabsOpenedFromExternalAppTest.java
@@ -16,6 +16,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.net.test.EmbeddedTestServer;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/InstalledAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/InstalledAppTest.java
index fdbde50c..34df16d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/InstalledAppTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/InstalledAppTest.java
@@ -17,6 +17,7 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/InstantStartTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/InstantStartTest.java
index 9e967c1d..0ccec00 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/InstantStartTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/InstantStartTest.java
@@ -19,6 +19,7 @@
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.browser.Features;
@@ -34,7 +35,7 @@
  * Integration tests of Instant Start which requires 2-stage initialization for Clank startup.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({org.chromium.chrome.browser.ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 public class InstantStartTest {
     private Bitmap mBitmap;
     private int mThumbnailFetchCount;
@@ -92,7 +93,7 @@
      */
     @Test
     @SmallTest
-    @CommandLineFlags.Add(org.chromium.chrome.browser.ChromeSwitches.DISABLE_NATIVE_INITIALIZATION)
+    @CommandLineFlags.Add(ChromeSwitches.DISABLE_NATIVE_INITIALIZATION)
     public void fetchThumbnailsPreNativeTest() {
         int tabId = 0;
         mThumbnailFetchCount = 0;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/JavaScriptEvalChromeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/JavaScriptEvalChromeTest.java
index 70a6eace..dd439670 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/JavaScriptEvalChromeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/JavaScriptEvalChromeTest.java
@@ -18,6 +18,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/MainActivityWithURLTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/MainActivityWithURLTest.java
index 752244d..63f9da6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/MainActivityWithURLTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/MainActivityWithURLTest.java
@@ -15,6 +15,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java
index 4c725f59..7d5b685 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java
@@ -27,6 +27,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.omnibox.LocationBarLayout;
 import org.chromium.chrome.browser.omnibox.UrlBar;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/NavigationPopupTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/NavigationPopupTest.java
index db40887..7a8b5f41 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/NavigationPopupTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/NavigationPopupTest.java
@@ -25,6 +25,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/PopularUrlsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/PopularUrlsTest.java
index bbbdcf8..a6198fc 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/PopularUrlsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/PopularUrlsTest.java
@@ -19,6 +19,7 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Manual;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/PopupTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/PopupTest.java
index 171928ed..b15c6e799 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/PopupTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/PopupTest.java
@@ -20,6 +20,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBar;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.infobar.InfoBarIdentifier;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/PowerBroadcastReceiverTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/PowerBroadcastReceiverTest.java
index 734a7ce..d240e499 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/PowerBroadcastReceiverTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/PowerBroadcastReceiverTest.java
@@ -20,6 +20,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.RetryOnFailure;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ApplicationTestUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/PrerenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/PrerenderTest.java
index 709a75e..24a1d04 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/PrerenderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/PrerenderTest.java
@@ -23,6 +23,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.Restriction;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.prerender.ExternalPrerenderHandler;
 import org.chromium.chrome.browser.prerender.PrerenderTestHelper;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ProcessIsolationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ProcessIsolationTest.java
index 6fc9a7c..d01393fc 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ProcessIsolationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ProcessIsolationTest.java
@@ -18,6 +18,7 @@
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ReachedCodeProfilerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ReachedCodeProfilerTest.java
index e622619..a52eb14 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ReachedCodeProfilerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ReachedCodeProfilerTest.java
@@ -16,6 +16,7 @@
 import org.chromium.base.test.ReachedCodeProfiler;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/RestoreHistogramTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/RestoreHistogramTest.java
index 603a6397..45b9db2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/RestoreHistogramTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/RestoreHistogramTest.java
@@ -15,6 +15,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.MetricsUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/SafeBrowsingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/SafeBrowsingTest.java
index 74a31a1..10528ea 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/SafeBrowsingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/SafeBrowsingTest.java
@@ -14,6 +14,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/SelectFileDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/SelectFileDialogTest.java
index 1896534e..8ba540d2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/SelectFileDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/SelectFileDialogTest.java
@@ -22,6 +22,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.WebContents;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ShareIntentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ShareIntentTest.java
index b8211a28..89bca6b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ShareIntentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ShareIntentTest.java
@@ -24,6 +24,7 @@
 import org.chromium.base.task.TaskTraits;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.share.ShareDelegate;
 import org.chromium.chrome.browser.share.ShareDelegateImpl;
 import org.chromium.chrome.browser.share.ShareHelper;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/SmartClipProviderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/SmartClipProviderTest.java
index de2911df..db53bd1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/SmartClipProviderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/SmartClipProviderTest.java
@@ -30,6 +30,7 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.WebContents;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabCountLabelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabCountLabelTest.java
index 788d04a..7f19272 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabCountLabelTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabCountLabelTest.java
@@ -19,6 +19,7 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.toolbar.TabSwitcherDrawable;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabObserverTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabObserverTest.java
index 7c40dbf..79851bb 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabObserverTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabObserverTest.java
@@ -19,6 +19,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java
index 6fc7990..7f924d4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java
@@ -18,6 +18,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabThemeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabThemeTest.java
index e084d86..df606ac 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabThemeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabThemeTest.java
@@ -18,6 +18,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabThemeColorHelper;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java
index 9f48f08..5e57ca8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java
@@ -30,6 +30,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModelUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java
index f9540596..5abb7a48 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java
@@ -53,6 +53,7 @@
 import org.chromium.chrome.browser.compositor.layouts.phone.StackLayout;
 import org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack;
 import org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabLaunchType;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/UrlSchemeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/UrlSchemeTest.java
index fbd45df1..2a4daa9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/UrlSchemeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/UrlSchemeTest.java
@@ -22,6 +22,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.TestFileUtil;
 import org.chromium.base.test.util.UrlUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.TestContentProvider;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/VideoFullscreenOrientationLockChromeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/VideoFullscreenOrientationLockChromeTest.java
index ed5a8f2..24dfd86 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/VideoFullscreenOrientationLockChromeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/VideoFullscreenOrientationLockChromeTest.java
@@ -19,6 +19,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.UrlUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.media.MediaViewerUtils;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayoutTest.java
index 738745b..755c597 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayoutTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayoutTest.java
@@ -26,8 +26,8 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutTab;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
 import org.chromium.chrome.browser.tabmodel.TabModel;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java
index fc287d44..b01be5d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java
@@ -17,7 +17,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
 import org.chromium.chrome.browser.ui.appmenu.AppMenuTestSupport;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/OverviewAppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/OverviewAppMenuTest.java
index bfc953a..71b0a89 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/OverviewAppMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/OverviewAppMenuTest.java
@@ -22,9 +22,9 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.ui.appmenu.AppMenuTestSupport;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/TabbedAppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/TabbedAppMenuTest.java
index 8906c9c..1350d1c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/TabbedAppMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/TabbedAppMenuTest.java
@@ -27,10 +27,10 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler;
 import org.chromium.chrome.browser.ui.appmenu.AppMenuTestSupport;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java
index 426a800..5151738 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java
@@ -29,9 +29,9 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.Features;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupWithKeyboardTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupWithKeyboardTest.java
index 4c07d5ac..884d65e4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupWithKeyboardTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupWithKeyboardTest.java
@@ -19,9 +19,9 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.Features;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java
index 024848f..e4914e1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java
@@ -17,7 +17,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.autofill.AutofillDelegate;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillUpstreamTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillUpstreamTest.java
index d82635f0..6ddf428 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillUpstreamTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillUpstreamTest.java
@@ -19,7 +19,7 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.AutofillSaveCardInfoBar;
 import org.chromium.chrome.browser.infobar.InfoBar;
 import org.chromium.chrome.browser.infobar.InfoBarLayout;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/background_sync/BackgroundSyncTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/background_sync/BackgroundSyncTest.java
index 20301ce..aeaaab2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/background_sync/BackgroundSyncTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/background_sync/BackgroundSyncTest.java
@@ -19,9 +19,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.background_sync.BackgroundSyncBackgroundTaskScheduler.BackgroundSyncTask;
 import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/background_sync/PeriodicBackgroundSyncTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/background_sync/PeriodicBackgroundSyncTest.java
index 8a22560..a9ed45e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/background_sync/PeriodicBackgroundSyncTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/background_sync/PeriodicBackgroundSyncTest.java
@@ -19,10 +19,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.background_sync.BackgroundSyncBackgroundTaskScheduler.BackgroundSyncTask;
 import org.chromium.chrome.browser.engagement.SiteEngagementService;
 import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java
index 56fd2f0e..295bdb38 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java
@@ -39,12 +39,12 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
 import org.chromium.chrome.browser.engagement.SiteEngagementService;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBar;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.infobar.InfoBarContainer.InfoBarAnimationListener;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java
index ed2f603..e59f2089 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java
@@ -26,8 +26,8 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.signin.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.SigninPromoController;
 import org.chromium.chrome.browser.sync.SyncTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java
index 067bb86e..f1a23938 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java
@@ -32,7 +32,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.signin.SigninActivityLauncher;
 import org.chromium.chrome.browser.sync.SyncTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkReorderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkReorderTest.java
index cb590f0..3714394 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkReorderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkReorderTest.java
@@ -29,10 +29,10 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserver;
 import org.chromium.chrome.browser.bookmarks.BookmarkPromoHeader.PromoState;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.night_mode.ChromeNightModeTestUtils;
 import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
 import org.chromium.chrome.test.util.browser.Features;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java
index 01be408..9af36bf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java
@@ -35,9 +35,9 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.night_mode.ChromeNightModeTestUtils;
 import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksShim;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/OriginVerifierTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/OriginVerifierTest.java
index db82205..582cdc7b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/OriginVerifierTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/OriginVerifierTest.java
@@ -19,11 +19,11 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.browserservices.OriginVerifier.OriginVerificationListener;
 import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge;
 import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
 import org.chromium.chrome.browser.browsing_data.TimePeriod;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityShareTargetTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityShareTargetTest.java
index 9c17bdf..7e2836b2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityShareTargetTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityShareTargetTest.java
@@ -25,8 +25,8 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.JniMocker;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.webapps.WebApkPostShareTargetNavigator;
 import org.chromium.chrome.browser.webapps.WebApkPostShareTargetNavigatorJni;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java
index 89b8d12..516429c2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java
@@ -36,9 +36,9 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
 import org.chromium.chrome.browser.tab.TabThemeColorHelper;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPermissionsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPermissionsTest.java
index 27ed3b0..5da89db 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPermissionsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPermissionsTest.java
@@ -21,11 +21,11 @@
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.ChromeApplication;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.background_sync.BackgroundSyncPwaDetector;
 import org.chromium.chrome.browser.browserservices.Origin;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.net.test.EmbeddedTestServer;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPreferencesUiTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPreferencesUiTest.java
index 13cf5e9..041524bb 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPreferencesUiTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPreferencesUiTest.java
@@ -18,8 +18,8 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeApplication;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.browserservices.Origin;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.ChromeImageViewPreference;
 import org.chromium.chrome.browser.settings.ExpandablePreferenceGroup;
 import org.chromium.chrome.browser.settings.SettingsActivity;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridgeTest.java
index 3ba217dd..ff782b6e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridgeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridgeTest.java
@@ -20,7 +20,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UserActionTester;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataRemoverIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataRemoverIntegrationTest.java
index 89ec1ab7..37c9680e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataRemoverIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataRemoverIntegrationTest.java
@@ -15,8 +15,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge.OnClearBrowsingDataListener;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.webapps.TestFetchStorageCallback;
 import org.chromium.chrome.browser.webapps.WebappInfo;
 import org.chromium.chrome.browser.webapps.WebappRegistry;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataTest.java
index 7798a220..7c6db4ae 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataTest.java
@@ -16,7 +16,7 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.JavaScriptUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java
index 48f2bab..39e8fe7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java
@@ -23,8 +23,8 @@
 import org.chromium.base.CollectionUtil;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.browsing_data.ClearBrowsingDataFragment.DialogOption;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.SettingsActivity;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentTest.java
index 27afdd0..d4008ad 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentTest.java
@@ -36,9 +36,9 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.browsing_data.ClearBrowsingDataFragment.DialogOption;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager;
 import org.chromium.chrome.browser.settings.SettingsActivity;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/CompositorVisibilityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/CompositorVisibilityTest.java
index 25447e5..f75125f3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/CompositorVisibilityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/CompositorVisibilityTest.java
@@ -20,9 +20,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.resources.ResourceManager;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java
index d4e2a02f..8c2c640 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java
@@ -19,6 +19,7 @@
 import android.view.MotionEvent.PointerProperties;
 import android.widget.FrameLayout;
 
+import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
@@ -31,7 +32,6 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout;
 import org.chromium.chrome.browser.compositor.animation.CompositorAnimationHandler;
 import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
@@ -42,6 +42,7 @@
 import org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.tab.MockTab;
 import org.chromium.chrome.browser.tab.Tab;
@@ -49,9 +50,11 @@
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.TabModelUtils;
 import org.chromium.chrome.browser.tasks.tab_management.TabListCoordinator;
+import org.chromium.chrome.browser.util.AccessibilityUtil;
 import org.chromium.chrome.features.start_surface.StartSurfaceLayout;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
+import org.chromium.chrome.test.util.ApplicationTestUtils;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.chrome.test.util.browser.tabmodel.MockTabModel.MockTabModelDelegate;
 import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector;
@@ -525,16 +528,21 @@
     @Feature({"Android-TabSwitcher"})
     // clang-format off
     @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
-    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
-    public void testStartSurfaceLayoutDisabled() {
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
+    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
+    public void testStartSurfaceLayout_Disabled_LowEndPhone() throws Exception {
         // clang-format on
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, false);
-        launchedChromeAndEnterTabSwitcher();
+        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
+        verifyOverviewListLayoutEnabled();
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            Layout activeLayout = getActiveLayout();
-            Assert.assertTrue(activeLayout instanceof OverviewListLayout);
-        });
+        ApplicationTestUtils.finishActivity(mActivityTestRule.getActivity());
+        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, false);
+        verifyOverviewListLayoutEnabled();
+
+        // Test accessibility
+        ApplicationTestUtils.finishActivity(mActivityTestRule.getActivity());
+        AccessibilityUtil.setAccessibilityEnabledForTesting(true);
+        verifyOverviewListLayoutEnabled();
     }
 
     @Test
@@ -543,50 +551,77 @@
     @Feature({"Android-TabSwitcher"})
     // clang-format off
     @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
-    @Features.EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID})
-    public void testStartSurfaceLayoutEnabled_Grid() {
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
+    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID,
+            ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID})
+    public void testStartSurfaceLayout_Disabled_HighEndPhone() throws Exception {
+        // clang-format on
+        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, false);
+        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, false);
+        verifyStackLayoutEnabled();
+
+        // Verify accessibility
+        ApplicationTestUtils.finishActivity(mActivityTestRule.getActivity());
+        AccessibilityUtil.setAccessibilityEnabledForTesting(true);
+        verifyOverviewListLayoutEnabled();
+    }
+
+    @Test
+    @MediumTest
+    @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE})
+    @Feature({"Android-TabSwitcher"})
+    // clang-format off
+    @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
+    public void testStartSurfaceLayout_Disabled_AllPhone_Accessibility_WithoutContinuationFlag() {
         // clang-format on
         CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
-        launchedChromeAndEnterTabSwitcher();
-
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            Layout activeLayout = getActiveLayout();
-            Assert.assertTrue(activeLayout instanceof StartSurfaceLayout);
-
-            StartSurfaceLayout startSurfaceLayout = (StartSurfaceLayout) activeLayout;
-
-            Assert.assertEquals(TabListCoordinator.TabListMode.GRID,
-                    startSurfaceLayout.getStartSurfaceForTesting()
-                            .getTabListDelegate()
-                            .getListModeForTesting());
-        });
+        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
+        AccessibilityUtil.setAccessibilityEnabledForTesting(true);
+        verifyOverviewListLayoutEnabled();
     }
+
+    @Test
+    @MediumTest
+    @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_NON_LOW_END_DEVICE})
+    @Feature({"Android-TabSwitcher"})
+    // clang-format off
+    @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
+    public void testStartSurfaceLayout_Enabled_HighEndPhone() throws Exception {
+        // clang-format on
+        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
+        verifyStartSurfaceLayoutEnable(TabListCoordinator.TabListMode.GRID);
+
+        ApplicationTestUtils.finishActivity(mActivityTestRule.getActivity());
+        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, false);
+        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
+        verifyStartSurfaceLayoutEnable(TabListCoordinator.TabListMode.GRID);
+
+        // Verify accessibility
+        ApplicationTestUtils.finishActivity(mActivityTestRule.getActivity());
+        AccessibilityUtil.setAccessibilityEnabledForTesting(true);
+        verifyStartSurfaceLayoutEnable(TabListCoordinator.TabListMode.GRID);
+    }
+
     @Test
     @MediumTest
     @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_LOW_END_DEVICE})
     @Feature({"Android-TabSwitcher"})
-    @CommandLineFlags
-            .Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
-            @Features
-            .EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID,
-                    ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
-            @Features.DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION)
-            public void
-            testStartSurfaceLayoutEnabled_List() {
+    // clang-format off
+    @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID,
+            ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
+    @Features.DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION)
+    public void testStartSurfaceLayout_Enabled_LowEndPhone() throws Exception {
+        // clang-format on
         CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
-        launchedChromeAndEnterTabSwitcher();
+        verifyStartSurfaceLayoutEnable(TabListCoordinator.TabListMode.LIST);
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            Layout activeLayout = getActiveLayout();
-            Assert.assertTrue(activeLayout instanceof StartSurfaceLayout);
-
-            StartSurfaceLayout startSurfaceLayout = (StartSurfaceLayout) activeLayout;
-
-            Assert.assertEquals(TabListCoordinator.TabListMode.LIST,
-                    startSurfaceLayout.getStartSurfaceForTesting()
-                            .getTabListDelegate()
-                            .getListModeForTesting());
-        });
+        // Test Accessibility
+        ApplicationTestUtils.finishActivity(mActivityTestRule.getActivity());
+        AccessibilityUtil.setAccessibilityEnabledForTesting(true);
+        verifyStartSurfaceLayoutEnable(TabListCoordinator.TabListMode.LIST);
     }
 
     @Before
@@ -596,6 +631,56 @@
                 () -> { ChromeBrowserInitializer.getInstance().handleSynchronousStartup(); });
     }
 
+    @After
+    public void tearDown() {
+        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, null);
+        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, null);
+        AccessibilityUtil.setAccessibilityEnabledForTesting(null);
+    }
+
+    /**
+     * Verify {@link StackLayout} is in used. The {@link StackLayout} is used when
+     * ChromeFeatureList.TAB_GROUPS_ANDROID or ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID is disabled
+     * in high end phone.
+     */
+    private void verifyStackLayoutEnabled() {
+        launchedChromeAndEnterTabSwitcher();
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            Layout activeLayout = getActiveLayout();
+            Assert.assertTrue(activeLayout instanceof StackLayout);
+        });
+    }
+
+    /**
+     * Verify the {@link OverviewListLayout} is in used. The {@link OverviewListLayout} is used when
+     * accessibility is turned on. It is also used for low end device.
+     */
+    private void verifyOverviewListLayoutEnabled() {
+        launchedChromeAndEnterTabSwitcher();
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            Layout activeLayout = getActiveLayout();
+            Assert.assertTrue(activeLayout instanceof OverviewListLayout);
+        });
+    }
+
+    private void verifyStartSurfaceLayoutEnable(
+            @TabListCoordinator.TabListMode int expectedTabListMode) {
+        launchedChromeAndEnterTabSwitcher();
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            Layout activeLayout = getActiveLayout();
+            Assert.assertTrue(activeLayout instanceof StartSurfaceLayout);
+
+            StartSurfaceLayout startSurfaceLayout = (StartSurfaceLayout) activeLayout;
+
+            Assert.assertEquals(expectedTabListMode,
+                    startSurfaceLayout.getStartSurfaceForTesting()
+                            .getTabListDelegate()
+                            .getListModeForTesting());
+        });
+    }
+
     private void launchedChromeAndEnterTabSwitcher() {
         mActivityTestRule.startMainActivityOnBlankPage();
         CriteriaHelper.pollUiThread(Criteria.equals(true,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/overlays/strip/TabStripTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/overlays/strip/TabStripTest.java
index 149f035..91741d6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/overlays/strip/TabStripTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/overlays/strip/TabStripTest.java
@@ -19,8 +19,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.compositor.layouts.components.CompositorButton;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
 import org.chromium.chrome.browser.tabmodel.TabModel;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contacts_picker/ContactsPickerDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contacts_picker/ContactsPickerDialogTest.java
index 71d2c95..23bc247 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contacts_picker/ContactsPickerDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contacts_picker/ContactsPickerDialogTest.java
@@ -26,8 +26,8 @@
 import org.chromium.blink.mojom.ContactIconBlob;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.Features;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
index 97e24df9..6e049db 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
@@ -30,13 +30,13 @@
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator;
 import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
 import org.chromium.chrome.browser.download.DownloadTestRule;
 import org.chromium.chrome.browser.download.DownloadTestRule.CustomMainActivityStart;
 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.share.LensUtils;
 import org.chromium.chrome.browser.share.ShareHelper;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuTest.java
index 855a794..71a6617 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuTest.java
@@ -23,11 +23,11 @@
 import org.chromium.base.test.util.CloseableOnMainThread;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
 import org.chromium.chrome.browser.download.DownloadTestRule;
 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabCreationState;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
index 957f1f7..4145ffb 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -49,7 +49,6 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.ChromeTabbedActivity2;
 import org.chromium.chrome.browser.compositor.animation.CompositorAnimationHandler;
@@ -71,6 +70,7 @@
 import org.chromium.chrome.browser.findinpage.FindToolbar;
 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.gsa.GSAContextDisplaySelection;
 import org.chromium.chrome.browser.locale.LocaleManager;
 import org.chromium.chrome.browser.omnibox.UrlBar;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicyTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicyTest.java
index b96d936..fc60631 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicyTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicyTest.java
@@ -16,7 +16,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequestTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequestTest.java
index 5dae7e5..ee009a9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequestTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequestTest.java
@@ -16,7 +16,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java
index c54f245..155ff0a0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java
@@ -21,12 +21,12 @@
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.WebContentsFactory;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManagerWrapper;
 import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel;
 import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.Features;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityIncognitoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityIncognitoTest.java
index 7d8c028..0af66e5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityIncognitoTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityIncognitoTest.java
@@ -26,9 +26,9 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.incognito.IncognitoNotificationService;
 import org.chromium.chrome.browser.toolbar.top.CustomTabToolbar;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
index d6b0374..194aadf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
@@ -80,7 +80,6 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeApplication;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.TabsOpenedFromExternalAppTest;
@@ -93,6 +92,7 @@
 import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController.FinishReason;
 import org.chromium.chrome.browser.document.ChromeLauncherActivity;
 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.history.BrowsingHistoryBridge;
 import org.chromium.chrome.browser.history.HistoryItem;
 import org.chromium.chrome.browser.history.TestBrowsingHistoryObserver;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabDeferredStartupTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabDeferredStartupTest.java
index b077bfb..7c96e423 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabDeferredStartupTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabDeferredStartupTest.java
@@ -24,13 +24,13 @@
 import org.chromium.base.test.params.ParameterizedRunner;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.DeferredStartupHandler;
 import org.chromium.chrome.browser.browserservices.TrustedWebActivityTestUtil;
 import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider;
 import org.chromium.chrome.browser.customtabs.content.TabCreationMode;
 import org.chromium.chrome.browser.customtabs.dependency_injection.BaseCustomTabActivityComponent;
 import org.chromium.chrome.browser.flags.ActivityType;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.lifecycle.InflationObserver;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabExternalNavigationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabExternalNavigationTest.java
index f55a0e13..36cc37cf0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabExternalNavigationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabExternalNavigationTest.java
@@ -19,11 +19,11 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.customtabs.CustomTabDelegateFactory.CustomTabNavigationDelegate;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler.OverrideUrlLoadingResult;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationParams;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabDelegateFactory;
 import org.chromium.chrome.browser.tab.TabTestUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabFromChromeExternalNavigationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabFromChromeExternalNavigationTest.java
index 3f4df95..95bad7ed 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabFromChromeExternalNavigationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabFromChromeExternalNavigationTest.java
@@ -25,10 +25,10 @@
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.LaunchIntentDispatcher;
 import org.chromium.chrome.browser.customtabs.CustomTabDelegateFactory.CustomTabNavigationDelegate;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler.OverrideUrlLoadingResult;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.InterceptNavigationDelegateImpl;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabDelegateFactory;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistenceIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistenceIntegrationTest.java
index 9b809b9..0817e6ae 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistenceIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistenceIntegrationTest.java
@@ -13,8 +13,8 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController.FinishReason;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabState;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelperTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelperTest.java
index 69ebaba..ecdfdba3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelperTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelperTest.java
@@ -28,8 +28,8 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabThemeColorHelper;
 import org.chromium.chrome.browser.webapps.WebappActivity;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java
index eb1da18..821b6ee 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java
@@ -36,8 +36,8 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.WarmupManager;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/TrustedCdnPublisherUrlTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/TrustedCdnPublisherUrlTest.java
index a68a7c2..fbaba06 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/TrustedCdnPublisherUrlTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/TrustedCdnPublisherUrlTest.java
@@ -38,10 +38,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.ClientId;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
 import org.chromium.chrome.browser.omnibox.UrlBar;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java
index 85091ac..9bccf34 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java
@@ -15,11 +15,11 @@
 
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
 import org.chromium.chrome.browser.customtabs.content.TabObserverRegistrar.CustomTabTabObserver;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabSelectionType;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/datareduction/DataReductionPromoUtilsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/datareduction/DataReductionPromoUtilsTest.java
index ceb3850..3659ba4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/datareduction/DataReductionPromoUtilsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/datareduction/DataReductionPromoUtilsTest.java
@@ -23,7 +23,7 @@
 import org.chromium.base.test.util.AdvancedMockContext;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
 import org.chromium.chrome.browser.settings.about.AboutSettingsBridge;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/datareduction/DataReductionSavingsMilestonePromoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/datareduction/DataReductionSavingsMilestonePromoTest.java
index 76f3928..6115f5ab 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/datareduction/DataReductionSavingsMilestonePromoTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/datareduction/DataReductionSavingsMilestonePromoTest.java
@@ -16,7 +16,7 @@
 
 import org.chromium.base.test.util.AdvancedMockContext;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialogTest.java
index 8742fc01..1cdc11b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialogTest.java
@@ -28,7 +28,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.location.LocationUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothScanningPermissionDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothScanningPermissionDialogTest.java
index 43760d4..d9503abb 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothScanningPermissionDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothScanningPermissionDialogTest.java
@@ -20,7 +20,7 @@
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/ItemChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/ItemChooserDialogTest.java
index 870a534..9b8a86a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/ItemChooserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/ItemChooserDialogTest.java
@@ -28,7 +28,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.Criteria;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/UsbChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/UsbChooserDialogTest.java
index 67798eee..812ba1f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/UsbChooserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/UsbChooserDialogTest.java
@@ -21,7 +21,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/CloseTabDirectActionHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/CloseTabDirectActionHandlerTest.java
index e214813..90d53cc 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/CloseTabDirectActionHandlerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/CloseTabDirectActionHandlerTest.java
@@ -22,8 +22,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionAvailabilityCustomTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionAvailabilityCustomTabTest.java
index ec43c07..50352836 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionAvailabilityCustomTabTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionAvailabilityCustomTabTest.java
@@ -20,10 +20,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionAvailabilityTabbedTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionAvailabilityTabbedTest.java
index f5881a7..746d73e8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionAvailabilityTabbedTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionAvailabilityTabbedTest.java
@@ -20,8 +20,8 @@
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionAvailabilityWebappTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionAvailabilityWebappTest.java
index a6feba1..cf081bd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionAvailabilityWebappTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionAvailabilityWebappTest.java
@@ -19,8 +19,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.webapps.WebappActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionsInActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionsInActivityTest.java
index 1b57512..1cddb2e2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionsInActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/DirectActionsInActivityTest.java
@@ -27,8 +27,8 @@
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.UserActionTester;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/MenuDirectActionHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/MenuDirectActionHandlerTest.java
index 6c0aae2..5397678d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/MenuDirectActionHandlerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/directactions/MenuDirectActionHandlerTest.java
@@ -26,7 +26,7 @@
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTest.java
index 7ebd3d3..1afaa12 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTest.java
@@ -14,7 +14,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.blink.mojom.ViewportFit;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 import java.util.concurrent.TimeoutException;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/display_cutout/WebappDisplayCutoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/display_cutout/WebappDisplayCutoutTest.java
index 26190a01..5dda270d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/display_cutout/WebappDisplayCutoutTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/display_cutout/WebappDisplayCutoutTest.java
@@ -12,7 +12,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.FlakyTest;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.webapps.WebDisplayMode;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/document/LauncherActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/document/LauncherActivityTest.java
index e330d1e8..9c30a84 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/document/LauncherActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/document/LauncherActivityTest.java
@@ -25,7 +25,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistillabilityServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistillabilityServiceTest.java
index fd9f6141..f8461b1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistillabilityServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistillabilityServiceTest.java
@@ -18,7 +18,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBar;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.infobar.InfoBarContainer.InfoBarContainerObserver;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/ChromeDownloadDelegateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ChromeDownloadDelegateTest.java
index 4ff9255f..b1e05eb1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/ChromeDownloadDelegateTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ChromeDownloadDelegateTest.java
@@ -16,7 +16,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadLocationChangeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadLocationChangeTest.java
index 7ac745a..2f554c17 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadLocationChangeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadLocationChangeTest.java
@@ -28,9 +28,9 @@
 import org.chromium.base.StrictModeContext;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.download.DownloadTestRule.CustomMainActivityStart;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.download.DownloadDirectoryAdapter;
 import org.chromium.chrome.download.R;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java
index 413b52c6..1593324 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java
@@ -28,12 +28,12 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.compositor.CompositorViewHolder;
 import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
 import org.chromium.chrome.browser.compositor.layouts.StaticLayout;
 import org.chromium.chrome.browser.download.DownloadTestRule.CustomMainActivityStart;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModel;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/engagement/SiteEngagementServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/engagement/SiteEngagementServiceTest.java
index 1865d004..b17444e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/engagement/SiteEngagementServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/engagement/SiteEngagementServiceTest.java
@@ -15,7 +15,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.TabImpl;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardViewDenseTitleBottomTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardViewDenseTitleBottomTest.java
index 5829477f..3961c22 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardViewDenseTitleBottomTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardViewDenseTitleBottomTest.java
@@ -10,7 +10,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardViewDenseTitleRightTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardViewDenseTitleRightTest.java
index 25a2759..617067fb 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardViewDenseTitleRightTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardViewDenseTitleRightTest.java
@@ -10,7 +10,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardViewTest.java
index 49cdd37..0d22eaf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardViewTest.java
@@ -18,7 +18,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPageTest.java
index 7b3edb98..fc306b87 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPageTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPageTest.java
@@ -33,8 +33,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.night_mode.ChromeNightModeTestUtils;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImplTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImplTest.java
index 0a51954..65d7112 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImplTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImplTest.java
@@ -20,8 +20,9 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.instantapps.InstantAppsHandler;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
@@ -247,6 +248,42 @@
                 delegate.isPdfDownload("http://somesampleurldne.com/copy.txt"));
     }
 
+    @Test
+    @SmallTest
+    public void testMaybeSetPendingIncognitoUrl() {
+        ExternalNavigationDelegateImpl delegate = new ExternalNavigationDelegateImpl(
+                mActivityTestRule.getActivity().getActivityTab());
+
+        String url = "http://www.example.com";
+        Intent intent = new Intent(Intent.ACTION_VIEW);
+        intent.setData(Uri.parse(url));
+
+        delegate.maybeSetPendingIncognitoUrl(intent);
+
+        Assert.assertTrue(
+                intent.getBooleanExtra(IntentHandler.EXTRA_OPEN_NEW_INCOGNITO_TAB, false));
+        Assert.assertEquals(url, IntentHandler.getPendingIncognitoUrl());
+    }
+
+    @Test
+    @SmallTest
+    public void testMaybeSetPendingReferrer() {
+        ExternalNavigationDelegateImpl delegate = new ExternalNavigationDelegateImpl(
+                mActivityTestRule.getActivity().getActivityTab());
+
+        String url = "http://www.example.com";
+        Intent intent = new Intent(Intent.ACTION_VIEW);
+        intent.setData(Uri.parse(url));
+
+        String referrerUrl = "http://www.example-referrer.com";
+        delegate.maybeSetPendingReferrer(intent, referrerUrl);
+
+        Assert.assertEquals(
+                Uri.parse(referrerUrl), intent.getParcelableExtra(Intent.EXTRA_REFERRER));
+        Assert.assertEquals(1, intent.getIntExtra(IntentHandler.EXTRA_REFERRER_ID, 0));
+        Assert.assertEquals(referrerUrl, IntentHandler.getPendingReferrerUrl(1));
+    }
+
     @Before
     public void setUp() throws InterruptedException {
         mActivityTestRule.startMainActivityOnBlankPage();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java
index 39320a1ac..16844dcb 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java
@@ -33,7 +33,6 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.BaseJUnit4ClassRunner;
 import org.chromium.base.test.util.DisableIf;
-import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler.OverrideUrlLoadingResult;
@@ -1248,8 +1247,6 @@
                         START_OTHER_ACTIVITY);
         Assert.assertEquals(Uri.parse(referrer),
                 mDelegate.startActivityIntent.getParcelableExtra(Intent.EXTRA_REFERRER));
-        Assert.assertEquals(
-                1, mDelegate.startActivityIntent.getIntExtra(IntentHandler.EXTRA_REFERRER_ID, 0));
     }
 
     @Test
@@ -1865,6 +1862,16 @@
         }
 
         @Override
+        public void maybeSetPendingReferrer(Intent intent, String referrerUrl) {
+            // This is used in a test to check that ExternalNavigationHandler correctly passes
+            // this data to the delegate when the referrer URL is non-null.
+            intent.putExtra(Intent.EXTRA_REFERRER, Uri.parse(referrerUrl));
+        }
+
+        @Override
+        public void maybeSetPendingIncognitoUrl(Intent intent) {}
+
+        @Override
         public boolean isChromeAppInForeground() {
             return mIsChromeAppInForeground;
         }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
index 28e688e..89f2fd6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
@@ -29,9 +29,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.document.ChromeLauncherActivity;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler.OverrideUrlLoadingResult;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.InterceptNavigationDelegateImpl;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/feature_engagement/ScreenshotTabObserverTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/feature_engagement/ScreenshotTabObserverTest.java
index 423c151..12e7079 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/feature_engagement/ScreenshotTabObserverTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/feature_engagement/ScreenshotTabObserverTest.java
@@ -17,7 +17,7 @@
 import org.chromium.base.test.util.MetricsUtils;
 import org.chromium.base.test.util.UserActionTester;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/findinpage/FindTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/findinpage/FindTest.java
index 1604b0d7..6a5222f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/findinpage/FindTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/findinpage/FindTest.java
@@ -36,7 +36,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java
index e9f5d74..a324080 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java
@@ -33,9 +33,9 @@
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.omnibox.UrlBar;
 import org.chromium.chrome.browser.prerender.PrerenderTestHelper;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationHandlerTest.java
index c9f7d5da..19f4e1f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationHandlerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationHandlerTest.java
@@ -23,8 +23,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.compositor.animation.CompositorAnimationHandler;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationSheetTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationSheetTest.java
index e7139ec..9cb5ef7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationSheetTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationSheetTest.java
@@ -21,8 +21,8 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.gesturenav.NavigationSheetMediator.ItemProperties;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/ChromeTabbedActivityHWATest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/ChromeTabbedActivityHWATest.java
index c2d326bc..2adb93e1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/ChromeTabbedActivityHWATest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/ChromeTabbedActivityHWATest.java
@@ -13,7 +13,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/CustomTabActivityHWATest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/CustomTabActivityHWATest.java
index 0d2efcf0..30ca0304 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/CustomTabActivityHWATest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/CustomTabActivityHWATest.java
@@ -13,9 +13,9 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/ToastHWATest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/ToastHWATest.java
index 61c9013..8b9c7e7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/ToastHWATest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/ToastHWATest.java
@@ -28,10 +28,10 @@
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.download.DownloadTestRule;
 import org.chromium.chrome.browser.download.DownloadTestRule.CustomMainActivityStart;
 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.contextmenu.ContextMenuUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/WebappActivityHWATest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/WebappActivityHWATest.java
index c0243e2f..3c91e56 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/WebappActivityHWATest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/WebappActivityHWATest.java
@@ -12,7 +12,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.webapps.WebappActivity;
 import org.chromium.chrome.browser.webapps.WebappActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityScrollingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityScrollingTest.java
index aba1da0..96ff91a4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityScrollingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityScrollingTest.java
@@ -25,7 +25,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.history.HistoryTestUtils.TestObserver;
 import org.chromium.chrome.browser.widget.DateDividedAdapter.FooterItem;
 import org.chromium.chrome.browser.widget.DateDividedAdapter.TimedItem;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityTest.java
index a856474e..a4c76b7a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityTest.java
@@ -39,8 +39,8 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.IntentHandler;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.history.HistoryTestUtils.TestObserver;
 import org.chromium.chrome.browser.incognito.IncognitoUtils;
 import org.chromium.chrome.browser.preferences.Pref;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java
index a799e16..1ff807254 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java
@@ -23,10 +23,10 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
 import org.chromium.chrome.browser.partnercustomizations.HomepageManager.HomeButtonPreferenceState;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoNotificationServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoNotificationServiceTest.java
index 22230cd..d84c7a9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoNotificationServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoNotificationServiceTest.java
@@ -21,7 +21,7 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.tab.TabState;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoTabLauncherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoTabLauncherTest.java
index d670bd7..860277b7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoTabLauncherTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoTabLauncherTest.java
@@ -25,13 +25,13 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.AppHooksModule;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.customtabs.CustomTabsConnection;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
 import org.chromium.chrome.browser.dependency_injection.ModuleOverridesRule;
 import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.browser.Features;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarAppearanceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarAppearanceTest.java
index 2ca02fc2..d87a744 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarAppearanceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarAppearanceTest.java
@@ -17,7 +17,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabTestUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java
index 4fa88fd8..322d83ca 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java
@@ -26,7 +26,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarTest.java
index 2b197ce..2b4e4c7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarTest.java
@@ -26,9 +26,9 @@
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.WebContentsFactory;
 import org.chromium.chrome.browser.datareduction.DataReductionPromoUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
 import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.TabTestUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfobarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfobarTest.java
index 735b2832..9311b11 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfobarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfobarTest.java
@@ -16,7 +16,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.website.ContentSettingValues;
 import org.chromium.chrome.browser.settings.website.PermissionInfo;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java
index 19b6770d..49b1051 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java
@@ -19,8 +19,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.SearchGeolocationDisclosureTabHelper;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.website.ContentSettingValues;
 import org.chromium.chrome.browser.settings.website.PermissionInfo;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SyncErrorInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SyncErrorInfoBarTest.java
index 4c35782..3fe1483f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SyncErrorInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SyncErrorInfoBarTest.java
@@ -14,9 +14,9 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.SyncFirstSetupCompleteSource;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.sync.FakeProfileSyncService;
 import org.chromium.chrome.browser.sync.GoogleServiceAuthError;
 import org.chromium.chrome.browser.sync.SyncTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/init/StartupTabPreloaderCustomTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/init/StartupTabPreloaderCustomTabTest.java
index c4f2eee..ccc6c51 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/init/StartupTabPreloaderCustomTabTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/init/StartupTabPreloaderCustomTabTest.java
@@ -16,10 +16,10 @@
 
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.LaunchIntentDispatcher;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/init/StartupTabPreloaderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/init/StartupTabPreloaderTest.java
index 9e70e82..e336ebd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/init/StartupTabPreloaderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/init/StartupTabPreloaderTest.java
@@ -15,9 +15,9 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java
index b1e80fb..bc9131248 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java
@@ -17,8 +17,8 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.WebContentsFactory;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.embedder_support.view.ContentView;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/instantapps/InstantAppsHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/instantapps/InstantAppsHandlerTest.java
index 56dc84c..f5bcea0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/instantapps/InstantAppsHandlerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/instantapps/InstantAppsHandlerTest.java
@@ -24,9 +24,9 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/interstitials/LookalikeInterstitialTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/interstitials/LookalikeInterstitialTest.java
index e836dc189..e77c628 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/interstitials/LookalikeInterstitialTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/interstitials/LookalikeInterstitialTest.java
@@ -18,8 +18,8 @@
 import org.chromium.base.test.params.ParameterizedCommandLineFlags;
 import org.chromium.base.test.params.ParameterizedCommandLineFlags.Switches;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java
index 705d6fff..a5a10167 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java
@@ -28,7 +28,7 @@
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.javascript_dialogs.JavascriptAppModalDialog;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptTabModalDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptTabModalDialogTest.java
index da5ef80..cc6b2bea 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptTabModalDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptTabModalDialogTest.java
@@ -30,8 +30,8 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.components.javascript_dialogs.JavascriptTabModalDialog;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialogTest.java
index 8ad4153d..bbf7238 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialogTest.java
@@ -15,8 +15,8 @@
 
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
 import org.chromium.chrome.browser.searchwidget.SearchActivity;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/locale/LocaleManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/locale/LocaleManagerTest.java
index 7b615ef..eea3a182 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/locale/LocaleManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/locale/LocaleManagerTest.java
@@ -15,7 +15,7 @@
 import org.chromium.base.Callback;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.searchwidget.SearchActivity;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/login/ChromeHttpAuthHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/login/ChromeHttpAuthHandlerTest.java
index 352afb5..7988573 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/login/ChromeHttpAuthHandlerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/login/ChromeHttpAuthHandlerTest.java
@@ -18,9 +18,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabImpl;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/media/MediaLauncherActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/media/MediaLauncherActivityTest.java
index 447c386..524fcd11 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/media/MediaLauncherActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/media/MediaLauncherActivityTest.java
@@ -23,9 +23,9 @@
 import org.chromium.base.CollectionUtil;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.UrlUtils;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.chrome.browser.customtabs.SeparateTaskCustomTabActivity0;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.MultiActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/AutoplayMutedNotificationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/AutoplayMutedNotificationTest.java
index d07f36b..5987b14 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/AutoplayMutedNotificationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/AutoplayMutedNotificationTest.java
@@ -23,7 +23,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PauseOnHeadsetUnplugTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PauseOnHeadsetUnplugTest.java
index d16c5b0..32f9b95 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PauseOnHeadsetUnplugTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PauseOnHeadsetUnplugTest.java
@@ -20,7 +20,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PictureInPictureControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PictureInPictureControllerTest.java
index 90e7a76..ea3b2c3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PictureInPictureControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PictureInPictureControllerTest.java
@@ -21,8 +21,8 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/BackgroundMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/BackgroundMetricsTest.java
index 29f0d888c..c72874fc 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/BackgroundMetricsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/BackgroundMetricsTest.java
@@ -17,7 +17,7 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.init.BrowserParts;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.init.EmptyBrowserParts;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java
index 1a74c6e..c7c612ed 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java
@@ -28,10 +28,10 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.UserActionTester;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.bookmarks.BookmarkActivity;
 import org.chromium.chrome.browser.download.DownloadActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.history.HistoryActivity;
 import org.chromium.chrome.browser.omnibox.UrlBar;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/PageLoadMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/PageLoadMetricsTest.java
index efa76ed..df5f9084 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/PageLoadMetricsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/PageLoadMetricsTest.java
@@ -18,7 +18,7 @@
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.WebContents;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java
index 05abdd3..a8d795b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java
@@ -21,9 +21,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.webapps.WebApkActivity;
 import org.chromium.chrome.browser.webapps.WebApkActivityLifecycleUmaTracker;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ChromeTabModalPresenterTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ChromeTabModalPresenterTest.java
index 3b0f321..aa258903 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ChromeTabModalPresenterTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ChromeTabModalPresenterTest.java
@@ -42,8 +42,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.omnibox.UrlBar;
 import org.chromium.chrome.browser.omnibox.UrlFocusChangeListener;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/multiwindow/MultiWindowIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/multiwindow/MultiWindowIntegrationTest.java
index 781e3de..424fcf0e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/multiwindow/MultiWindowIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/multiwindow/MultiWindowIntegrationTest.java
@@ -24,10 +24,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.ChromeTabbedActivity2;
 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabWindowManager;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtilsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtilsTest.java
index 83c359ae..b98a0ce 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtilsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtilsTest.java
@@ -23,10 +23,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.ChromeTabbedActivity2;
 import org.chromium.chrome.browser.IntentHandler;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.content_public.browser.test.util.Criteria;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/ChromeNotificationBuilderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/ChromeNotificationBuilderTest.java
index ad20d549..27a8883 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/ChromeNotificationBuilderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/ChromeNotificationBuilderTest.java
@@ -18,7 +18,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeIntentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeIntentTest.java
index faa82779..3b3a969 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeIntentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeIntentTest.java
@@ -20,8 +20,8 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.document.ChromeLauncherActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.SettingsActivity;
 import org.chromium.chrome.browser.settings.website.SingleCategorySettings;
 import org.chromium.chrome.browser.settings.website.SingleWebsiteSettings;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java
index 23b5bda5..f678b82 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java
@@ -35,9 +35,9 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UserActionTester;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.engagement.SiteEngagementService;
 import org.chromium.chrome.browser.favicon.RoundedIconGenerator;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.permissions.PermissionTestRule;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPageTest.java
index efb555a..889f6947 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPageTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPageTest.java
@@ -29,8 +29,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageLoadTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageLoadTest.java
index 6ee5cef0..d92551c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageLoadTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageLoadTest.java
@@ -20,9 +20,9 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.favicon.IconType;
 import org.chromium.chrome.browser.favicon.LargeIconBridge;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.suggestions.tile.Tile;
 import org.chromium.chrome.browser.suggestions.tile.TileVisualType;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageNavigationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageNavigationTest.java
index f42873c..5f44144 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageNavigationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageNavigationTest.java
@@ -18,7 +18,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java
index 41f4a607..40b4cdc 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java
@@ -46,11 +46,11 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.feed.FeedNewTabPage;
 import org.chromium.chrome.browser.feed.FeedProcessScopeFactory;
 import org.chromium.chrome.browser.feed.TestNetworkClient;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.native_page.ContextMenuManager;
 import org.chromium.chrome.browser.ntp.cards.NewTabPageAdapter;
 import org.chromium.chrome.browser.ntp.cards.NewTabPageRecyclerView;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageUiCaptureTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageUiCaptureTest.java
index 4cc8958..22930b7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageUiCaptureTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageUiCaptureTest.java
@@ -17,8 +17,8 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.ntp.cards.NewTabPageRecyclerView;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.test.ScreenShooter;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java
index f7b15c9..e86e84e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java
@@ -18,7 +18,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerViewTest.java
index 9651c2c0..a9c67cf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerViewTest.java
@@ -26,8 +26,8 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.native_page.ContextMenuManager;
 import org.chromium.chrome.browser.ntp.NewTabPage;
 import org.chromium.chrome.browser.ntp.NewTabPageView;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
index 7ed4092..7e62cd2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
@@ -39,9 +39,9 @@
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.favicon.IconType;
 import org.chromium.chrome.browser.favicon.LargeIconBridge;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.native_page.ContextMenuManager;
 import org.chromium.chrome.browser.night_mode.ChromeNightModeTestUtils;
 import org.chromium.chrome.browser.ntp.NewTabPage;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/MHTMLPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/MHTMLPageTest.java
index c895d339..0b709c68 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/MHTMLPageTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/MHTMLPageTest.java
@@ -18,12 +18,12 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.download.DownloadController;
 import org.chromium.chrome.browser.download.DownloadInfo;
 import org.chromium.chrome.browser.download.DownloadTestRule;
 import org.chromium.chrome.browser.download.DownloadTestRule.CustomMainActivityStart;
 import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.offline_items_collection.ContentId;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageArchivePublisherBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageArchivePublisherBridgeTest.java
index 74efb77e..71c77f5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageArchivePublisherBridgeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageArchivePublisherBridgeTest.java
@@ -20,7 +20,7 @@
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.OfflinePageModelObserver;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.SavePageCallback;
 import org.chromium.chrome.browser.profiles.Profile;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageAutoFetchTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageAutoFetchTest.java
index af1c592..1b97e202 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageAutoFetchTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageAutoFetchTest.java
@@ -24,8 +24,8 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.DeviceConditions;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.AutoFetchNotifier.NotificationAction;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridgeTest.java
index eb0ca2f..f3231c4b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridgeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridgeTest.java
@@ -25,7 +25,7 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.OfflinePageModelObserver;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.SavePageCallback;
 import org.chromium.chrome.browser.offlinepages.downloads.OfflinePageDownloadBridge;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageRequestTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageRequestTest.java
index 06e8086..6d3132a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageRequestTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageRequestTest.java
@@ -16,7 +16,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.SavePageCallback;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageSavePageLaterEvaluationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageSavePageLaterEvaluationTest.java
index ce76d98..94f3f84 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageSavePageLaterEvaluationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageSavePageLaterEvaluationTest.java
@@ -26,7 +26,7 @@
 import org.chromium.base.test.util.Manual;
 import org.chromium.base.test.util.TimeoutScale;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.evaluation.OfflinePageEvaluationBridge;
 import org.chromium.chrome.browser.offlinepages.evaluation.OfflinePageEvaluationBridge.OfflinePageEvaluationObserver;
 import org.chromium.chrome.browser.profiles.Profile;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java
index 7f64801..894c24b0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java
@@ -29,7 +29,7 @@
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.blink.mojom.MhtmlLoadResult;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.OfflinePageModelObserver;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.SavePageCallback;
 import org.chromium.chrome.browser.profiles.Profile;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/RecentTabsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/RecentTabsTest.java
index ca08f7f..9c4bc6ed 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/RecentTabsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/RecentTabsTest.java
@@ -15,7 +15,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/RequestCoordinatorBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/RequestCoordinatorBridgeTest.java
index d9b95b4..58f4bb73 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/RequestCoordinatorBridgeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/RequestCoordinatorBridgeTest.java
@@ -17,7 +17,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerTest.java
index 70e0add..f3dae0e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerTest.java
@@ -18,9 +18,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.download.DownloadActivity;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.ClientId;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
 import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java
index 62170aaf..8cf81137 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java
@@ -21,8 +21,8 @@
 import org.chromium.base.task.PostTask;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.background_task_scheduler.ChromeNativeBackgroundTaskDelegate;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.OfflineTestUtil;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ReducedModeNativeTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java
index 6c2d88f..372d99d7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java
@@ -15,8 +15,8 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.OfflineTestUtil;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ReducedModeNativeTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFeedFlowTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFeedFlowTest.java
index 5650060..dabbe98 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFeedFlowTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFeedFlowTest.java
@@ -25,13 +25,13 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.background_task_scheduler.ChromeNativeBackgroundTaskDelegate;
 import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory;
 import org.chromium.chrome.browser.feed.FeedProcessScopeFactory;
 import org.chromium.chrome.browser.feed.TestNetworkClient;
 import org.chromium.chrome.browser.firstrun.FirstRunUtils;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
 import org.chromium.chrome.browser.offlinepages.OfflinePageItem;
 import org.chromium.chrome.browser.offlinepages.OfflineTestUtil;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFlowTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFlowTest.java
index 86d6bae..5e8e9e5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFlowTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFlowTest.java
@@ -22,10 +22,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.background_task_scheduler.ChromeNativeBackgroundTaskDelegate;
 import org.chromium.chrome.browser.firstrun.FirstRunUtils;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
 import org.chromium.chrome.browser.offlinepages.OfflinePageItem;
 import org.chromium.chrome.browser.offlinepages.OfflineTestUtil;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java
index c7084a52..69cc45c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java
@@ -26,7 +26,7 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.ui.appmenu.AppMenuTestSupport;
 import org.chromium.chrome.browser.ui.appmenu.TestAppMenuObserver;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java
index 407e000..da0f564 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java
@@ -27,8 +27,8 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.toolbar.LocationBarModel;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java
index d2a9c4e..4e79984 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java
@@ -40,8 +40,8 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.omnibox.status.StatusViewCoordinator;
 import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteController.OnSuggestionsReceivedListener;
 import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinatorTestUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/UrlBarIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/UrlBarIntegrationTest.java
index a9bb859..51a7030 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/UrlBarIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/UrlBarIntegrationTest.java
@@ -25,9 +25,9 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.OmniboxTestUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
index 7795748..0e2211e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
@@ -10,21 +10,22 @@
 import android.support.test.filters.SmallTest;
 import android.util.Base64;
 
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.website.ContentSettingValues;
 import org.chromium.chrome.browser.settings.website.PermissionInfo;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Tests for GeolocationHeader and GeolocationTracker.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandlerTest.java
index 82ae9fb..465a314 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandlerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandlerTest.java
@@ -32,7 +32,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.ntp.NewTabPage;
 import org.chromium.chrome.browser.omnibox.UrlBarData;
 import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/ConnectionInfoPopupTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/ConnectionInfoPopupTest.java
index 6c073c3..97e4ff3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/ConnectionInfoPopupTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/ConnectionInfoPopupTest.java
@@ -14,7 +14,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/CookieControlsViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/CookieControlsViewTest.java
index 3e4cf62..2e6bd43 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/CookieControlsViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/CookieControlsViewTest.java
@@ -25,8 +25,8 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoControllerTest.java
index a6b6d7c..86ce4a1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoControllerTest.java
@@ -18,7 +18,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerDisableIncognitoModeIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerDisableIncognitoModeIntegrationTest.java
index 18e99d7..793804d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerDisableIncognitoModeIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerDisableIncognitoModeIntegrationTest.java
@@ -22,7 +22,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.incognito.IncognitoUtils;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.partnercustomizations.TestPartnerBrowserCustomizationsProvider;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java
index 73cbf1f..24bf37c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java
@@ -24,8 +24,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
 import org.chromium.chrome.browser.settings.SettingsActivity;
 import org.chromium.chrome.browser.settings.homepage.HomepageEditor;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/OnboardingDialogIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/OnboardingDialogIntegrationTest.java
index f41e6f15..b912f62e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/OnboardingDialogIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/OnboardingDialogIntegrationTest.java
@@ -24,8 +24,8 @@
 import org.chromium.base.test.util.IntegrationTest;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.sync.SyncTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogTest.java
index 59ad8737..5588e19 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogTest.java
@@ -27,7 +27,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogTest.java
index 18bbdd3..4803cc9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogTest.java
@@ -32,7 +32,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java
index 37d8020..184f86d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java
@@ -17,7 +17,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.payments.PaymentManifestDownloader;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/ExpandablePaymentHandlerChangePaymentMethodTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/ExpandablePaymentHandlerChangePaymentMethodTest.java
index eeae123..a78beea 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/ExpandablePaymentHandlerChangePaymentMethodTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/ExpandablePaymentHandlerChangePaymentMethodTest.java
@@ -17,8 +17,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.net.test.EmbeddedTestServer;
 import org.chromium.net.test.ServerCertificate;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentHandlerChangePaymentMethodTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentHandlerChangePaymentMethodTest.java
index 9a71f42c..8d552ec 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentHandlerChangePaymentMethodTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentHandlerChangePaymentMethodTest.java
@@ -17,8 +17,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.net.test.EmbeddedTestServer;
 import org.chromium.net.test.ServerCertificate;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentHandlerEnableDelegationsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentHandlerEnableDelegationsTest.java
index 83f2db9..9bd8333 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentHandlerEnableDelegationsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentHandlerEnableDelegationsTest.java
@@ -21,7 +21,7 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.JavaScriptUtils;
 import org.chromium.net.test.EmbeddedTestServer;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestDownloaderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestDownloaderTest.java
index e0f845a5..08773264 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestDownloaderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestDownloaderTest.java
@@ -17,7 +17,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.payments.PaymentManifestDownloader;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestParserTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestParserTest.java
index b2cdcbb..7ec683c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestParserTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestParserTest.java
@@ -16,7 +16,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.payments.PaymentManifestParser;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestAbortTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestAbortTest.java
index 86aa6f44..959aeab 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestAbortTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestAbortTest.java
@@ -15,10 +15,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.test.util.DisableAnimationsTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBillingAddressTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBillingAddressTest.java
index 63b6e8d..3190884f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBillingAddressTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBillingAddressTest.java
@@ -22,10 +22,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.test.util.DisableAnimationsTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBillingAddressWithoutPhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBillingAddressWithoutPhoneTest.java
index 3cc89cc..e58d189 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBillingAddressWithoutPhoneTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBillingAddressWithoutPhoneTest.java
@@ -19,10 +19,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBlobUrlTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBlobUrlTest.java
index a378f590..1192451 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBlobUrlTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBlobUrlTest.java
@@ -12,7 +12,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 import java.util.concurrent.TimeoutException;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentGooglePayTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentGooglePayTest.java
index 7a507a7..798ddbb4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentGooglePayTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentGooglePayTest.java
@@ -14,11 +14,11 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.test.util.DisableAnimationsTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java
index 7652ea1e..dd37c26 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java
@@ -20,10 +20,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryNoCardTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryNoCardTest.java
index fe498f0..406560d1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryNoCardTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryNoCardTest.java
@@ -14,9 +14,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryTest.java
index 7cdfa43..2f7c7ff 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryTest.java
@@ -14,9 +14,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCardEditorAutoAdvanceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCardEditorAutoAdvanceTest.java
index 6dc3d17..863a7251b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCardEditorAutoAdvanceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCardEditorAutoAdvanceTest.java
@@ -16,10 +16,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCcCanMakePaymentQueryNoCardTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCcCanMakePaymentQueryNoCardTest.java
index 44a0281..a456a21 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCcCanMakePaymentQueryNoCardTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCcCanMakePaymentQueryNoCardTest.java
@@ -13,9 +13,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCcCanMakePaymentQueryTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCcCanMakePaymentQueryTest.java
index ded658e7..b4883fa 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCcCanMakePaymentQueryTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCcCanMakePaymentQueryTest.java
@@ -14,9 +14,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java
index 5f75d64..534a92b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java
@@ -16,10 +16,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java
index 08ec6dd35..87fb3f83 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java
@@ -16,9 +16,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDataUrlTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDataUrlTest.java
index 09d2331..7a14aa0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDataUrlTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDataUrlTest.java
@@ -12,7 +12,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingMultipleAddressesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingMultipleAddressesTest.java
index 7c55918d..286888d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingMultipleAddressesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingMultipleAddressesTest.java
@@ -16,10 +16,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.test.util.DisableAnimationsTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java
index 8eb5df02..1109be5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java
@@ -16,10 +16,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.browser.payments.ui.PaymentRequestSection;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java
index 6eeec75..b5fc08ab 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java
@@ -16,10 +16,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java
index b4ff7b37..d848748 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java
@@ -16,9 +16,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java
index 1701a2a..e1dd10b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java
@@ -16,9 +16,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmptyUpdateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmptyUpdateTest.java
index b18bd290..85c1ee3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmptyUpdateTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmptyUpdateTest.java
@@ -14,10 +14,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.test.util.DisableAnimationsTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestExpiredLocalCardTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestExpiredLocalCardTest.java
index d4ca0166..3a36566 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestExpiredLocalCardTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestExpiredLocalCardTest.java
@@ -17,10 +17,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestExtraShippingOptionsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestExtraShippingOptionsTest.java
index dd51265..965ecee 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestExtraShippingOptionsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestExtraShippingOptionsTest.java
@@ -14,10 +14,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFailCompleteTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFailCompleteTest.java
index 8a56d30..4da22e7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFailCompleteTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFailCompleteTest.java
@@ -14,10 +14,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java
index 6702e21..337cef37 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java
@@ -22,10 +22,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.night_mode.ChromeNightModeTestUtils;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIdTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIdTest.java
index 6820187..9bc8bd7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIdTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIdTest.java
@@ -14,10 +14,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsAndFreeShippingTest.java
index 5adc6d4..ce864624 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsAndFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsAndFreeShippingTest.java
@@ -15,9 +15,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsTest.java
index 6e304f8..2dc41b0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsTest.java
@@ -15,9 +15,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteEmailTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteEmailTest.java
index f327085..dc9360e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteEmailTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteEmailTest.java
@@ -15,9 +15,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompletePhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompletePhoneTest.java
index 931ca7c..37076d21b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompletePhoneTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompletePhoneTest.java
@@ -15,9 +15,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteServerCardTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteServerCardTest.java
index 6c5cbcb6..a5e66d79 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteServerCardTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteServerCardTest.java
@@ -16,11 +16,11 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java
index bc15e45..1ff8912 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java
@@ -21,10 +21,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestLongIdTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestLongIdTest.java
index d5a66f3b..63caadf5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestLongIdTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestLongIdTest.java
@@ -12,7 +12,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
index 23037ff..cd4bf2ed 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
@@ -19,11 +19,11 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestModifierTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestModifierTest.java
index e0af8f8..18680da0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestModifierTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestModifierTest.java
@@ -12,7 +12,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMultipleContactDetailsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMultipleContactDetailsTest.java
index 5cfedaab..ac31df3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMultipleContactDetailsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMultipleContactDetailsTest.java
@@ -16,9 +16,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMultiplePaymentInstrumentsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMultiplePaymentInstrumentsTest.java
index 74379fe..ee1c6f4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMultiplePaymentInstrumentsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMultiplePaymentInstrumentsTest.java
@@ -16,10 +16,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.test.util.DisableAnimationsTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java
index 6d9f6237..df6156a7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java
@@ -16,10 +16,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java
index 91977c4a..66c3765c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java
@@ -16,10 +16,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java
index f850755..1c8e9f56 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java
@@ -22,10 +22,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoUpdateWithTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoUpdateWithTest.java
index 7f4feb58..4e86f33 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoUpdateWithTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoUpdateWithTest.java
@@ -15,10 +15,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPayerDetailChangeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPayerDetailChangeTest.java
index 8581e21c..1cf5cd6f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPayerDetailChangeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPayerDetailChangeTest.java
@@ -14,10 +14,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndBasicCardWithModifiersTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndBasicCardWithModifiersTest.java
index 7e177f0..d4daf1b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndBasicCardWithModifiersTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndBasicCardWithModifiersTest.java
@@ -23,10 +23,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndCardsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndCardsTest.java
index b02ee299..581be1b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndCardsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndCardsTest.java
@@ -15,10 +15,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppCanMakePaymentQueryTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppCanMakePaymentQueryTest.java
index bda42c4..9e137ab 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppCanMakePaymentQueryTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppCanMakePaymentQueryTest.java
@@ -14,8 +14,8 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java
index 0e6a342..336b61d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java
@@ -13,7 +13,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppSpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipPreloadTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipPreloadTest.java
index 3cb6809..38e7661 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipPreloadTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipPreloadTest.java
@@ -16,8 +16,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppSpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipTest.java
index 0f49bac..a95a4e8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipTest.java
@@ -16,8 +16,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppSpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java
index f2e6061..d3e4ddae 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java
@@ -15,10 +15,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppSpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.TestPay;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentMethodIdentifierTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentMethodIdentifierTest.java
index ec45190..46d9e8b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentMethodIdentifierTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentMethodIdentifierTest.java
@@ -19,10 +19,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java
index db6b89d..c7528aa 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java
@@ -16,10 +16,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java
index 8fad49e..bca10b5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java
@@ -16,9 +16,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestRemoveBillingAddressTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestRemoveBillingAddressTest.java
index bdc5ac5..bd299123 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestRemoveBillingAddressTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestRemoveBillingAddressTest.java
@@ -18,10 +18,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestRetryTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestRetryTest.java
index 3094ce4..0547d90 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestRetryTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestRetryTest.java
@@ -18,10 +18,10 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServerCardTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServerCardTest.java
index 975fbb66..f54307f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServerCardTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServerCardTest.java
@@ -14,11 +14,11 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerExpandablePaymentHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerExpandablePaymentHandlerTest.java
index db80023..70b4b43 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerExpandablePaymentHandlerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerExpandablePaymentHandlerTest.java
@@ -19,11 +19,11 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.payments.mojom.BasicCardNetwork;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
index 03c5bbf..2e38b9c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
@@ -19,11 +19,11 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.payments.mojom.BasicCardNetwork;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressAndOptionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressAndOptionTest.java
index 63cd0cc..399c2f95 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressAndOptionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressAndOptionTest.java
@@ -15,11 +15,11 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.test.util.DisableAnimationsTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressChangeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressChangeTest.java
index 66505dd..373eb8c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressChangeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressChangeTest.java
@@ -14,10 +14,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.test.util.DisableAnimationsTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseDigitalGoodsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseDigitalGoodsTest.java
index c270cdce..a156540 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseDigitalGoodsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseDigitalGoodsTest.java
@@ -16,7 +16,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppSpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyListsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyListsTest.java
index b2f9a62..8592a9310 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyListsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyListsTest.java
@@ -15,9 +15,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyTest.java
index b43be80..66ac622 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyTest.java
@@ -15,9 +15,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseInvalidDetailsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseInvalidDetailsTest.java
index f2554bc7..5ccd12b0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseInvalidDetailsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseInvalidDetailsTest.java
@@ -13,7 +13,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.test.util.DisableAnimationsTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseRejectTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseRejectTest.java
index 74d84cd..31ab860 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseRejectTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseRejectTest.java
@@ -13,7 +13,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingTest.java
index 8eae3cc..3465c1d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingTest.java
@@ -15,9 +15,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppSpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingWithUpdateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingWithUpdateTest.java
index 0bee59a..013b5d9e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingWithUpdateTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingWithUpdateTest.java
@@ -15,9 +15,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppSpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUSOnlyShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUSOnlyShippingTest.java
index 2fc1ce3..0d89d58 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUSOnlyShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUSOnlyShippingTest.java
@@ -15,9 +15,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppSpeed;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUnsupportedTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUnsupportedTest.java
index deeabf93..d28f8519 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUnsupportedTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUnsupportedTest.java
@@ -13,7 +13,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.test.util.DisableAnimationsTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowTwiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowTwiceTest.java
index 63b40f2b..f1f87e0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowTwiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowTwiceTest.java
@@ -16,10 +16,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.test.util.DisableAnimationsTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java
index 94baad83..821d1b9d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java
@@ -16,10 +16,10 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.tabmodel.TabModel;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestUpdateWithTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestUpdateWithTest.java
index f9f0c86..39c12bd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestUpdateWithTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestUpdateWithTest.java
@@ -15,10 +15,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestUseStatsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestUseStatsTest.java
index 87638dc..ddbeb55 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestUseStatsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestUseStatsTest.java
@@ -15,10 +15,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/SkipToGPayHelperTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/SkipToGPayHelperTest.java
index d829675..a20e5bf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/SkipToGPayHelperTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/SkipToGPayHelperTest.java
@@ -16,11 +16,11 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.payments.MethodStrings;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/GeolocationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/GeolocationTest.java
index a3565e0..e9ae8393 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/GeolocationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/GeolocationTest.java
@@ -15,7 +15,7 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.permissions.PermissionTestRule.PermissionUpdateWaiter;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/MediaTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/MediaTest.java
index 12ea49e..d97757a1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/MediaTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/MediaTest.java
@@ -15,7 +15,7 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.permissions.PermissionTestRule.PermissionUpdateWaiter;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionNavigationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionNavigationTest.java
index f30fe54c..aa2f27c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionNavigationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionNavigationTest.java
@@ -15,7 +15,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.permissions.PermissionTestRule.DialogShownCriteria;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/QuotaTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/QuotaTest.java
index 67520a6..b32d890 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/QuotaTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/QuotaTest.java
@@ -15,7 +15,7 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.permissions.PermissionTestRule.PermissionUpdateWaiter;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHostTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHostTest.java
index d01d1e6a..c5f444c6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHostTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHostTest.java
@@ -22,7 +22,7 @@
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceTest.java
index 19ce912..ec4deb5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceTest.java
@@ -25,7 +25,7 @@
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.Criteria;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java
index 3394d25..8caccdb 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java
@@ -28,7 +28,7 @@
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/policy/CombinedPolicyProviderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/policy/CombinedPolicyProviderTest.java
index a9dfbbd..0a95424 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/policy/CombinedPolicyProviderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/policy/CombinedPolicyProviderTest.java
@@ -16,7 +16,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/portals/PortalsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/portals/PortalsTest.java
index 370db25a1..9ef6d8bf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/portals/PortalsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/portals/PortalsTest.java
@@ -22,7 +22,7 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.login.ChromeHttpAuthHandler;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java
index 4d478d2..1f146f5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java
@@ -27,7 +27,7 @@
 import org.chromium.base.test.util.TestFileUtil;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModelUtils;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/provider/ProviderBookmarksUriTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/provider/ProviderBookmarksUriTest.java
index 206a8a5..cb2c5025 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/provider/ProviderBookmarksUriTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/provider/ProviderBookmarksUriTest.java
@@ -19,7 +19,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 import java.util.Arrays;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/provider/ProviderSearchesUriTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/provider/ProviderSearchesUriTest.java
index ecd4ad9d..ab6994e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/provider/ProviderSearchesUriTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/provider/ProviderSearchesUriTest.java
@@ -19,7 +19,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 import java.util.Date;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
index 95a7652..44e28e9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
@@ -24,7 +24,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Matchers;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBar;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.notifications.NotificationTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
index e478b45d2..da403bf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
@@ -27,8 +27,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.locale.DefaultSearchEngineDialogHelperUtils;
 import org.chromium.chrome.browser.locale.DefaultSearchEnginePromoDialog;
 import org.chromium.chrome.browser.locale.DefaultSearchEnginePromoDialog.DefaultSearchEnginePromoDialogObserver;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProviderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProviderTest.java
index 72ed867..5051241 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProviderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProviderTest.java
@@ -29,8 +29,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.InMemorySharedPreferences;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.firstrun.FirstRunActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.locale.LocaleManager;
 import org.chromium.chrome.browser.searchwidget.SearchActivity.SearchActivityDelegate;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/services/GoogleServicesManagerIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/services/GoogleServicesManagerIntegrationTest.java
index 7c8452df..51e6a15 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/services/GoogleServicesManagerIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/services/GoogleServicesManagerIntegrationTest.java
@@ -14,7 +14,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/CookieControlsBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/CookieControlsBridgeTest.java
index a963031..3d950ab7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/CookieControlsBridgeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/CookieControlsBridgeTest.java
@@ -18,8 +18,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/CookieControlsServiceBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/CookieControlsServiceBridgeTest.java
index 708cb7af..81018dd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/CookieControlsServiceBridgeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/CookieControlsServiceBridgeTest.java
@@ -17,8 +17,8 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivityTest.java
index 4c91ea7..b8dc0fc 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivityTest.java
@@ -24,8 +24,8 @@
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.Criteria;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/PermissionInfoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/PermissionInfoTest.java
index 5ad8aaa..87e78f26 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/PermissionInfoTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/PermissionInfoTest.java
@@ -15,8 +15,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsTest.java
index 93f5a7a..5b803a2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsTest.java
@@ -27,9 +27,9 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.browserservices.Origin;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.nfc.NfcSystemLevelSetting;
 import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/shape_detection/ShapeDetectionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/shape_detection/ShapeDetectionTest.java
index 4486603..a314b45a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/shape_detection/ShapeDetectionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/shape_detection/ShapeDetectionTest.java
@@ -19,7 +19,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/share/LensUtilsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/share/LensUtilsTest.java
index 53b03b7..dec5fa3d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/share/LensUtilsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/share/LensUtilsTest.java
@@ -21,7 +21,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.JniMocker;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.signin.base.CoreAccountId;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java
index f683bd1..d1cccc93 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java
@@ -21,10 +21,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.compositor.layouts.OverviewModeState;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareDelegateImplIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareDelegateImplIntegrationTest.java
index b43e2131..265017b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareDelegateImplIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareDelegateImplIntegrationTest.java
@@ -18,7 +18,7 @@
 import org.chromium.base.test.util.MetricsUtils.HistogramDelta;
 import org.chromium.chrome.browser.ActivityTabProvider;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.share.ShareDelegateImpl.ShareSheetDelegate;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareSheetCoordinatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareSheetCoordinatorTest.java
index 3ec23c2..b3bda0fd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareSheetCoordinatorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareSheetCoordinatorTest.java
@@ -23,8 +23,8 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.ui.modelutil.PropertyModel;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareSheetPropertyModelBuilderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareSheetPropertyModelBuilderTest.java
index 202d00d..77aec59c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareSheetPropertyModelBuilderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareSheetPropertyModelBuilderTest.java
@@ -24,7 +24,7 @@
 import org.mockito.MockitoAnnotations;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.test.util.DummyUiActivity;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerDialogFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerDialogFragmentTest.java
index 6158f8ab..b54aa22 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerDialogFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerDialogFragmentTest.java
@@ -29,8 +29,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
 import org.chromium.chrome.test.util.browser.Features;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/ConfirmManagedSyncDataDialogIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/ConfirmManagedSyncDataDialogIntegrationTest.java
index 5aea3207..042453b9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/ConfirmManagedSyncDataDialogIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/ConfirmManagedSyncDataDialogIntegrationTest.java
@@ -10,19 +10,20 @@
 
 import androidx.test.filters.LargeTest;
 
-import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisabledTest;
-import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.content_public.browser.test.util.TestThreadUtils;
-import org.chromium.ui.test.util.DummyUiActivity;
-import org.chromium.ui.test.util.DummyUiActivityTestCase;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisabledTest;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.ui.test.util.DummyUiActivity;
+import org.chromium.ui.test.util.DummyUiActivityTestCase;
+
 /**
  * Test for {@link ConfirmManagedSyncDataDialog}
  */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SignOutDialogRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SignOutDialogRenderTest.java
index 0418d597..3451110 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SignOutDialogRenderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SignOutDialogRenderTest.java
@@ -27,7 +27,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.JniMocker;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
 import org.chromium.components.signin.GAIAServiceType;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFragmentTest.java
index 5cd2540..00f7cd12 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFragmentTest.java
@@ -34,7 +34,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Matchers;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.chrome.browser.sync.SyncTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninSignoutIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninSignoutIntegrationTest.java
index b26e928..eabdf0e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninSignoutIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninSignoutIntegrationTest.java
@@ -33,8 +33,8 @@
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.bookmarks.BookmarkModel;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.profiles.ProfileAccountManagementMetrics;
 import org.chromium.chrome.browser.sync.settings.AccountManagementFragment;
 import org.chromium.chrome.browser.tab.TabImpl;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sms/SmsReceiverInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sms/SmsReceiverInfoBarTest.java
index c9f4ae5..95afe8bd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sms/SmsReceiverInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sms/SmsReceiverInfoBarTest.java
@@ -17,7 +17,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ssl/CaptivePortalTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ssl/CaptivePortalTest.java
index 339bf41..636a91e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ssl/CaptivePortalTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ssl/CaptivePortalTest.java
@@ -21,8 +21,8 @@
 import org.chromium.base.test.params.ParameterizedCommandLineFlags;
 import org.chromium.base.test.params.ParameterizedCommandLineFlags.Switches;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java
index 40e8ec3..19e6e7f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java
@@ -22,8 +22,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.tabbed_mode.TabbedRootUiCoordinator;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/subresource_filter/SubresourceFilterTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/subresource_filter/SubresourceFilterTest.java
index 76f86056..3cbc2be 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/subresource_filter/SubresourceFilterTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/subresource_filter/SubresourceFilterTest.java
@@ -18,8 +18,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.MockSafeBrowsingApiHandler;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.AdsBlockedInfoBar;
 import org.chromium.chrome.browser.infobar.InfoBar;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsTest.java
index 1a88d8dd..c55c3aa3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsTest.java
@@ -15,8 +15,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.ntp.NewTabPage;
 import org.chromium.chrome.browser.ntp.snippets.CategoryInt;
 import org.chromium.chrome.browser.ntp.snippets.KnownCategories;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/NavigationRecorderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/NavigationRecorderTest.java
index 6995726..e5902c1e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/NavigationRecorderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/NavigationRecorderTest.java
@@ -20,7 +20,7 @@
 import org.chromium.base.Callback;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGridLayoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGridLayoutTest.java
index 577e9a9..b7f6f48c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGridLayoutTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGridLayoutTest.java
@@ -40,9 +40,9 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.GlobalDiscardableReferencePool;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.night_mode.ChromeNightModeTestUtils;
 import org.chromium.chrome.browser.ntp.NewTabPage;
 import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder.PartialBindCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupTest.java
index 4158a1d61..925734b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupTest.java
@@ -24,9 +24,9 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.explore_sites.ExploreSitesBridge;
 import org.chromium.chrome.browser.explore_sites.ExploreSitesCategory;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.native_page.ContextMenuManager;
 import org.chromium.chrome.browser.ntp.NewTabPage;
 import org.chromium.chrome.browser.suggestions.SiteSuggestion;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/AutofillTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/AutofillTest.java
index cc0d0cde..e97ac22f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/AutofillTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/AutofillTest.java
@@ -17,7 +17,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.sync.SyncTestRule.DataCriteria;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.sync.SyncTestUtil;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/BookmarksTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/BookmarksTest.java
index ee6d3d5..474a7c44 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/BookmarksTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/BookmarksTest.java
@@ -17,8 +17,8 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.bookmarks.BookmarkBridge;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.sync.SyncTestRule.DataCriteria;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java
index cfdf0422..1ac538e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java
@@ -25,11 +25,11 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.firstrun.FirstRunActivity;
 import org.chromium.chrome.browser.firstrun.FirstRunActivity.FirstRunActivityObserver;
 import org.chromium.chrome.browser.firstrun.FirstRunFlowSequencer;
 import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.SettingsActivity;
 import org.chromium.chrome.browser.sync.settings.AccountManagementFragment;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsTest.java
index 24d922f..4a275587 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsTest.java
@@ -15,7 +15,6 @@
 import android.widget.EditText;
 import android.widget.TextView;
 
-
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Rule;
@@ -27,8 +26,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
 import org.chromium.chrome.browser.settings.SettingsActivity;
 import org.chromium.chrome.browser.sync.settings.ManageSyncSettings;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsWithFakeProfileSyncServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsWithFakeProfileSyncServiceTest.java
index de0e08377..e3cc8106 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsWithFakeProfileSyncServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsWithFakeProfileSyncServiceTest.java
@@ -31,7 +31,7 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.JniMocker;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.SettingsActivity;
 import org.chromium.chrome.browser.sync.settings.ManageSyncSettings;
 import org.chromium.chrome.browser.sync.ui.PassphraseDialogFragment;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/OpenTabsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/OpenTabsTest.java
index f6c7e44..d132251 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/OpenTabsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/OpenTabsTest.java
@@ -18,7 +18,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.TabModelUtils;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsTest.java
index 596fa84a..93a6cad 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsTest.java
@@ -24,8 +24,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsWithFakeProfileSyncServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsWithFakeProfileSyncServiceTest.java
index 67f994d..8b31e1f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsWithFakeProfileSyncServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsWithFakeProfileSyncServiceTest.java
@@ -16,7 +16,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.SettingsActivity;
 import org.chromium.chrome.browser.sync.settings.SyncAndServicesSettings;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java
index 46f0375b..97feba60a6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java
@@ -19,7 +19,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.signin.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.SigninHelper;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/TypedUrlsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/TypedUrlsTest.java
index e1eb69a..e75c046 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/TypedUrlsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/TypedUrlsTest.java
@@ -17,7 +17,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.sync.SyncTestUtil;
 import org.chromium.components.sync.ModelType;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/UkmTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/UkmTest.java
index 67ba978..9d01efd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/UkmTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/UkmTest.java
@@ -15,7 +15,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.metrics.UmaSessionStats;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/PassphraseTypeDialogFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/PassphraseTypeDialogFragmentTest.java
index ff011570..427d8a9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/PassphraseTypeDialogFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/PassphraseTypeDialogFragmentTest.java
@@ -19,7 +19,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.sync.SyncTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.sync.PassphraseType;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java
index c67fc38..719273d1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java
@@ -18,10 +18,10 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationDelegateImpl;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationParams;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.components.navigation_interception.NavigationParams;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/RepostFormWarningTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/RepostFormWarningTest.java
index d7f2eaed..19258e9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/RepostFormWarningTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/RepostFormWarningTest.java
@@ -21,7 +21,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.LoadUrlParams;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/SadTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/SadTabTest.java
index 4d18ff9e..4461924 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/SadTabTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/SadTabTest.java
@@ -18,7 +18,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.ChromeTabUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabUmaTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabUmaTest.java
index fe0d7f358..5b707deb 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabUmaTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabUmaTest.java
@@ -20,8 +20,8 @@
 import org.chromium.base.test.util.MetricsUtils.HistogramDelta;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.TabbedModeTabDelegateFactory;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.share.ShareDelegate;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/UndoIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/UndoIntegrationTest.java
index ed0246da..fc26d57 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/UndoIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/UndoIntegrationTest.java
@@ -19,7 +19,7 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelUtils;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java
index 3ade53a..ca8be47 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java
@@ -23,7 +23,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ChromeTabUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreatorTest.java
index 86eaa90..a4e0665 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreatorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreatorTest.java
@@ -20,8 +20,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.WarmupManager;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java
index d6d1d3f..3ecab42 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java
@@ -23,9 +23,9 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.tabmodel.TabWindowManager.TabModelSelectorFactory;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelTest.java
index 0a0456f..9244cb2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelTest.java
@@ -16,8 +16,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.tab.TabState;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabModelMergingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabModelMergingTest.java
index cbe5d9e2..6222850 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabModelMergingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabModelMergingTest.java
@@ -29,9 +29,9 @@
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.UrlUtils;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.ChromeTabbedActivity2;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.multiwindow.MultiInstanceManager;
 import org.chromium.chrome.browser.multiwindow.MultiWindowTestHelper;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java
index d3c9f85..4e08c341 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java
@@ -24,8 +24,8 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity2;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.multiwindow.MultiWindowTestHelper;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabLaunchType;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java
index bd2de9c..3d6eaa7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java
@@ -26,9 +26,9 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/IdentityDiscControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/IdentityDiscControllerTest.java
index 42716e3..24af97f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/IdentityDiscControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/IdentityDiscControllerTest.java
@@ -17,7 +17,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.signin.SigninTestUtil;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java
index 92a57cf5..b6d06669 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java
@@ -19,8 +19,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.omnibox.UrlBarData;
 import org.chromium.chrome.browser.tab.MockTab;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarIntegrationTest.java
index fdf8f66..ddb0f105 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarIntegrationTest.java
@@ -18,7 +18,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.WebContents;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarTest.java
index 6a50c41..df4931c0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarTest.java
@@ -18,8 +18,8 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.findinpage.FindToolbar;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.omnibox.UrlBar;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarTest.java
index 7d4b2a1f..48836d3b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarTest.java
@@ -27,9 +27,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.toolbar.bottom.BottomToolbarVariationManager.Variations;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarWithStartSurfaceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarWithStartSurfaceTest.java
index b3507df..034f37f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarWithStartSurfaceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarWithStartSurfaceTest.java
@@ -17,10 +17,10 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.compositor.layouts.OverviewModeState;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.toolbar.bottom.BottomToolbarVariationManager.Variations;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/AdaptiveToolbarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/AdaptiveToolbarTest.java
index da3df4f..3060da7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/AdaptiveToolbarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/AdaptiveToolbarTest.java
@@ -35,11 +35,11 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.incognito.IncognitoUtils;
 import org.chromium.chrome.browser.toolbar.bottom.BottomToolbarVariationManager;
 import org.chromium.chrome.browser.toolbar.bottom.BottomToolbarVariationManager.Variations;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/BrandColorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/BrandColorTest.java
index 8625dfd..179e522 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/BrandColorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/BrandColorTest.java
@@ -25,7 +25,7 @@
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabImpl;
 import org.chromium.chrome.browser.tab.TabObserver;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuTest.java
index ef7f660..9d8ba137 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuTest.java
@@ -23,7 +23,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.ui.test.util.DummyUiActivityTestCase;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tracing/settings/TracingSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tracing/settings/TracingSettingsTest.java
index e3a20ab..c53c313 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tracing/settings/TracingSettingsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tracing/settings/TracingSettingsTest.java
@@ -32,7 +32,7 @@
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.ButtonPreference;
 import org.chromium.chrome.browser.settings.SettingsActivity;
 import org.chromium.chrome.browser.settings.SettingsLauncher;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/translate/TranslateCompactInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/translate/TranslateCompactInfoBarTest.java
index d11c23d..be2fbf76 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/translate/TranslateCompactInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/translate/TranslateCompactInfoBarTest.java
@@ -20,7 +20,7 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.infobar.InfoBar;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.infobar.TranslateCompactInfoBar;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java
index 11ecb818..1608e0d4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java
@@ -25,10 +25,10 @@
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarControllerTest.java
index 57b6501..d9a5581 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarControllerTest.java
@@ -17,7 +17,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/usage_stats/TabSuspensionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/usage_stats/TabSuspensionTest.java
index 31364e1..5173510d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/usage_stats/TabSuspensionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/usage_stats/TabSuspensionTest.java
@@ -27,12 +27,12 @@
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.ChromeTabbedActivity2;
 import org.chromium.chrome.browser.MockSafeBrowsingApiHandler;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.multiwindow.MultiWindowTestHelper;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/video/FullscreenVideoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/video/FullscreenVideoTest.java
index c5c90b11..939eb16 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/video/FullscreenVideoTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/video/FullscreenVideoTest.java
@@ -18,7 +18,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager.FullscreenListener;
 import org.chromium.chrome.browser.fullscreen.FullscreenOptions;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/video/VideoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/video/VideoTest.java
index fb11094db..0150d90 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/video/VideoTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/video/VideoTest.java
@@ -18,7 +18,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserCompositorViewHolderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserCompositorViewHolderTest.java
index bb5d3da..ee4adf8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserCompositorViewHolderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserCompositorViewHolderTest.java
@@ -19,8 +19,8 @@
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.compositor.CompositorViewHolder;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.vr.rules.ChromeTabbedActivityVrTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.WebContents;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserControllerInputTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserControllerInputTest.java
index 8bc49122..f43c3d3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserControllerInputTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserControllerInputTest.java
@@ -25,7 +25,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.history.HistoryPage;
 import org.chromium.chrome.browser.vr.rules.ChromeTabbedActivityVrTestRule;
 import org.chromium.chrome.browser.vr.util.NativeUiUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserDialogTest.java
index 3606429..f2686e1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserDialogTest.java
@@ -25,7 +25,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.settings.website.ContentSettingValues;
 import org.chromium.chrome.browser.settings.website.PermissionInfo;
 import org.chromium.chrome.browser.vr.rules.ChromeTabbedActivityVrTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNativeUiTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNativeUiTest.java
index 9a9db2f5..51df427 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNativeUiTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNativeUiTest.java
@@ -24,7 +24,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.payments.ui.PaymentRequestUI;
 import org.chromium.chrome.browser.payments.ui.PaymentRequestUI.PaymentRequestObserverForTest;
 import org.chromium.chrome.browser.vr.rules.ChromeTabbedActivityVrTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNavigationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNavigationTest.java
index 743fe46..4e59384 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNavigationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNavigationTest.java
@@ -28,7 +28,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.history.HistoryItemView;
 import org.chromium.chrome.browser.history.HistoryPage;
 import org.chromium.chrome.browser.ntp.NewTabPage;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java
index c6d2d80e..8851d48 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java
@@ -35,8 +35,8 @@
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.ntp.IncognitoNewTabPage;
 import org.chromium.chrome.browser.settings.SettingsActivity;
 import org.chromium.chrome.browser.settings.SettingsLauncher;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserWebInputEditingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserWebInputEditingTest.java
index db9477c..5bf71e57 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserWebInputEditingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserWebInputEditingTest.java
@@ -26,7 +26,7 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.vr.keyboard.TextEditAction;
 import org.chromium.chrome.browser.vr.mock.MockBrowserKeyboardInterface;
 import org.chromium.chrome.browser.vr.rules.ChromeTabbedActivityVrTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrDaydreamReadyModuleInstallTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrDaydreamReadyModuleInstallTest.java
index 0e30f86..4b8cded9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrDaydreamReadyModuleInstallTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrDaydreamReadyModuleInstallTest.java
@@ -23,7 +23,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.vr.rules.VrModuleNotInstalled;
 import org.chromium.chrome.browser.vr.rules.XrActivityRestriction;
 import org.chromium.chrome.browser.vr.util.VrTestRuleUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrFeedbackInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrFeedbackInfoBarTest.java
index 57dd508..b5e81e8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrFeedbackInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrFeedbackInfoBarTest.java
@@ -22,7 +22,7 @@
 import org.chromium.base.test.BundleTestRule;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.vr.rules.ChromeTabbedActivityVrTestRule;
 import org.chromium.chrome.browser.vr.util.VrBrowserTransitionUtils;
 import org.chromium.chrome.browser.vr.util.VrInfoBarUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java
index cb8c9860..6eb63a4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java
@@ -30,7 +30,7 @@
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.vr.keyboard.GvrKeyboardLoaderClient;
 import org.chromium.chrome.browser.vr.rules.XrActivityRestriction;
 import org.chromium.chrome.browser.vr.util.NativeUiUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArHitTestTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArHitTestTest.java
index a1ece7d..eaaaed8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArHitTestTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArHitTestTest.java
@@ -21,7 +21,7 @@
 import org.chromium.base.test.params.ParameterizedRunner;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.vr.rules.ArPlaybackFile;
 import org.chromium.chrome.browser.vr.rules.XrActivityRestriction;
 import org.chromium.chrome.browser.vr.util.ArTestRuleUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java
index c3eb3505..ea6bf893 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java
@@ -22,7 +22,7 @@
 import org.chromium.base.test.params.ParameterizedRunner;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.vr.rules.XrActivityRestriction;
 import org.chromium.chrome.browser.vr.util.ArTestRuleUtils;
 import org.chromium.chrome.browser.vr.util.PermissionUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrConsentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrConsentTest.java
index ac7054f..17b9ddd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrConsentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrConsentTest.java
@@ -23,7 +23,7 @@
 import org.chromium.base.test.params.ParameterizedRunner;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.vr.rules.XrActivityRestriction;
 import org.chromium.chrome.browser.vr.util.VrTestRuleUtils;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java
index 75511af..275645ab 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java
@@ -27,7 +27,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.vr.rules.XrActivityRestriction;
 import org.chromium.chrome.browser.vr.util.NativeUiUtils;
 import org.chromium.chrome.browser.vr.util.NfcSimUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrInputTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrInputTest.java
index 3aa7d690..e998fa0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrInputTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrInputTest.java
@@ -35,7 +35,7 @@
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.vr.mock.MockVrDaydreamApi;
 import org.chromium.chrome.browser.vr.rules.XrActivityRestriction;
 import org.chromium.chrome.browser.vr.util.NativeUiUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java
index 0b6921c..0d2c900 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java
@@ -25,7 +25,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.vr.util.NativeUiUtils;
 import org.chromium.chrome.browser.vr.util.PermissionUtils;
 import org.chromium.chrome.browser.vr.util.VrTestRuleUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java
index d3e62c9..76fbb96 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java
@@ -39,8 +39,8 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.vr.rules.VrSettingsFile;
 import org.chromium.chrome.browser.vr.rules.XrActivityRestriction;
 import org.chromium.chrome.browser.vr.util.NativeUiUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/jsdialog/VrBrowserJavaScriptModalDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/jsdialog/VrBrowserJavaScriptModalDialogTest.java
index 1895497..6b5afcc 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/jsdialog/VrBrowserJavaScriptModalDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/jsdialog/VrBrowserJavaScriptModalDialogTest.java
@@ -20,8 +20,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.vr.UserFriendlyElementName;
 import org.chromium.chrome.browser.vr.VrBrowserTestFramework;
 import org.chromium.chrome.browser.vr.rules.ChromeTabbedActivityVrTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkActivityTest.java
index 1ee9906..0fb6964 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkActivityTest.java
@@ -21,8 +21,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.TabTestUtils;
 import org.chromium.chrome.browser.tab.TabWebContentsDelegateAndroid;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkInitializationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkInitializationTest.java
index c3e11b1d..29e3704 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkInitializationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkInitializationTest.java
@@ -16,9 +16,9 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.dependency_injection.ChromeActivityCommonsModule;
 import org.chromium.chrome.browser.dependency_injection.ModuleOverridesRule;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.LifecycleObserver;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkIntegrationTest.java
index d6cd430..d74346e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkIntegrationTest.java
@@ -19,7 +19,7 @@
 import org.chromium.base.CommandLine;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.test.MockCertVerifierRuleAndroid;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java
index c9d69e6..2315374 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java
@@ -17,8 +17,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
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 4daa478..0f7e961 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
@@ -19,9 +19,9 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationTest.java
index 601b395..e45c3a6c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationTest.java
@@ -27,9 +27,9 @@
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.notifications.NotificationConstants;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.Criteria;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappDisplayModeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappDisplayModeTest.java
index 762a239..597255b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappDisplayModeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappDisplayModeTest.java
@@ -20,8 +20,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.omnibox.UrlBar;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.webapps.WebappTestPage;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java
index 61bb8c55..3ee6030 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java
@@ -24,10 +24,10 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.document.ChromeIntentUtil;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappNavigationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappNavigationTest.java
index 9461128..1ab43d18 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappNavigationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappNavigationTest.java
@@ -32,11 +32,11 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.test.MockCertVerifierRuleAndroid;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenBackgroundColorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenBackgroundColorTest.java
index a5e000f..cad248c6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenBackgroundColorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenBackgroundColorTest.java
@@ -16,8 +16,8 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenHomescreenIconTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenHomescreenIconTest.java
index 28f2a44..6da95ec 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenHomescreenIconTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenHomescreenIconTest.java
@@ -18,8 +18,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenIconTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenIconTest.java
index 5a34b51..8442abc7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenIconTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenIconTest.java
@@ -18,8 +18,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
 /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
index 971b7219..0579587 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
@@ -29,8 +29,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabTestUtils;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java
index f9b061e..90483d7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java
@@ -17,8 +17,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.ThemeTestUtils;
 import org.chromium.ui.test.util.UiRestriction;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenTest.java
index 2feab4c..0909651d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenTest.java
@@ -27,8 +27,8 @@
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.webapps.WebappDataStorage;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java
index 42c9a9e..5a51bf3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java
@@ -22,7 +22,7 @@
 import org.chromium.blink.mojom.PublicKeyCredentialCreationOptions;
 import org.chromium.blink.mojom.PublicKeyCredentialRequestOptions;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java
index 35223b0..e35a604 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java
@@ -24,7 +24,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.share.ShareHelper;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/ScrimTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/ScrimTest.java
index d9ad172..6a1cbc6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/ScrimTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/ScrimTest.java
@@ -25,8 +25,8 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.omnibox.UrlBar;
 import org.chromium.chrome.browser.widget.ScrimView.ScrimObserver;
 import org.chromium.chrome.browser.widget.ScrimView.ScrimParams;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetControllerTest.java
index ac401c8..5c9d78d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetControllerTest.java
@@ -25,8 +25,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabLaunchType;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/test/crash/IntentionalCrashTest.java b/chrome/android/javatests/src/org/chromium/chrome/test/crash/IntentionalCrashTest.java
index 926f040..1b026f45 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/test/crash/IntentionalCrashTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/test/crash/IntentionalCrashTest.java
@@ -13,7 +13,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
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 0175bff..098c025 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
@@ -281,7 +281,7 @@
                 doAnswer(new Answer<Void>() {
                     @Override
                     public Void answer(InvocationOnMock invocation) {
-                        mBrowserParts.getValue().onStartupFailure();
+                        mBrowserParts.getValue().onStartupFailure(null);
                         return null;
                     }
                 })
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 fe7c211..200a9d9 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
@@ -64,7 +64,7 @@
                 mLatch.countDown();
             }
             @Override
-            protected void onFailure() {
+            protected void onFailure(Exception failureCause) {
                 mLatch.countDown();
             }
             @Override
@@ -96,15 +96,14 @@
 
     @Test
     public void libraryLoaderFailTest() throws InterruptedException {
-        doThrow(new ProcessInitException(LoaderErrors.NATIVE_LIBRARY_LOAD_FAILED))
-                .when(mLoader)
-                .ensureInitialized();
+        Exception failureCause = new ProcessInitException(LoaderErrors.NATIVE_LIBRARY_LOAD_FAILED);
+        doThrow(failureCause).when(mLoader).ensureInitialized();
         mRunner.startBackgroundTasks(false, false);
 
         Robolectric.flushBackgroundThreadScheduler();
         Robolectric.flushForegroundThreadScheduler();
         assertTrue(mLatch.await(0, TimeUnit.SECONDS));
-        verify(mRunner).onFailure();
+        verify(mRunner).onFailure(failureCause);
         verify(mVariationsSeedFetcher, never()).fetchSeed(anyString(), anyString(), anyString());
     }
 
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 926d5ea..6309218 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-82.0.4077.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-82.0.4078.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index ea23c54f..81aed98d 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -347,6 +347,9 @@
   <message name="IDS_SETTINGS_COMPROMISED_PASSWORD_REASON_PHISHED" desc="Password compromise reason shown when a password was reused on a phishing site.">
     Entered on deceptive site
   </message>
+  <message name="IDS_SETTINGS_NO_COMPROMISED_CREDENTIALS_LABEL" desc="Label which is shown when there were no compromised passwords detected.">
+    Chrome will notify you when you sign in with a compromised password
+  </message>
   <message name="IDS_SETTINGS_PASSWORDS_SAVE_PASSWORDS_TOGGLE_LABEL" desc="Label for a toggle that allows users to be prompted if they want to save their passwords when logging into webpages.">
     Offer to save passwords
   </message>
@@ -1798,7 +1801,7 @@
   <message name="IDS_SETTINGS_SEARCH_MANAGE_SEARCH_ENGINES" desc="Label for the Manage Search Engines button.">
     Manage search engines
   </message>
-  
+
   <!-- Search Engines Page -->
   <message name="IDS_SETTINGS_SEARCH_ENGINES" desc="Name of the settings page which manages search engines.">
     Search Engines
@@ -2756,23 +2759,20 @@
   <message name="IDS_SETTINGS_PERSONALIZE_GOOGLE_SERVICES_TITLE" desc="Title of the personalize Google services section. When clicked, takes the user to the Google Activity Controls.">
     Control how your browsing history is used to personalize Search, ads, and more
   </message>
-  <message name="IDS_SETTINGS_USE_HISTORY_TO_PERSONALIZE_GOOGLE_SERVICES_TITLE" desc="Title of the use your history to personalize Google services section. When clicked, takes the user to the Google Activity Controls." translateable="false">
-    Use your History to personalize Search and other Google services
+  <message name="IDS_SETTINGS_USE_HISTORY_TO_PERSONALIZE_GOOGLE_SERVICES_TITLE" desc="Title of the use your history to personalize Google services section. When clicked, takes the user to the Google Activity Controls.">
+    Use your browsing history to personalize Search, ads and other Google services
   </message>
-  <message name="IDS_SETTINGS_SWAA_ON" desc="The sWAA state that shows in the use history to personalize google services row" translateable="false">
+  <message name="IDS_SETTINGS_SWAA_ON" desc="The sWAA state that shows in the use history to personalize google services row">
     On
   </message>
-  <message name="IDS_SETTINGS_SWAA_OFF" desc="The sWAA state that shows in the use history to personalize google services row" translateable="false">
+  <message name="IDS_SETTINGS_SWAA_OFF" desc="The sWAA state that shows in the use history to personalize google services row">
     Off
   </message>
-  <message name="IDS_SETTINGS_SWAA_ON_HINT" desc="Hint that shows when sWAA is On in the use history to personalize google services row" translateable="false">
-    For example, get suggestions in YouTube based on Chrome browsing
+  <message name="IDS_SETTINGS_DATA_ENCRYPTED_HINT" desc="Hint that shows when sWAA is off in the use history to personalize google services row because data is encrypted with custom passphrase">
+    Turned off because you encrypted your sync data with a passphrase
   </message>
-  <message name="IDS_SETTINGS_DATA_ENCRYPTED_HINT" desc="Hint that shows when sWAA is off in the use history to personalize google services row because data is encrypted with custom passphrase" translateable="false">
-    Your synced data was encrypted
-  </message>
-   <message name="IDS_SETTINGS_HISTORY_SYNC_OFF_HINT" desc="Hint that shows when sWAA is off in the use history to personalize google services row because history sync is off" translateable="false">
-    Turned off because you disabled syncing history
+   <message name="IDS_SETTINGS_HISTORY_SYNC_OFF_HINT" desc="Hint that shows when sWAA is off in the use history to personalize google services row because history sync is off">
+    Turned off because you disabled history sync
   </message>
    <message name="IDS_SETTINGS_SWAA_OFF_HINT" desc="Hint that shows when sWAA is off in the use history to personalize google services row because history recording is disabled in Web and App Activity" translateable="false">
     History recording is turned off in Activity controls.
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_NO_COMPROMISED_CREDENTIALS_LABEL.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_NO_COMPROMISED_CREDENTIALS_LABEL.png.sha1
new file mode 100644
index 0000000..fa820dc
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_NO_COMPROMISED_CREDENTIALS_LABEL.png.sha1
@@ -0,0 +1 @@
+d32cf4d916e0a0554820938d144d3cf4bc07440e
\ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 2c0fe069..219c0c9 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -4939,6 +4939,13 @@
      FEATURE_VALUE_TYPE(ash::features::kMultiDisplayOverviewAndSplitView)},
 #endif  // defined(OS_CHROMEOS)
 
+#if defined(OS_WIN)
+    {"enable-media-foundation-video-capture",
+     flag_descriptions::kEnableMediaFoundationVideoCaptureName,
+     flag_descriptions::kEnableMediaFoundationVideoCaptureDescription, kOsWin,
+     FEATURE_VALUE_TYPE(media::kMediaFoundationVideoCapture)},
+#endif  // defined(OS_WIN)
+
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java b/chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java
index 3b4013f7..9f342c8a 100644
--- a/chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java
+++ b/chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java
@@ -15,11 +15,11 @@
 
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge;
 import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge.OnClearBrowsingDataListener;
 import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
 import org.chromium.chrome.browser.browsing_data.TimePeriod;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.metrics.util.UkmUtilsForTest;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.cc b/chrome/browser/android/tab_web_contents_delegate_android.cc
index 2f4f416..001e858f 100644
--- a/chrome/browser/android/tab_web_contents_delegate_android.cc
+++ b/chrome/browser/android/tab_web_contents_delegate_android.cc
@@ -66,6 +66,7 @@
 #include "content/public/browser/web_contents.h"
 #include "third_party/blink/public/common/mediastream/media_stream_request.h"
 #include "third_party/blink/public/mojom/frame/blocked_navigation_types.mojom.h"
+#include "third_party/blink/public/mojom/window_features/window_features.mojom.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/rect_f.h"
 #include "url/origin.h"
diff --git a/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm b/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm
index 1962c65..3b323d3c 100644
--- a/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm
+++ b/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm
@@ -35,6 +35,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/browser/web_applications/components/web_app_shortcut_mac.h"
 #include "chrome/browser/web_applications/extensions/web_app_extension_shortcut.h"
 #include "chrome/common/chrome_features.h"
@@ -43,10 +44,15 @@
 #include "content/public/test/test_utils.h"
 #include "extensions/browser/app_window/native_app_window.h"
 #include "extensions/browser/extension_prefs.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/common/extension.h"
 #include "extensions/test/extension_test_message_listener.h"
 #import "ui/base/test/windowed_nsnotification_observer.h"
 #import "ui/events/test/cocoa_test_event_utils.h"
 
+using extensions::Extension;
+using extensions::ExtensionRegistry;
+
 namespace {
 
 // General end-to-end test for app shims.
@@ -164,9 +170,7 @@
 
   // BrowserListObserver overrides:
   void OnBrowserAdded(Browser* browser) override {
-    const extensions::Extension* app =
-        apps::ExtensionAppShimHandler::MaybeGetAppForBrowser(browser);
-    if (app && app->id() == app_id_) {
+    if (web_app::GetAppIdFromApplicationName(browser->app_name()) == app_id_) {
       observed_add_ = true;
       if (run_loop_.get())
         run_loop_->Quit();
@@ -174,9 +178,7 @@
   }
 
   void OnBrowserRemoved(Browser* browser) override {
-    const extensions::Extension* app =
-        apps::ExtensionAppShimHandler::MaybeGetAppForBrowser(browser);
-    if (app && app->id() == app_id_) {
+    if (web_app::GetAppIdFromApplicationName(browser->app_name()) == app_id_) {
       observed_removed_ = true;
       if (run_loop_.get())
         run_loop_->Quit();
@@ -254,8 +256,10 @@
 
 Browser* GetFirstHostedAppWindow() {
   for (Browser* browser : *BrowserList::GetInstance()) {
-    const extensions::Extension* extension =
-        apps::ExtensionAppShimHandler::MaybeGetAppForBrowser(browser);
+    const std::string app_id =
+        web_app::GetAppIdFromApplicationName(browser->app_name());
+    ExtensionRegistry* registry = ExtensionRegistry::Get(browser->profile());
+    const Extension* extension = registry->enabled_extensions().GetByID(app_id);
     if (extension && extension->is_hosted_app())
       return browser;
   }
diff --git a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc
index 6278e30..40cd2ece 100644
--- a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc
+++ b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc
@@ -202,6 +202,20 @@
   return a->menu_index < b->menu_index;
 }
 
+const Extension* MaybeGetAppExtension(content::BrowserContext* context,
+                                      const std::string& extension_id) {
+  if (!context)
+    return nullptr;
+
+  ExtensionRegistry* registry = ExtensionRegistry::Get(context);
+  const Extension* extension =
+      registry->GetExtensionById(extension_id, ExtensionRegistry::ENABLED);
+  return extension &&
+                 (extension->is_platform_app() || extension->is_hosted_app())
+             ? extension
+             : nullptr;
+}
+
 }  // namespace
 
 namespace apps {
@@ -332,16 +346,14 @@
 bool ExtensionAppShimHandler::Delegate::AppIsInstalled(
     Profile* profile,
     const std::string& app_id) {
-  const Extension* extension =
-      ExtensionAppShimHandler::MaybeGetAppExtension(profile, app_id);
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
   return profile && extension;
 }
 
 bool ExtensionAppShimHandler::Delegate::AppCanCreateHost(
     Profile* profile,
     const std::string& app_id) {
-  const Extension* extension =
-      ExtensionAppShimHandler::MaybeGetAppExtension(profile, app_id);
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
   if (!profile || !extension)
     return false;
   if (extension->is_hosted_app() &&
@@ -357,8 +369,7 @@
 bool ExtensionAppShimHandler::Delegate::AppIsMultiProfile(
     Profile* profile,
     const std::string& app_id) {
-  const Extension* extension =
-      ExtensionAppShimHandler::MaybeGetAppExtension(profile, app_id);
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
   if (!profile || !extension)
     return false;
   return extension->from_bookmark();
@@ -367,8 +378,7 @@
 bool ExtensionAppShimHandler::Delegate::AppUsesRemoteCocoa(
     Profile* profile,
     const std::string& app_id) {
-  const Extension* extension =
-      ExtensionAppShimHandler::MaybeGetAppExtension(profile, app_id);
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
   if (!profile || !extension)
     return false;
   return extension->is_hosted_app() && extension->from_bookmark();
@@ -387,8 +397,7 @@
     Profile* profile,
     const std::string& app_id,
     base::OnceCallback<void()> callback) {
-  const Extension* extension =
-      ExtensionAppShimHandler::MaybeGetAppExtension(profile, app_id);
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
   if (extension)
     std::move(callback).Run();
   else
@@ -399,8 +408,7 @@
     Profile* profile,
     const std::string& app_id,
     const std::vector<base::FilePath>& files) {
-  const extensions::Extension* extension =
-      ExtensionAppShimHandler::MaybeGetAppExtension(profile, app_id);
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
   DCHECK(extension);
   extensions::RecordAppLaunchType(
       extension_misc::APP_LAUNCH_CMD_LINE_APP, extension->GetType());
@@ -447,8 +455,7 @@
     bool recreate_shims,
     apps::ShimLaunchedCallback launched_callback,
     apps::ShimTerminatedCallback terminated_callback) {
-  const Extension* extension =
-      ExtensionAppShimHandler::MaybeGetAppExtension(profile, app_id);
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
   if (!extension) {
     std::move(launched_callback).Run(base::Process());
     return;
@@ -526,33 +533,6 @@
   return profile_state->GetHost();
 }
 
-// static
-const Extension* ExtensionAppShimHandler::MaybeGetAppExtension(
-    content::BrowserContext* context,
-    const std::string& extension_id) {
-  if (!context)
-    return NULL;
-
-  ExtensionRegistry* registry = ExtensionRegistry::Get(context);
-  const Extension* extension =
-      registry->GetExtensionById(extension_id, ExtensionRegistry::ENABLED);
-  return extension &&
-                 (extension->is_platform_app() || extension->is_hosted_app())
-             ? extension
-             : NULL;
-}
-
-// static
-const Extension* ExtensionAppShimHandler::MaybeGetAppForBrowser(
-    Browser* browser) {
-  if (!browser || !browser->deprecated_is_app())
-    return NULL;
-
-  return MaybeGetAppExtension(
-      browser->profile(),
-      web_app::GetAppIdFromApplicationName(browser->app_name()));
-}
-
 void ExtensionAppShimHandler::OnShimLaunchRequested(
     AppShimHost* host,
     bool recreate_shims,
diff --git a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h
index c667dafa..9f51238 100644
--- a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h
+++ b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h
@@ -22,7 +22,6 @@
 #include "chrome/browser/ui/browser_list_observer.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
-#include "extensions/browser/app_window/app_window_registry.h"
 
 class Profile;
 
@@ -34,10 +33,6 @@
 class BrowserContext;
 }  // namespace content
 
-namespace extensions {
-class Extension;
-}  // namespace extensions
-
 namespace apps {
 
 // This app shim handler that handles events for app shims that correspond to an
@@ -149,12 +144,6 @@
   // finishes launching.
   AppShimHost* GetHostForRemoteCocoaBrowser(Browser* browser);
 
-  static const extensions::Extension* MaybeGetAppExtension(
-      content::BrowserContext* context,
-      const std::string& extension_id);
-
-  static const extensions::Extension* MaybeGetAppForBrowser(Browser* browser);
-
   // AppShimHostBootstrap::Client:
   void OnShimProcessConnected(
       std::unique_ptr<AppShimHostBootstrap> bootstrap) override;
diff --git a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac_unittest.cc b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac_unittest.cc
index 5ccabd6..41919c21 100644
--- a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac_unittest.cc
+++ b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac_unittest.cc
@@ -26,8 +26,6 @@
 #include "components/prefs/testing_pref_service.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/test/browser_task_environment.h"
-#include "extensions/common/extension.h"
-#include "extensions/common/extension_builder.h"
 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
@@ -36,9 +34,6 @@
 
 namespace apps {
 
-using extensions::Extension;
-typedef extensions::AppWindowRegistry::AppWindowList AppWindowList;
-
 using ::base::test::RunOnceCallback;
 using ::testing::_;
 using ::testing::Invoke;
@@ -361,13 +356,6 @@
     host_bb_ = host_bb_unique_->GetWeakPtr();
 
     base::FilePath extension_path("/fake/path");
-    extension_a_ =
-        extensions::ExtensionBuilder("Fake Name")
-            .SetLocation(extensions::Manifest::INTERNAL)
-            .SetPath(extension_path)
-            .SetID(kTestAppIdA)
-            .AddFlags(extensions::Extension::InitFromValueFlags::FROM_BOOKMARK)
-            .Build();
 
     EXPECT_CALL(*delegate_, AppIsMultiProfile(_, kTestAppIdA))
         .WillRepeatedly(Return(true));
@@ -377,12 +365,6 @@
     EXPECT_CALL(*delegate_, AppUsesRemoteCocoa(_, _))
         .WillRepeatedly(Return(true));
 
-    extension_b_ = extensions::ExtensionBuilder("Fake Name")
-                       .SetLocation(extensions::Manifest::INTERNAL)
-                       .SetPath(extension_path)
-                       .SetID(kTestAppIdB)
-                       .Build();
-
     {
       auto item_a = chrome::mojom::ProfileMenuItem::New();
       item_a->profile_path = profile_path_a_;
@@ -539,9 +521,6 @@
   base::WeakPtr<TestHost> host_ba_;
   base::WeakPtr<TestHost> host_bb_;
 
-  scoped_refptr<const Extension> extension_a_;
-  scoped_refptr<const Extension> extension_b_;
-
  private:
   std::unique_ptr<TestingPrefServiceSimple> local_state_;
   DISALLOW_COPY_AND_ASSIGN(ExtensionAppShimHandlerTest);
@@ -595,7 +574,7 @@
   // App not found.
   EXPECT_CALL(*delegate_, AppIsInstalled(&profile_a_, kTestAppIdA))
       .WillOnce(Return(false))
-      .WillRepeatedly(Return(extension_a_.get()));
+      .WillRepeatedly(Return(true));
   EXPECT_CALL(*delegate_, EnableExtension(&profile_a_, kTestAppIdA, _))
       .WillOnce(RunOnceCallback<2>());
   NormalLaunch(bootstrap_aa_, std::move(host_aa_unique_));
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 0d3a4c5..2970aac 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -107,6 +107,7 @@
 #include "chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_io_data.h"
+#include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/profiles/renderer_updater.h"
 #include "chrome/browser/profiles/renderer_updater_factory.h"
 #include "chrome/browser/profiling_host/chrome_browser_main_extra_parts_profiling.h"
@@ -1120,6 +1121,7 @@
   metadata.full_version = version_info::GetVersionNumber();
   metadata.major_version = version_info::GetMajorVersionNumber();
   metadata.platform = version_info::GetOSType();
+  metadata.platform_version = content::GetOSVersion(false);
   metadata.architecture = content::BuildCpuInfo();
   metadata.model = content::BuildModelInfo();
 
@@ -5000,6 +5002,11 @@
   }
 }
 
+base::FilePath
+ChromeContentBrowserClient::GetSandboxedStorageServiceDataDirectory() {
+  return g_browser_process->profile_manager()->user_data_dir();
+}
+
 content::PreviewsState ChromeContentBrowserClient::DetermineAllowedPreviews(
     content::PreviewsState initial_state,
     content::NavigationHandle* navigation_handle,
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index ae3e827..921b5af 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -559,7 +559,7 @@
   void OnNetworkServiceDataUseUpdate(int32_t network_traffic_annotation_id_hash,
                                      int64_t recv_bytes,
                                      int64_t sent_bytes) override;
-
+  base::FilePath GetSandboxedStorageServiceDataDirectory() override;
   content::PreviewsState DetermineAllowedPreviews(
       content::PreviewsState initial_state,
       content::NavigationHandle* navigation_handle,
diff --git a/chrome/browser/chrome_navigation_browsertest.cc b/chrome/browser/chrome_navigation_browsertest.cc
index d03e024..9c422f4 100644
--- a/chrome/browser/chrome_navigation_browsertest.cc
+++ b/chrome/browser/chrome_navigation_browsertest.cc
@@ -95,22 +95,12 @@
     test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>();
   }
 
-  void StartServerWithExpiredCert() {
-    expired_https_server_.reset(
-        new net::EmbeddedTestServer(net::EmbeddedTestServer::TYPE_HTTPS));
-    expired_https_server_->SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
-    expired_https_server_->AddDefaultHandlers(GetChromeTestDataDir());
-    ASSERT_TRUE(expired_https_server_->Start());
+  ukm::TestAutoSetUkmRecorder* test_ukm_recorder() {
+    return test_ukm_recorder_.get();
   }
 
-  net::EmbeddedTestServer* expired_https_server() {
-    return expired_https_server_.get();
-  }
-
-  std::unique_ptr<ukm::TestAutoSetUkmRecorder> test_ukm_recorder_;
-
  private:
-  std::unique_ptr<net::EmbeddedTestServer> expired_https_server_;
+  std::unique_ptr<ukm::TestAutoSetUkmRecorder> test_ukm_recorder_;
   base::test::ScopedFeatureList scoped_feature_list_;
 
   DISALLOW_COPY_AND_ASSIGN(ChromeNavigationBrowserTest);
@@ -1443,9 +1433,9 @@
   // Verify UKM.
   using Entry = ukm::builders::HistoryManipulationIntervention;
   const auto& ukm_entries =
-      test_ukm_recorder_->GetEntriesByName(Entry::kEntryName);
+      test_ukm_recorder()->GetEntriesByName(Entry::kEntryName);
   EXPECT_EQ(1u, ukm_entries.size());
-  test_ukm_recorder_->ExpectEntrySourceHasUrl(ukm_entries[0], skippable_url);
+  test_ukm_recorder()->ExpectEntrySourceHasUrl(ukm_entries[0], skippable_url);
 
   // Verify the metric where user tries to go specifically to a skippable entry
   // using long press.
@@ -1481,9 +1471,9 @@
   // Verify UKM.
   using Entry = ukm::builders::HistoryManipulationIntervention;
   const auto& ukm_entries =
-      test_ukm_recorder_->GetEntriesByName(Entry::kEntryName);
+      test_ukm_recorder()->GetEntriesByName(Entry::kEntryName);
   EXPECT_EQ(1u, ukm_entries.size());
-  test_ukm_recorder_->ExpectEntrySourceHasUrl(ukm_entries[0], skippable_url);
+  test_ukm_recorder()->ExpectEntrySourceHasUrl(ukm_entries[0], skippable_url);
 }
 
 // TODO(csharrison): These tests should become tentative WPT, once the feature
diff --git a/chrome/browser/chromeos/crostini/crostini_disk.cc b/chrome/browser/chromeos/crostini/crostini_disk.cc
index 1ece916..4f7151972 100644
--- a/chrome/browser/chromeos/crostini/crostini_disk.cc
+++ b/chrome/browser/chromeos/crostini/crostini_disk.cc
@@ -38,7 +38,6 @@
 CrostiniDiskInfo::~CrostiniDiskInfo() = default;
 
 namespace disk {
-
 void GetDiskInfo(OnceDiskInfoCallback callback,
                  Profile* profile,
                  std::string vm_name) {
@@ -78,6 +77,7 @@
     vm_tools::concierge::ListVmDisksRequest request;
     request.set_cryptohome_id(CryptohomeIdForProfile(profile));
     request.set_storage_location(vm_tools::concierge::STORAGE_CRYPTOHOME_ROOT);
+    request.set_vm_name(vm_name);
     GetConciergeClient()->ListVmDisks(
         std::move(request), base::BindOnce(&OnListVmDisks, std::move(callback),
                                            std::move(vm_name), free_space));
@@ -118,6 +118,11 @@
     std::move(callback).Run(std::move(disk_info));
     return;
   }
+  if (image->min_size() == 0) {
+    LOG(ERROR) << "Unable to get minimum disk size";
+    std::move(callback).Run(nullptr);
+    return;
+  }
   disk_info->is_user_chosen_size = image->user_chosen_size();
   disk_info->can_resize =
       image->image_type() == vm_tools::concierge::DiskImageType::DISK_IMAGE_RAW;
@@ -143,7 +148,15 @@
     int64_t current,
     int64_t max,
     int* out_default_index) {
-  if (min > current || current > max) {
+  if (current < min) {
+    // btrfs is conservative, sometimes it won't let us resize to what the user
+    // currently has. In those cases act like the current size is the same as
+    // the minimum.
+    VLOG(1) << "Minimum size is larger than the current, setting current = min";
+    current = min;
+  }
+  if (current > max) {
+    LOG(ERROR) << "current > max";
     return {};
   }
   std::vector<int64_t> values = GetTicksForDiskSize(min, max);
@@ -167,5 +180,67 @@
   }
   return ticks;
 }
+
+class Observer : public chromeos::ConciergeClient::DiskImageObserver {
+ public:
+  Observer(std::string uuid, base::OnceCallback<void(bool)> callback)
+      : uuid_(std::move(uuid)), callback_(std::move(callback)) {}
+  ~Observer() override { GetConciergeClient()->RemoveDiskImageObserver(this); }
+  void OnDiskImageProgress(
+      const vm_tools::concierge::DiskImageStatusResponse& signal) override {
+    if (signal.command_uuid() != uuid_) {
+      return;
+    }
+    switch (signal.status()) {
+      case vm_tools::concierge::DiskImageStatus::DISK_STATUS_IN_PROGRESS:
+        break;
+      case vm_tools::concierge::DiskImageStatus::DISK_STATUS_RESIZED:
+        std::move(callback_).Run(true);
+        break;
+      default:
+        LOG(ERROR) << "Failed or unrecognised status when resizing: "
+                   << signal.status() << " " << signal.failure_reason();
+        std::move(callback_).Run(false);
+        delete this;
+    }
+  }
+
+ private:
+  std::string uuid_;
+  base::OnceCallback<void(bool)> callback_;
+};
+
+void ResizeCrostiniDisk(Profile* profile,
+                        std::string vm_name,
+                        uint64_t size_bytes,
+                        base::OnceCallback<void(bool)> callback) {
+  vm_tools::concierge::ResizeDiskImageRequest request;
+  request.set_cryptohome_id(CryptohomeIdForProfile(profile));
+  request.set_vm_name(vm_name);
+  request.set_disk_size(size_bytes);
+
+  GetConciergeClient()->ResizeDiskImage(
+      request, base::BindOnce(&OnResize, std::move(callback)));
+}
+
+void OnResize(
+    base::OnceCallback<void(bool)> callback,
+    base::Optional<vm_tools::concierge::ResizeDiskImageResponse> response) {
+  if (!response) {
+    LOG(ERROR) << "Got null response from concierge";
+    std::move(callback).Run(false);
+  } else if (response->status() ==
+             vm_tools::concierge::DiskImageStatus::DISK_STATUS_RESIZED) {
+    std::move(callback).Run(true);
+  } else if (response->status() ==
+             vm_tools::concierge::DiskImageStatus::DISK_STATUS_IN_PROGRESS) {
+    GetConciergeClient()->AddDiskImageObserver(
+        new Observer(response->command_uuid(), std::move(callback)));
+  } else {
+    LOG(ERROR) << "Got unexpected or error status from concierge: "
+               << response->status();
+    std::move(callback).Run(false);
+  }
+}
 }  // namespace disk
 }  // namespace crostini
diff --git a/chrome/browser/chromeos/crostini/crostini_disk.h b/chrome/browser/chromeos/crostini/crostini_disk.h
index 581bd44..5056b9b2 100644
--- a/chrome/browser/chromeos/crostini/crostini_disk.h
+++ b/chrome/browser/chromeos/crostini/crostini_disk.h
@@ -75,6 +75,14 @@
     int64_t max,
     int* out_default_index);
 
+void ResizeCrostiniDisk(Profile* profile,
+                        std::string vm_name,
+                        uint64_t size_bytes,
+                        base::OnceCallback<void(bool)> callback);
+
+void OnResize(
+    base::OnceCallback<void(bool)> callback,
+    base::Optional<vm_tools::concierge::ResizeDiskImageResponse> response);
 }  // namespace disk
 }  // namespace crostini
 #endif  // CHROME_BROWSER_CHROMEOS_CROSTINI_CROSTINI_DISK_H_
diff --git a/chrome/browser/chromeos/crostini/crostini_disk_unittest.cc b/chrome/browser/chromeos/crostini/crostini_disk_unittest.cc
index 87c64cc2..a4cf100 100644
--- a/chrome/browser/chromeos/crostini/crostini_disk_unittest.cc
+++ b/chrome/browser/chromeos/crostini/crostini_disk_unittest.cc
@@ -8,8 +8,11 @@
 #include <utility>
 
 #include "base/test/bind_test_util.h"
+#include "base/test/task_environment.h"
 #include "chrome/browser/chromeos/crostini/crostini_types.mojom.h"
 #include "chromeos/dbus/concierge/concierge_service.pb.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/fake_concierge_client.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace crostini {
@@ -28,8 +31,8 @@
       base::Optional<vm_tools::concierge::ListVmDisksResponse>
           list_disks_response) {
     std::unique_ptr<CrostiniDiskInfo> result;
-    auto store =
-        base::BindLambdaForTesting([&](std::unique_ptr<CrostiniDiskInfo> info) {
+    auto store = base::BindLambdaForTesting(
+        [&result](std::unique_ptr<CrostiniDiskInfo> info) {
           result = std::move(info);
         });
 
@@ -40,6 +43,39 @@
   }
 };
 
+class CrostiniDiskTestDbus : public CrostiniDiskTest {
+ public:
+  CrostiniDiskTestDbus() {
+    chromeos::DBusThreadManager::Initialize();
+    fake_concierge_client_ = static_cast<chromeos::FakeConciergeClient*>(
+        chromeos::DBusThreadManager::Get()->GetConciergeClient());
+  }
+  ~CrostiniDiskTestDbus() override { chromeos::DBusThreadManager::Shutdown(); }
+
+ protected:
+  // A wrapper for ResizeCrostiniDisk which returns the result.
+  bool OnResizeWithResult(Profile* profile,
+                          const char* vm_name,
+                          int64_t size_bytes) {
+    bool result;
+    auto store =
+        base::BindLambdaForTesting([&result, &run_loop = run_loop_](bool info) {
+          result = std::move(info);
+          run_loop.QuitClosure().Run();
+        });
+
+    ResizeCrostiniDisk(profile, vm_name, size_bytes, std::move(store));
+    run_loop_.Run();
+    return result;
+  }
+
+  base::test::SingleThreadTaskEnvironment task_environment;
+
+  base::RunLoop run_loop_;
+  // Owned by chromeos::DBusThreadManager
+  chromeos::FakeConciergeClient* fake_concierge_client_;
+};
+
 TEST_F(CrostiniDiskTest, NonResizeableDiskReturnsEarly) {
   vm_tools::concierge::ListVmDisksResponse response;
   response.set_success(true);
@@ -80,8 +116,9 @@
   image->set_name("vm_name");
   image->set_image_type(vm_tools::concierge::DiskImageType::DISK_IMAGE_RAW);
   image->set_user_chosen_size(true);
+  image->set_min_size(1);
 
-  auto disk_info_user_size = OnListVmDisksWithResult("vm_name", 0, response);
+  auto disk_info_user_size = OnListVmDisksWithResult("vm_name", 1, response);
 
   ASSERT_TRUE(disk_info_user_size);
   EXPECT_TRUE(disk_info_user_size->can_resize);
@@ -90,7 +127,7 @@
   image->set_user_chosen_size(false);
 
   auto disk_info_not_user_size =
-      OnListVmDisksWithResult("vm_name", 0, response);
+      OnListVmDisksWithResult("vm_name", 1, response);
 
   ASSERT_TRUE(disk_info_not_user_size);
   EXPECT_TRUE(disk_info_not_user_size->can_resize);
@@ -156,5 +193,54 @@
               CrostiniResult::VM_START_FAILED);
   EXPECT_FALSE(disk_info);
 }
+
+TEST_F(CrostiniDiskTestDbus, DiskResizeImmediateFailureReportsFailure) {
+  vm_tools::concierge::ResizeDiskImageResponse response;
+  response.set_status(vm_tools::concierge::DiskImageStatus::DISK_STATUS_FAILED);
+  fake_concierge_client_->set_resize_disk_image_response(response);
+
+  auto result = OnResizeWithResult(nullptr, "vm_name", 12345);
+
+  EXPECT_EQ(result, false);
+}
+
+TEST_F(CrostiniDiskTestDbus, DiskResizeEventualFailureReportsFailure) {
+  vm_tools::concierge::ResizeDiskImageResponse response;
+  vm_tools::concierge::DiskImageStatusResponse in_progress;
+  vm_tools::concierge::DiskImageStatusResponse failed;
+  response.set_status(
+      vm_tools::concierge::DiskImageStatus::DISK_STATUS_IN_PROGRESS);
+  in_progress.set_status(
+      vm_tools::concierge::DiskImageStatus::DISK_STATUS_IN_PROGRESS);
+  failed.set_status(vm_tools::concierge::DiskImageStatus::DISK_STATUS_FAILED);
+  fake_concierge_client_->set_resize_disk_image_response(response);
+  std::vector<vm_tools::concierge::DiskImageStatusResponse> signals{in_progress,
+                                                                    failed};
+  fake_concierge_client_->set_disk_image_status_signals(signals);
+
+  auto result = OnResizeWithResult(nullptr, "vm_name", 12345);
+
+  EXPECT_EQ(result, false);
+}
+
+TEST_F(CrostiniDiskTestDbus, DiskResizeEventualSuccessReportsSuccess) {
+  vm_tools::concierge::ResizeDiskImageResponse response;
+  vm_tools::concierge::DiskImageStatusResponse in_progress;
+  vm_tools::concierge::DiskImageStatusResponse resized;
+  response.set_status(
+      vm_tools::concierge::DiskImageStatus::DISK_STATUS_IN_PROGRESS);
+  in_progress.set_status(
+      vm_tools::concierge::DiskImageStatus::DISK_STATUS_IN_PROGRESS);
+  resized.set_status(vm_tools::concierge::DiskImageStatus::DISK_STATUS_RESIZED);
+  fake_concierge_client_->set_resize_disk_image_response(response);
+  std::vector<vm_tools::concierge::DiskImageStatusResponse> signals{in_progress,
+                                                                    resized};
+  fake_concierge_client_->set_disk_image_status_signals(signals);
+
+  auto result = OnResizeWithResult(nullptr, "vm_name", 12345);
+
+  EXPECT_EQ(result, true);
+}
+
 }  // namespace disk
 }  // namespace crostini
diff --git a/chrome/browser/chromeos/policy/affiliated_cloud_policy_invalidator.cc b/chrome/browser/chromeos/policy/affiliated_cloud_policy_invalidator.cc
index b3dea73..130029c 100644
--- a/chrome/browser/chromeos/policy/affiliated_cloud_policy_invalidator.cc
+++ b/chrome/browser/chromeos/policy/affiliated_cloud_policy_invalidator.cc
@@ -13,10 +13,10 @@
 namespace policy {
 
 AffiliatedCloudPolicyInvalidator::AffiliatedCloudPolicyInvalidator(
-    enterprise_management::DeviceRegisterRequest::Type type,
+    PolicyInvalidationScope scope,
     CloudPolicyCore* core,
     AffiliatedInvalidationServiceProvider* invalidation_service_provider)
-    : type_(type),
+    : scope_(scope),
       core_(core),
       invalidation_service_provider_(invalidation_service_provider),
       highest_handled_invalidation_version_(0) {
@@ -44,7 +44,7 @@
     invalidation::InvalidationService* invalidation_service) {
   DCHECK(!invalidator_);
   invalidator_.reset(new CloudPolicyInvalidator(
-      type_, core_, base::ThreadTaskRunnerHandle::Get(),
+      scope_, core_, base::ThreadTaskRunnerHandle::Get(),
       base::DefaultClock::GetInstance(),
       highest_handled_invalidation_version_));
   invalidator_->Initialize(invalidation_service);
diff --git a/chrome/browser/chromeos/policy/affiliated_cloud_policy_invalidator.h b/chrome/browser/chromeos/policy/affiliated_cloud_policy_invalidator.h
index b07a54f2..ecad60a 100644
--- a/chrome/browser/chromeos/policy/affiliated_cloud_policy_invalidator.h
+++ b/chrome/browser/chromeos/policy/affiliated_cloud_policy_invalidator.h
@@ -11,7 +11,7 @@
 
 #include "base/macros.h"
 #include "chrome/browser/chromeos/policy/affiliated_invalidation_service_provider.h"
-#include "components/policy/proto/device_management_backend.pb.h"
+#include "components/policy/core/common/cloud/policy_invalidation_scope.h"
 
 namespace invalidation {
 class InvalidationService;
@@ -34,7 +34,7 @@
     : public AffiliatedInvalidationServiceProvider::Consumer {
  public:
   AffiliatedCloudPolicyInvalidator(
-      enterprise_management::DeviceRegisterRequest::Type type,
+      PolicyInvalidationScope scope,
       CloudPolicyCore* core,
       AffiliatedInvalidationServiceProvider* invalidation_service_provider);
   ~AffiliatedCloudPolicyInvalidator() override;
@@ -53,7 +53,7 @@
   // Destroy the current |CloudPolicyInvalidator|, if any.
   void DestroyInvalidator();
 
-  const enterprise_management::DeviceRegisterRequest::Type type_;
+  const PolicyInvalidationScope scope_;
   CloudPolicyCore* const core_;
 
   AffiliatedInvalidationServiceProvider* const invalidation_service_provider_;
diff --git a/chrome/browser/chromeos/policy/affiliated_cloud_policy_invalidator_unittest.cc b/chrome/browser/chromeos/policy/affiliated_cloud_policy_invalidator_unittest.cc
index a2dec41c..d186521 100644
--- a/chrome/browser/chromeos/policy/affiliated_cloud_policy_invalidator_unittest.cc
+++ b/chrome/browser/chromeos/policy/affiliated_cloud_policy_invalidator_unittest.cc
@@ -105,7 +105,7 @@
 
   FakeAffiliatedInvalidationServiceProvider provider;
   AffiliatedCloudPolicyInvalidator affiliated_invalidator(
-      em::DeviceRegisterRequest::DEVICE, &core, &provider);
+      PolicyInvalidationScope::kDevice, &core, &provider);
 
   // Verify that no invalidator exists initially.
   EXPECT_FALSE(affiliated_invalidator.GetInvalidatorForTest());
diff --git a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
index 7dd36d32..346b0ce 100644
--- a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
+++ b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
@@ -201,7 +201,7 @@
   if (device_cloud_policy_manager_) {
     device_cloud_policy_invalidator_ =
         std::make_unique<AffiliatedCloudPolicyInvalidator>(
-            em::DeviceRegisterRequest::DEVICE,
+            PolicyInvalidationScope::kDevice,
             device_cloud_policy_manager_->core(),
             affiliated_invalidation_service_provider_.get());
     device_remote_commands_invalidator_ =
diff --git a/chrome/browser/chromeos/policy/device_local_account_policy_service.cc b/chrome/browser/chromeos/policy/device_local_account_policy_service.cc
index 444e23fbc..8a4912d 100644
--- a/chrome/browser/chromeos/policy/device_local_account_policy_service.cc
+++ b/chrome/browser/chromeos/policy/device_local_account_policy_service.cc
@@ -212,7 +212,7 @@
   core_.StartRefreshScheduler();
   UpdateRefreshDelay();
   invalidator_.reset(new AffiliatedCloudPolicyInvalidator(
-      em::DeviceRegisterRequest::DEVICE, &core_,
+      PolicyInvalidationScope::kDeviceLocalAccount, &core_,
       invalidation_service_provider_));
 }
 
diff --git a/chrome/browser/client_hints/client_hints_browsertest.cc b/chrome/browser/client_hints/client_hints_browsertest.cc
index f0a19ec9..39b49a4 100644
--- a/chrome/browser/client_hints/client_hints_browsertest.cc
+++ b/chrome/browser/client_hints/client_hints_browsertest.cc
@@ -934,7 +934,9 @@
   // the major version, and not contain the full version.
   SetClientHintExpectationsOnMainFrame(false);
   ui_test_utils::NavigateToURL(browser(), gurl);
-  EXPECT_TRUE(base::EndsWith(main_frame_ua_observed(), ua.major_version,
+  std::string version = ua.major_version;
+  version.append(1, '"');
+  EXPECT_TRUE(base::EndsWith(main_frame_ua_observed(), version,
                              base::CompareCase::SENSITIVE));
   EXPECT_EQ(std::string::npos, main_frame_ua_observed().find(ua.full_version));
 
@@ -942,7 +944,9 @@
   // version.
   SetClientHintExpectationsOnMainFrame(true);
   ui_test_utils::NavigateToURL(browser(), gurl);
-  EXPECT_TRUE(base::EndsWith(main_frame_ua_observed(), ua.full_version,
+  version = ua.full_version;
+  version.append(1, '"');
+  EXPECT_TRUE(base::EndsWith(main_frame_ua_observed(), version,
                              base::CompareCase::SENSITIVE));
 }
 
@@ -957,21 +961,21 @@
   // end with the major version, and not contain the full version.
   SetClientHintExpectationsOnMainFrame(false);
   ui_test_utils::NavigateToURL(browser_a, gurl);
-  EXPECT_TRUE(base::EndsWith(main_frame_ua_observed(), ua.major_version,
+  EXPECT_TRUE(base::EndsWith(main_frame_ua_observed(), ua.major_version + "\"",
                              base::CompareCase::SENSITIVE));
   EXPECT_EQ(std::string::npos, main_frame_ua_observed().find(ua.full_version));
 
   // Try again on |browser_a|, the header should have an effect there.
   SetClientHintExpectationsOnMainFrame(true);
   ui_test_utils::NavigateToURL(browser_a, gurl);
-  EXPECT_TRUE(base::EndsWith(main_frame_ua_observed(), ua.full_version,
+  EXPECT_TRUE(base::EndsWith(main_frame_ua_observed(), ua.full_version + "\"",
                              base::CompareCase::SENSITIVE));
 
   // Navigate on |browser_b|. That should still only have the major
   // version.
   SetClientHintExpectationsOnMainFrame(false);
   ui_test_utils::NavigateToURL(browser_b, gurl);
-  EXPECT_TRUE(base::EndsWith(main_frame_ua_observed(), ua.major_version,
+  EXPECT_TRUE(base::EndsWith(main_frame_ua_observed(), ua.major_version + "\"",
                              base::CompareCase::SENSITIVE));
   EXPECT_EQ(std::string::npos, main_frame_ua_observed().find(ua.full_version));
 }
diff --git a/chrome/browser/devtools/devtools_file_helper.cc b/chrome/browser/devtools/devtools_file_helper.cc
index 082063cf..1b441f5c 100644
--- a/chrome/browser/devtools/devtools_file_helper.cc
+++ b/chrome/browser/devtools/devtools_file_helper.cc
@@ -55,6 +55,7 @@
 
 static const char kRootName[] = "<root>";
 static const char kPermissionDenied[] = "<permission denied>";
+static const char kSelectionCancelled[] = "<selection cancelled>";
 
 base::LazyInstance<base::FilePath>::Leaky
     g_last_save_path = LAZY_INSTANCE_INITIALIZER;
@@ -313,7 +314,7 @@
       Bind(&DevToolsFileHelper::InnerAddFileSystem, weak_factory_.GetWeakPtr(),
            show_info_bar_callback, type),
       Bind(&DevToolsFileHelper::FailedToAddFileSystem,
-           weak_factory_.GetWeakPtr(), kPermissionDenied),
+           weak_factory_.GetWeakPtr(), kSelectionCancelled),
       web_contents_);
   select_file_dialog->Show(ui::SelectFileDialog::SELECT_FOLDER,
                            base::FilePath());
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn
index 2038afa..a23b3d3 100644
--- a/chrome/browser/extensions/BUILD.gn
+++ b/chrome/browser/extensions/BUILD.gn
@@ -832,6 +832,7 @@
     "//components/onc",
     "//components/password_manager/core/browser",
     "//components/password_manager/core/browser:affiliation",
+    "//components/password_manager/core/browser/leak_detection",
     "//components/payments/core",
     "//components/pdf/browser",
     "//components/performance_manager",
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc b/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc
index f1e8940..5584d647 100644
--- a/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc
+++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc
@@ -10,9 +10,11 @@
 #include "base/containers/flat_set.h"
 #include "base/optional.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/time/time.h"
 #include "chrome/browser/extensions/api/passwords_private/passwords_private_event_router.h"
 #include "chrome/browser/extensions/api/passwords_private/passwords_private_event_router_factory.h"
 #include "chrome/browser/extensions/api/passwords_private/passwords_private_utils.h"
+#include "chrome/browser/password_manager/bulk_leak_check_service_factory.h"
 #include "chrome/browser/password_manager/password_store_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/extensions/api/passwords_private.h"
@@ -20,7 +22,11 @@
 #include "components/autofill/core/common/password_form.h"
 #include "components/keyed_service/core/service_access_type.h"
 #include "components/password_manager/core/browser/android_affiliation/affiliation_utils.h"
+#include "components/password_manager/core/browser/bulk_leak_check_service.h"
+#include "components/password_manager/core/browser/compromised_credentials_table.h"
+#include "components/password_manager/core/browser/leak_detection/encryption_utils.h"
 #include "components/password_manager/core/browser/ui/compromised_credentials_provider.h"
+#include "components/password_manager/core/browser/ui/credential_utils.h"
 #include "components/password_manager/core/browser/ui/saved_passwords_presenter.h"
 #include "components/url_formatter/url_formatter.h"
 #include "net/base/escape.h"
@@ -32,6 +38,8 @@
 
 namespace {
 
+using autofill::PasswordForm;
+using password_manager::CanonicalizeUsername;
 using password_manager::CredentialWithPassword;
 using ui::TimeFormat;
 using CompromisedCredentialsView =
@@ -92,9 +100,14 @@
           ServiceAccessType::EXPLICIT_ACCESS)),
       saved_passwords_presenter_(password_store_),
       compromised_credentials_provider_(password_store_,
-                                        &saved_passwords_presenter_) {
+                                        &saved_passwords_presenter_),
+      bulk_leak_check_service_adapter_(
+          &saved_passwords_presenter_,
+          BulkLeakCheckServiceFactory::GetForProfile(profile_)) {
   observed_compromised_credentials_provider_.Add(
       &compromised_credentials_provider_);
+  observed_bulk_leak_check_service_.Add(
+      BulkLeakCheckServiceFactory::GetForProfile(profile_));
 
   // Instructs the presenter and provider to initialize and built their caches.
   // This will soon after invoke OnCompromisedCredentialsChanged(), which then
@@ -132,7 +145,7 @@
       // |formatted_orgin| and |change_password_url| need special handling for
       // Android. Here we use affiliation information instead of the
       // signon_realm.
-      const autofill::PasswordForm& android_form =
+      const PasswordForm& android_form =
           credentials_to_forms_.at(credential).at(0);
       api_credential.formatted_origin = android_form.app_display_name;
       api_credential.change_password_url =
@@ -233,12 +246,20 @@
   // Erase all matching credentials from the store. Return whether any
   // credentials were deleted.
   SavedPasswordsView saved_passwords = it->second;
-  for (const autofill::PasswordForm& saved_password : saved_passwords)
+  for (const PasswordForm& saved_password : saved_passwords)
     password_store_->RemoveLogin(saved_password);
 
   return !saved_passwords.empty();
 }
 
+bool PasswordCheckDelegate::StartPasswordCheck() {
+  return bulk_leak_check_service_adapter_.StartBulkLeakCheck();
+}
+
+void PasswordCheckDelegate::StopPasswordCheck() {
+  bulk_leak_check_service_adapter_.StopBulkLeakCheck();
+}
+
 void PasswordCheckDelegate::OnCompromisedCredentialsChanged(
     CompromisedCredentialsView credentials) {
   credentials_to_forms_ = MapCompromisedCredentialsToSavedPasswords(
@@ -250,6 +271,35 @@
   }
 }
 
+void PasswordCheckDelegate::OnStateChanged(
+    password_manager::BulkLeakCheckService::State state) {
+  NOTIMPLEMENTED();
+  // TODO(https://crbug.com/1047726): Implement.
+}
+
+void PasswordCheckDelegate::OnCredentialDone(
+    const password_manager::LeakCheckCredential& credential,
+    password_manager::IsLeaked is_leaked) {
+  if (!is_leaked)
+    return;
+
+  const base::string16 canocalized_username =
+      CanonicalizeUsername(credential.username());
+  for (const PasswordForm& saved_password :
+       saved_passwords_presenter_.GetSavedPasswords()) {
+    if (saved_password.password_value == credential.password() &&
+        CanonicalizeUsername(saved_password.username_value) ==
+            canocalized_username) {
+      password_store_->AddCompromisedCredentials({
+          .signon_realm = saved_password.signon_realm,
+          .username = saved_password.username_value,
+          .create_time = base::Time::Now(),
+          .compromise_type = password_manager::CompromiseType::kLeaked,
+      });
+    }
+  }
+}
+
 const CredentialWithPassword*
 PasswordCheckDelegate::FindMatchingCompromisedCredential(
     const api::passwords_private::CompromisedCredential& credential) const {
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate.h b/chrome/browser/extensions/api/passwords_private/password_check_delegate.h
index 0cac02d..3718955 100644
--- a/chrome/browser/extensions/api/passwords_private/password_check_delegate.h
+++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate.h
@@ -9,7 +9,11 @@
 #include "base/scoped_observer.h"
 #include "chrome/browser/extensions/api/passwords_private/passwords_private_utils.h"
 #include "chrome/common/extensions/api/passwords_private.h"
+#include "components/password_manager/core/browser/bulk_leak_check_service.h"
+#include "components/password_manager/core/browser/leak_detection/bulk_leak_check.h"
+#include "components/password_manager/core/browser/leak_detection/leak_detection_delegate_interface.h"
 #include "components/password_manager/core/browser/password_store.h"
+#include "components/password_manager/core/browser/ui/bulk_leak_check_service_adapter.h"
 #include "components/password_manager/core/browser/ui/compromised_credentials_provider.h"
 #include "components/password_manager/core/browser/ui/credential_utils.h"
 #include "components/password_manager/core/browser/ui/saved_passwords_presenter.h"
@@ -25,7 +29,8 @@
 // This class handles the part of the passwordsPrivate extension API that deals
 // with the bulk password check feature.
 class PasswordCheckDelegate
-    : public password_manager::CompromisedCredentialsProvider::Observer {
+    : public password_manager::CompromisedCredentialsProvider::Observer,
+      public password_manager::BulkLeakCheckService::Observer {
  public:
   using CredentialPasswordsMap =
       std::map<password_manager::CredentialWithPassword,
@@ -61,6 +66,12 @@
   bool RemoveCompromisedCredential(
       const api::passwords_private::CompromisedCredential& credential);
 
+  // Starts a check for compromised passwords. Returns true if a new check was
+  // started.
+  bool StartPasswordCheck();
+  // Stops checking for compromised passwords.
+  void StopPasswordCheck();
+
  private:
   // password_manager::CompromisedCredentialsProvider::Observer:
   // Invokes PasswordsPrivateEventRouter::OnCompromisedCredentialsInfoChanged if
@@ -69,6 +80,12 @@
       password_manager::CompromisedCredentialsProvider::CredentialsView
           credentials) override;
 
+  // password_manager::BulkLeakCheckService::Observer:
+  void OnStateChanged(
+      password_manager::BulkLeakCheckService::State state) override;
+  void OnCredentialDone(const password_manager::LeakCheckCredential& credential,
+                        password_manager::IsLeaked is_leaked) override;
+
   const password_manager::CredentialWithPassword*
   FindMatchingCompromisedCredential(
       const api::passwords_private::CompromisedCredential& credential) const;
@@ -93,6 +110,11 @@
                  password_manager::CompromisedCredentialsProvider::Observer>
       observed_compromised_credentials_provider_{this};
 
+  // A scoped observer for the BulkLeakCheckService.
+  ScopedObserver<password_manager::BulkLeakCheckService,
+                 password_manager::BulkLeakCheckService::Observer>
+      observed_bulk_leak_check_service_{this};
+
   // A map that matches CredentialWithPasswords to corresponding PasswordForms.
   // This is required to inject affiliation information into Android
   // credentials, as well as being able to reflect edits and removals of
@@ -106,6 +128,10 @@
               int,
               password_manager::PasswordCredentialLess>
       compromised_credential_id_generator_;
+
+  // Starts, monitors and stops a leaked credential check.
+  password_manager::BulkLeakCheckServiceAdapter
+      bulk_leak_check_service_adapter_;
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
index 1d376bf8..1bf5cdb 100644
--- a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
+++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
@@ -14,23 +14,33 @@
 #include "base/stl_util.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_piece.h"
+#include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/bind_test_util.h"
 #include "base/time/time.h"
 #include "chrome/browser/extensions/api/passwords_private/passwords_private_event_router.h"
 #include "chrome/browser/extensions/api/passwords_private/passwords_private_event_router_factory.h"
+#include "chrome/browser/password_manager/bulk_leak_check_service_factory.h"
 #include "chrome/browser/password_manager/password_store_factory.h"
 #include "chrome/common/extensions/api/passwords_private.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "components/password_manager/core/browser/bulk_leak_check_service.h"
 #include "components/password_manager/core/browser/compromised_credentials_table.h"
+#include "components/password_manager/core/browser/leak_detection/bulk_leak_check.h"
+#include "components/password_manager/core/browser/leak_detection/leak_detection_delegate_interface.h"
 #include "components/password_manager/core/browser/password_manager_test_utils.h"
 #include "components/password_manager/core/browser/test_password_store.h"
+#include "components/password_manager/core/common/password_manager_features.h"
+#include "components/signin/public/identity_manager/identity_manager.h"
+#include "components/signin/public/identity_manager/identity_test_environment.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/test/browser_task_environment.h"
 #include "extensions/browser/event_router.h"
 #include "extensions/browser/extension_event_histogram_value.h"
 #include "extensions/browser/test_event_router.h"
 #include "extensions/browser/test_event_router_observer.h"
+#include "services/network/test/test_shared_url_loader_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -51,13 +61,20 @@
 using api::passwords_private::CompromisedCredential;
 using api::passwords_private::CompromisedCredentialsInfo;
 using autofill::PasswordForm;
+using password_manager::BulkLeakCheckDelegateInterface;
+using password_manager::BulkLeakCheckService;
+using password_manager::CompromisedCredentials;
 using password_manager::CompromiseType;
+using password_manager::IsLeaked;
+using password_manager::LeakCheckCredential;
 using password_manager::TestPasswordStore;
 using ::testing::AllOf;
 using ::testing::AtLeast;
 using ::testing::ElementsAre;
 using ::testing::Field;
+using ::testing::IsEmpty;
 using ::testing::Pointee;
+using ::testing::UnorderedElementsAre;
 
 PasswordsPrivateEventRouter* CreateAndUsePasswordsPrivateEventRouter(
     Profile* profile) {
@@ -93,7 +110,21 @@
           .get()));
 }
 
-password_manager::CompromisedCredentials MakeCompromised(
+BulkLeakCheckService* CreateAndUseBulkLeakCheckService(
+    signin::IdentityManager* identity_manager,
+    Profile* profile) {
+  return static_cast<BulkLeakCheckService*>(
+      BulkLeakCheckServiceFactory::GetInstance()->SetTestingFactoryAndUse(
+          profile, base::BindLambdaForTesting([identity_manager](
+                                                  content::BrowserContext*) {
+            return std::unique_ptr<
+                KeyedService>(std::make_unique<BulkLeakCheckService>(
+                identity_manager,
+                base::MakeRefCounted<network::TestSharedURLLoaderFactory>()));
+          })));
+}
+
+CompromisedCredentials MakeCompromised(
     base::StringPiece signon_realm,
     base::StringPiece username,
     base::TimeDelta time_since_creation = base::TimeDelta(),
@@ -108,7 +139,7 @@
 
 PasswordForm MakeSavedPassword(base::StringPiece signon_realm,
                                base::StringPiece username,
-                               base::StringPiece password = "",
+                               base::StringPiece password = kPassword1,
                                base::StringPiece username_element = "") {
   PasswordForm form;
   form.signon_realm = std::string(signon_realm);
@@ -159,15 +190,21 @@
     return event_router_observer_;
   }
   TestPasswordStore& store() { return *store_; }
+  BulkLeakCheckService* service() { return bulk_leak_check_service_; }
   PasswordCheckDelegate& delegate() { return delegate_; }
 
  private:
-  content::BrowserTaskEnvironment task_env_;
+  content::BrowserTaskEnvironment task_env_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+  signin::IdentityTestEnvironment identity_test_env_;
   TestingProfile profile_;
   EventRouter* event_router_ = CreateAndUseEventRouter(&profile_);
   PasswordsPrivateEventRouter* password_router_ =
       CreateAndUsePasswordsPrivateEventRouter(&profile_);
   TestEventRouterObserver event_router_observer_{event_router_};
+  BulkLeakCheckService* bulk_leak_check_service_ =
+      CreateAndUseBulkLeakCheckService(identity_test_env_.identity_manager(),
+                                       &profile_);
   scoped_refptr<TestPasswordStore> store_ =
       CreateAndUseTestPasswordStore(&profile_);
   PasswordCheckDelegate delegate_{&profile_};
@@ -471,4 +508,102 @@
   EXPECT_FALSE(delegate().RemoveCompromisedCredential(credential));
 }
 
+// Tests that we don't create an entry in the database if there is no matching
+// saved password.
+TEST_F(PasswordCheckDelegateTest, OnLeakFoundDoesNotCreateCredential) {
+  static_cast<BulkLeakCheckDelegateInterface*>(service())->OnFinishedCredential(
+      LeakCheckCredential(base::ASCIIToUTF16(kUsername1),
+                          base::ASCIIToUTF16(kPassword1)),
+      IsLeaked(true));
+  RunUntilIdle();
+
+  EXPECT_THAT(store().compromised_credentials(), IsEmpty());
+}
+
+// Test that we don't create an entry in the password store if IsLeaked is
+// false.
+TEST_F(PasswordCheckDelegateTest, NoLeakedFound) {
+  store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1, kPassword1));
+  RunUntilIdle();
+
+  static_cast<BulkLeakCheckDelegateInterface*>(service())->OnFinishedCredential(
+      LeakCheckCredential(base::ASCIIToUTF16(kUsername1),
+                          base::ASCIIToUTF16(kPassword1)),
+      IsLeaked(false));
+  RunUntilIdle();
+
+  EXPECT_THAT(store().compromised_credentials(), IsEmpty());
+}
+
+// Test that a found leak creates a compromised credential in the password
+// store.
+TEST_F(PasswordCheckDelegateTest, OnLeakFoundCreatesCredential) {
+  store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1, kPassword1));
+  RunUntilIdle();
+
+  static_cast<BulkLeakCheckDelegateInterface*>(service())->OnFinishedCredential(
+      LeakCheckCredential(base::ASCIIToUTF16(kUsername1),
+                          base::ASCIIToUTF16(kPassword1)),
+      IsLeaked(true));
+  RunUntilIdle();
+
+  EXPECT_THAT(store().compromised_credentials(),
+              ElementsAre(CompromisedCredentials{
+                  .signon_realm = kExampleCom,
+                  .username = base::ASCIIToUTF16(kUsername1),
+                  .create_time = base::Time::Now(),
+                  .compromise_type = CompromiseType::kLeaked,
+              }));
+}
+
+// Test that a found leak creates a compromised credential in the password
+// store for each combination of the same canonicalized username and password.
+TEST_F(PasswordCheckDelegateTest, OnLeakFoundCreatesMultipleCredential) {
+  const std::string kUsername2Upper = base::ToUpperASCII(kUsername2);
+  const std::string kUsername2Email = base::StrCat({kUsername2, "@email.com"});
+
+  store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1, kPassword1));
+  store().AddLogin(MakeSavedPassword(kExampleOrg, kUsername1, kPassword1));
+  store().AddLogin(MakeSavedPassword(kExampleCom, kUsername2Upper, kPassword2));
+  store().AddLogin(MakeSavedPassword(kExampleOrg, kUsername2Email, kPassword2));
+  RunUntilIdle();
+
+  static_cast<BulkLeakCheckDelegateInterface*>(service())->OnFinishedCredential(
+      LeakCheckCredential(base::ASCIIToUTF16(kUsername1),
+                          base::ASCIIToUTF16(kPassword1)),
+      IsLeaked(true));
+  static_cast<BulkLeakCheckDelegateInterface*>(service())->OnFinishedCredential(
+      LeakCheckCredential(base::ASCIIToUTF16(kUsername2Email),
+                          base::ASCIIToUTF16(kPassword2)),
+      IsLeaked(true));
+  RunUntilIdle();
+
+  EXPECT_THAT(store().compromised_credentials(),
+              UnorderedElementsAre(
+                  CompromisedCredentials{
+                      .signon_realm = kExampleCom,
+                      .username = base::ASCIIToUTF16(kUsername1),
+                      .create_time = base::Time::Now(),
+                      .compromise_type = CompromiseType::kLeaked,
+                  },
+                  CompromisedCredentials{
+                      .signon_realm = kExampleOrg,
+                      .username = base::ASCIIToUTF16(kUsername1),
+                      .create_time = base::Time::Now(),
+                      .compromise_type = CompromiseType::kLeaked,
+                  },
+                  CompromisedCredentials{
+                      .signon_realm = kExampleCom,
+                      .username = base::ASCIIToUTF16(kUsername2Upper),
+                      .create_time = base::Time::Now(),
+                      .compromise_type = CompromiseType::kLeaked,
+                  },
+                  CompromisedCredentials{
+                      .signon_realm = kExampleOrg,
+                      .username = base::ASCIIToUTF16(kUsername2Email),
+                      .create_time = base::Time::Now(),
+                      .compromise_type = CompromiseType::kLeaked,
+                  }));
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
index 96b04c30..033682e2 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
@@ -308,4 +308,24 @@
   return RespondNow(NoArguments());
 }
 
+// PasswordsPrivateStartPasswordCheckFunction:
+PasswordsPrivateStartPasswordCheckFunction::
+    ~PasswordsPrivateStartPasswordCheckFunction() = default;
+
+ResponseAction PasswordsPrivateStartPasswordCheckFunction::Run() {
+  if (!GetDelegate(browser_context())->StartPasswordCheck()) {
+    return RespondNow(Error("Starting password check failed."));
+  }
+  return RespondNow(NoArguments());
+}
+
+// PasswordsPrivateStopPasswordCheckFunction:
+PasswordsPrivateStopPasswordCheckFunction::
+    ~PasswordsPrivateStopPasswordCheckFunction() = default;
+
+ResponseAction PasswordsPrivateStopPasswordCheckFunction::Run() {
+  GetDelegate(browser_context())->StopPasswordCheck();
+  return RespondNow(NoArguments());
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
index f6ba3c9..238a729 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
@@ -251,6 +251,30 @@
   ResponseAction Run() override;
 };
 
+class PasswordsPrivateStartPasswordCheckFunction : public ExtensionFunction {
+ public:
+  DECLARE_EXTENSION_FUNCTION("passwordsPrivate.startPasswordCheck",
+                             PASSWORDSPRIVATE_STARTPASSWORDCHECK)
+
+ protected:
+  ~PasswordsPrivateStartPasswordCheckFunction() override;
+
+  // ExtensionFunction overrides.
+  ResponseAction Run() override;
+};
+
+class PasswordsPrivateStopPasswordCheckFunction : public ExtensionFunction {
+ public:
+  DECLARE_EXTENSION_FUNCTION("passwordsPrivate.stopPasswordCheck",
+                             PASSWORDSPRIVATE_STOPPASSWORDCHECK)
+
+ protected:
+  ~PasswordsPrivateStopPasswordCheckFunction() override;
+
+  // ExtensionFunction overrides.
+  ResponseAction Run() override;
+};
+
 }  // namespace extensions
 
 #endif  // CHROME_BROWSER_EXTENSIONS_API_PASSWORDS_PRIVATE_PASSWORDS_PRIVATE_API_H_
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
index 04aab8a2..e992d1dc 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
@@ -232,6 +232,13 @@
                          }) != 0;
   }
 
+  bool StartPasswordCheck() override {
+    start_password_check_triggered_ = true;
+    return start_password_check_return_success_;
+  }
+
+  void StopPasswordCheck() override { stop_password_check_triggered_ = true; }
+
   void SetOptedInForAccountStorage(bool opted_in) {
     is_opted_in_for_account_storage_ = opted_in;
   }
@@ -251,6 +258,11 @@
   bool exportPasswordsTriggered = false;
   bool cancelExportPasswordsTriggered = false;
 
+  // Flags for detecting whether password check operations have been invoked.
+  bool start_password_check_triggered_ = false;
+  bool stop_password_check_triggered_ = false;
+  bool start_password_check_return_success_ = true;
+
  private:
   void SendSavedPasswordsList() {
     PasswordsPrivateEventRouter* router =
@@ -306,9 +318,7 @@
     ExtensionApiTest::SetUpCommandLine(command_line);
   }
 
-  void SetUp() override {
-    ExtensionApiTest::SetUp();
-  }
+  void SetUp() override { ExtensionApiTest::SetUp(); }
 
   void SetUpOnMainThread() override {
     ExtensionApiTest::SetUpOnMainThread();
@@ -337,6 +347,18 @@
     return s_test_delegate_->cancelExportPasswordsTriggered;
   }
 
+  bool start_password_check_triggered() {
+    return s_test_delegate_->start_password_check_triggered_;
+  }
+
+  bool stop_password_check_triggered() {
+    return s_test_delegate_->stop_password_check_triggered_;
+  }
+
+  void set_start_password_check_result(bool result) {
+    s_test_delegate_->start_password_check_return_success_ = result;
+  }
+
   void SetOptedInForAccountStorage(bool opted_in) {
     s_test_delegate_->SetOptedInForAccountStorage(opted_in);
   }
@@ -467,4 +489,24 @@
       << message_;
 }
 
+IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, StartPasswordCheck) {
+  set_start_password_check_result(true);
+  EXPECT_FALSE(start_password_check_triggered());
+  EXPECT_TRUE(RunPasswordsSubtest("startPasswordCheck")) << message_;
+  EXPECT_TRUE(start_password_check_triggered());
+}
+
+IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, StartPasswordCheckFailed) {
+  set_start_password_check_result(false);
+  EXPECT_FALSE(start_password_check_triggered());
+  EXPECT_TRUE(RunPasswordsSubtest("startPasswordCheckFailed")) << message_;
+  EXPECT_TRUE(start_password_check_triggered());
+}
+
+IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, StopPasswordCheck) {
+  EXPECT_FALSE(stop_password_check_triggered());
+  EXPECT_TRUE(RunPasswordsSubtest("stopPasswordCheck")) << message_;
+  EXPECT_TRUE(stop_password_check_triggered());
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
index d8df5ea..8bb770b 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
@@ -136,6 +136,12 @@
   // the remove succeeded.
   virtual bool RemoveCompromisedCredential(
       const api::passwords_private::CompromisedCredential& credential) = 0;
+
+  // Starts a check for compromised passwords. Returns true if a new check was
+  // started.
+  virtual bool StartPasswordCheck() = 0;
+  // Stops a check for compromised passwords.
+  virtual void StopPasswordCheck() = 0;
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
index 7ed3dd7..2924998 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -438,6 +438,14 @@
   return password_check_delegate_.RemoveCompromisedCredential(credential);
 }
 
+bool PasswordsPrivateDelegateImpl::StartPasswordCheck() {
+  return password_check_delegate_.StartPasswordCheck();
+}
+
+void PasswordsPrivateDelegateImpl::StopPasswordCheck() {
+  password_check_delegate_.StopPasswordCheck();
+}
+
 void PasswordsPrivateDelegateImpl::OnPasswordsExportProgress(
     password_manager::ExportProgressStatus status,
     const std::string& folder_name) {
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
index c0caba6e..252f393 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
@@ -78,6 +78,8 @@
       base::StringPiece new_password) override;
   bool RemoveCompromisedCredential(
       const api::passwords_private::CompromisedCredential& credential) override;
+  bool StartPasswordCheck() override;
+  void StopPasswordCheck() override;
 
   // PasswordUIView implementation.
   Profile* GetProfile() override;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 7d634355..5aa8fabd 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1499,6 +1499,11 @@
     "expiry_milestone": 85
   },
   {
+    "name": "enable-media-foundation-video-capture",
+    "owners": [ "armax", "guidou" ],
+    "expiry_milestone": 90
+  },
+  {
     "name": "enable-media-internals-devtools",
     "owners": ["tmathmeyer"],
     "expiry_milestone": 82
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index a8f1b52..428e530 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2825,6 +2825,12 @@
 const char kD3D11VideoDecoderDescription[] =
     "Enables D3D11VideoDecoder for hardware accelerated video decoding.";
 
+const char kEnableMediaFoundationVideoCaptureName[] =
+    "MediaFoundation Video Capture";
+const char kEnableMediaFoundationVideoCaptureDescription[] =
+    "Enable/Disable the usage of MediaFoundation for video capture. Fall back "
+    "to DirectShow if disabled.";
+
 const char kGdiTextPrinting[] = "GDI Text Printing";
 const char kGdiTextPrintingDescription[] =
     "Use GDI to print text as simply text";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 54c8bf7..a8797ab 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1614,6 +1614,9 @@
 extern const char kD3D11VideoDecoderName[];
 extern const char kD3D11VideoDecoderDescription[];
 
+extern const char kEnableMediaFoundationVideoCaptureName[];
+extern const char kEnableMediaFoundationVideoCaptureDescription[];
+
 extern const char kGdiTextPrinting[];
 extern const char kGdiTextPrintingDescription[];
 
diff --git a/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc b/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc
index c2ff7171..4588e17b 100644
--- a/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc
+++ b/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc
@@ -9,7 +9,9 @@
 #include "chrome/browser/ui/android/passwords/credential_leak_dialog_password_change_view_android.h"
 #include "chrome/common/url_constants.h"
 #include "components/password_manager/core/browser/leak_detection_dialog_utils.h"
+#include "components/strings/grit/components_strings.h"
 #include "ui/android/window_android.h"
+#include "ui/base/l10n/l10n_util.h"
 
 using password_manager::metrics_util::LeakDialogDismissalReason;
 using password_manager::metrics_util::LogLeakDialogTypeAndDismissalReason;
@@ -53,6 +55,9 @@
 
 base::string16
 CredentialLeakPasswordChangeControllerAndroid::GetAcceptButtonLabel() const {
+  if (ShouldShowChangePasswordButton()) {
+    return l10n_util::GetStringUTF16(IDS_PASSWORD_CHANGE);
+  }
   return password_manager::GetAcceptButtonLabel(leak_type_);
 }
 
@@ -77,5 +82,13 @@
 
 bool CredentialLeakPasswordChangeControllerAndroid::ShouldShowCancelButton()
     const {
-  return password_manager::ShouldShowCancelButton(leak_type_);
+  return password_manager::ShouldShowCancelButton(leak_type_) ||
+         ShouldShowChangePasswordButton();
+}
+
+bool CredentialLeakPasswordChangeControllerAndroid::
+    ShouldShowChangePasswordButton() const {
+  return password_manager::IsPasswordSaved(leak_type_) &&
+         !password_manager::IsPasswordUsedOnOtherSites(leak_type_) &&
+         password_manager::IsSyncingPasswordsNormally(leak_type_);
 }
diff --git a/chrome/browser/password_manager/credential_leak_password_change_controller_android.h b/chrome/browser/password_manager/credential_leak_password_change_controller_android.h
index 82e67786..0ffbfc27 100644
--- a/chrome/browser/password_manager/credential_leak_password_change_controller_android.h
+++ b/chrome/browser/password_manager/credential_leak_password_change_controller_android.h
@@ -65,6 +65,8 @@
   bool ShouldShowCancelButton() const;
 
  private:
+  bool ShouldShowChangePasswordButton() const;
+
   // Used to customize the UI.
   const password_manager::CredentialLeakType leak_type_;
 
diff --git a/chrome/browser/pdf/pdf_extension_test.cc b/chrome/browser/pdf/pdf_extension_test.cc
index 5e51c706f..8dac1cf 100644
--- a/chrome/browser/pdf/pdf_extension_test.cc
+++ b/chrome/browser/pdf/pdf_extension_test.cc
@@ -784,7 +784,13 @@
 
 #if defined(OS_CHROMEOS)
 // TODO(https://crbug.com/920684): Test times out.
-IN_PROC_BROWSER_TEST_F(PDFAnnotationsTest, DISABLED_AnnotationsFeatureEnabled) {
+#if defined(MEMORY_SANITIZER) || defined(LEAK_SANITIZER) || \
+    defined(ADDRESS_SANITIZER) || defined(_DEBUG)
+#define MAYBE_AnnotationsFeatureEnabled DISABLED_AnnotationsFeatureEnabled
+#else
+#define MAYBE_AnnotationsFeatureEnabled AnnotationsFeatureEnabled
+#endif
+IN_PROC_BROWSER_TEST_F(PDFAnnotationsTest, MAYBE_AnnotationsFeatureEnabled) {
   RunTestsInJsModule("annotations_feature_enabled_test.js", "test.pdf");
 }
 
diff --git a/chrome/browser/policy/cloud/cloud_policy_invalidator.cc b/chrome/browser/policy/cloud/cloud_policy_invalidator.cc
index a5e018a6..83683d7 100644
--- a/chrome/browser/policy/cloud/cloud_policy_invalidator.cc
+++ b/chrome/browser/policy/cloud/cloud_policy_invalidator.cc
@@ -28,8 +28,6 @@
 
 namespace {
 
-// Get the kMetricPolicyInvalidations histogram metric which should be
-// incremented when an invalidation is received.
 MetricPolicyRefresh GetPolicyRefreshMetric(bool invalidations_enabled,
                                            bool policy_changed,
                                            bool invalidated) {
@@ -45,28 +43,43 @@
   return METRIC_POLICY_REFRESH_UNCHANGED;
 }
 
-void RecordPolicyRefreshMetric(
-    enterprise_management::DeviceRegisterRequest::Type type,
-    bool invalidations_enabled,
-    bool policy_changed,
-    bool invalidated) {
-  MetricPolicyRefresh metric_policy_refresh = GetPolicyRefreshMetric(
-      invalidations_enabled, policy_changed, invalidated);
-  if (type == enterprise_management::DeviceRegisterRequest::DEVICE) {
-    base::UmaHistogramEnumeration(kMetricDevicePolicyRefresh,
-                                  metric_policy_refresh,
-                                  METRIC_POLICY_REFRESH_SIZE);
-    base::UmaHistogramEnumeration(kMetricDevicePolicyRefreshFcm,
-                                  metric_policy_refresh,
-                                  METRIC_POLICY_REFRESH_SIZE);
-  } else {
-    base::UmaHistogramEnumeration(kMetricUserPolicyRefresh,
-                                  metric_policy_refresh,
-                                  METRIC_POLICY_REFRESH_SIZE);
-    base::UmaHistogramEnumeration(kMetricUserPolicyRefreshFcm,
-                                  metric_policy_refresh,
-                                  METRIC_POLICY_REFRESH_SIZE);
+PolicyInvalidationType GetInvalidationMetric(bool is_missing_payload,
+                                             bool is_expired) {
+  if (is_expired) {
+    if (is_missing_payload)
+      return POLICY_INVALIDATION_TYPE_NO_PAYLOAD_EXPIRED;
+    return POLICY_INVALIDATION_TYPE_EXPIRED;
   }
+  if (is_missing_payload)
+    return POLICY_INVALIDATION_TYPE_NO_PAYLOAD;
+  return POLICY_INVALIDATION_TYPE_NORMAL;
+}
+
+void RecordPolicyRefreshMetric(PolicyInvalidationScope scope,
+                               bool invalidations_enabled,
+                               bool policy_changed,
+                               bool invalidated) {
+  const MetricPolicyRefresh metric_policy_refresh = GetPolicyRefreshMetric(
+      invalidations_enabled, policy_changed, invalidated);
+  base::UmaHistogramEnumeration(
+      CloudPolicyInvalidator::GetPolicyRefreshMetricName(scope),
+      metric_policy_refresh, METRIC_POLICY_REFRESH_SIZE);
+  base::UmaHistogramEnumeration(
+      CloudPolicyInvalidator::GetPolicyRefreshFcmMetricName(scope),
+      metric_policy_refresh, METRIC_POLICY_REFRESH_SIZE);
+}
+
+void RecordPolicyInvalidationMetric(PolicyInvalidationScope scope,
+                                    bool is_expired,
+                                    bool is_missing_payload) {
+  const PolicyInvalidationType policy_invalidation_type =
+      GetInvalidationMetric(is_missing_payload, is_expired);
+  base::UmaHistogramEnumeration(
+      CloudPolicyInvalidator::GetPolicyInvalidationMetricName(scope),
+      policy_invalidation_type, POLICY_INVALIDATION_TYPE_SIZE);
+  base::UmaHistogramEnumeration(
+      CloudPolicyInvalidator::GetPolicyInvalidationFcmMetricName(scope),
+      policy_invalidation_type, POLICY_INVALIDATION_TYPE_SIZE);
 }
 
 }  // namespace
@@ -79,18 +92,70 @@
 const int CloudPolicyInvalidator::kUnknownVersionIgnorePeriod = 30;
 const int CloudPolicyInvalidator::kMaxInvalidationTimeDelta = 300;
 
+// static
+const char* CloudPolicyInvalidator::GetPolicyRefreshMetricName(
+    PolicyInvalidationScope scope) {
+  switch (scope) {
+    case PolicyInvalidationScope::kUser:
+      return kMetricUserPolicyRefresh;
+    case PolicyInvalidationScope::kDevice:
+      return kMetricDevicePolicyRefresh;
+    case PolicyInvalidationScope::kDeviceLocalAccount:
+      return kMetricDeviceLocalAccountPolicyRefresh;
+  }
+}
+
+// static
+const char* CloudPolicyInvalidator::GetPolicyRefreshFcmMetricName(
+    PolicyInvalidationScope scope) {
+  switch (scope) {
+    case PolicyInvalidationScope::kUser:
+      return kMetricUserPolicyRefreshFcm;
+    case PolicyInvalidationScope::kDevice:
+      return kMetricDevicePolicyRefreshFcm;
+    case PolicyInvalidationScope::kDeviceLocalAccount:
+      return kMetricDeviceLocalAccountPolicyRefreshFcm;
+  }
+}
+
+// static
+const char* CloudPolicyInvalidator::GetPolicyInvalidationMetricName(
+    PolicyInvalidationScope scope) {
+  switch (scope) {
+    case PolicyInvalidationScope::kUser:
+      return kMetricUserPolicyInvalidations;
+    case PolicyInvalidationScope::kDevice:
+      return kMetricDevicePolicyInvalidations;
+    case PolicyInvalidationScope::kDeviceLocalAccount:
+      return kMetricDeviceLocalAccountPolicyInvalidations;
+  }
+}
+
+// static
+const char* CloudPolicyInvalidator::GetPolicyInvalidationFcmMetricName(
+    PolicyInvalidationScope scope) {
+  switch (scope) {
+    case PolicyInvalidationScope::kUser:
+      return kMetricUserPolicyInvalidationsFcm;
+    case PolicyInvalidationScope::kDevice:
+      return kMetricDevicePolicyInvalidationsFcm;
+    case PolicyInvalidationScope::kDeviceLocalAccount:
+      return kMetricDeviceLocalAccountPolicyInvalidationsFcm;
+  }
+}
+
 CloudPolicyInvalidator::CloudPolicyInvalidator(
-    enterprise_management::DeviceRegisterRequest::Type type,
+    PolicyInvalidationScope scope,
     CloudPolicyCore* core,
     const scoped_refptr<base::SequencedTaskRunner>& task_runner,
     base::Clock* clock,
     int64_t highest_handled_invalidation_version)
     : state_(UNINITIALIZED),
-      type_(type),
+      scope_(scope),
       core_(core),
       task_runner_(task_runner),
       clock_(clock),
-      invalidation_service_(NULL),
+      invalidation_service_(nullptr),
       invalidations_enabled_(false),
       invalidation_service_enabled_(false),
       is_registered_(false),
@@ -212,8 +277,8 @@
     const bool invalidated =
         invalid_ && store_invalidation_version == invalidation_version_;
 
-    bool invalidations_enabled = GetInvalidationsEnabled();
-    RecordPolicyRefreshMetric(type_, invalidations_enabled, policy_changed,
+    const bool invalidations_enabled = GetInvalidationsEnabled();
+    RecordPolicyRefreshMetric(scope_, invalidations_enabled, policy_changed,
                               invalidated);
 
     // If the policy was invalid and the version stored matches the latest
@@ -269,25 +334,11 @@
   }
 
   // Ignore the invalidation if it is expired.
-  bool is_expired = IsInvalidationExpired(version);
+  const bool is_expired = IsInvalidationExpired(version);
+  const bool is_missing_payload = payload.empty();
 
-  PolicyInvalidationType policy_invalidation_type =
-      GetInvalidationMetric(payload.empty(), is_expired);
-  if (type_ == enterprise_management::DeviceRegisterRequest::DEVICE) {
-    base::UmaHistogramEnumeration(kMetricDevicePolicyInvalidations,
-                                  policy_invalidation_type,
-                                  POLICY_INVALIDATION_TYPE_SIZE);
-    base::UmaHistogramEnumeration(kMetricDevicePolicyInvalidationsFcm,
-                                  policy_invalidation_type,
-                                  POLICY_INVALIDATION_TYPE_SIZE);
-  } else {
-    base::UmaHistogramEnumeration(kMetricUserPolicyInvalidations,
-                                  policy_invalidation_type,
-                                  POLICY_INVALIDATION_TYPE_SIZE);
-    base::UmaHistogramEnumeration(kMetricUserPolicyInvalidationsFcm,
-                                  policy_invalidation_type,
-                                  POLICY_INVALIDATION_TYPE_SIZE);
-  }
+  RecordPolicyInvalidationMetric(scope_, is_expired, is_missing_payload);
+
   if (is_expired) {
     invalidation.Acknowledge();
     return;
@@ -464,19 +515,6 @@
   return invalidation_time < last_fetch_time;
 }
 
-PolicyInvalidationType CloudPolicyInvalidator::GetInvalidationMetric(
-    bool is_missing_payload,
-    bool is_expired) {
-  if (is_expired) {
-    if (is_missing_payload)
-      return POLICY_INVALIDATION_TYPE_NO_PAYLOAD_EXPIRED;
-    return POLICY_INVALIDATION_TYPE_EXPIRED;
-  }
-  if (is_missing_payload)
-    return POLICY_INVALIDATION_TYPE_NO_PAYLOAD;
-  return POLICY_INVALIDATION_TYPE_NORMAL;
-}
-
 bool CloudPolicyInvalidator::GetInvalidationsEnabled() {
   if (!invalidations_enabled_)
     return false;
diff --git a/chrome/browser/policy/cloud/cloud_policy_invalidator.h b/chrome/browser/policy/cloud/cloud_policy_invalidator.h
index d01b8ca..bc3c6ba5 100644
--- a/chrome/browser/policy/cloud/cloud_policy_invalidator.h
+++ b/chrome/browser/policy/cloud/cloud_policy_invalidator.h
@@ -22,8 +22,7 @@
 #include "components/invalidation/public/invalidation_util.h"
 #include "components/policy/core/common/cloud/cloud_policy_core.h"
 #include "components/policy/core/common/cloud/cloud_policy_store.h"
-#include "components/policy/core/common/cloud/enterprise_metrics.h"
-#include "components/policy/proto/device_management_backend.pb.h"
+#include "components/policy/core/common/cloud/policy_invalidation_scope.h"
 
 namespace base {
 class Clock;
@@ -62,7 +61,21 @@
   // invalidation timestamps when determining if an invalidation is expired.
   static const int kMaxInvalidationTimeDelta;
 
-  // |type| indicates the policy type that this invalidator is responsible for.
+  // Returns a name of a refresh metric associated with the given scope.
+  static const char* GetPolicyRefreshMetricName(PolicyInvalidationScope scope);
+  // Returns a name of a FCM refresh metric associated with the given scope.
+  static const char* GetPolicyRefreshFcmMetricName(
+      PolicyInvalidationScope scope);
+  // Returns a name of an invalidation metric associated with the given scope.
+  static const char* GetPolicyInvalidationMetricName(
+      PolicyInvalidationScope scope);
+  // Returns a name of an FCM invalidation metric associated with the given
+  // scope.
+  static const char* GetPolicyInvalidationFcmMetricName(
+      PolicyInvalidationScope scope);
+
+  // |scope| indicates the invalidation scope that this invalidator
+  // is responsible for.
   // |core| is the cloud policy core which connects the various policy objects.
   // It must remain valid until Shutdown is called.
   // |task_runner| is used for scheduling delayed tasks. It must post tasks to
@@ -71,7 +84,7 @@
   // |highest_handled_invalidation_version| is the highest invalidation version
   // that was handled already before this invalidator was created.
   CloudPolicyInvalidator(
-      enterprise_management::DeviceRegisterRequest::Type type,
+      PolicyInvalidationScope scope,
       CloudPolicyCore* core,
       const scoped_refptr<base::SequencedTaskRunner>& task_runner,
       base::Clock* clock,
@@ -161,11 +174,6 @@
   // |version| is the version of the invalidation, or zero for unknown.
   bool IsInvalidationExpired(int64_t version);
 
-  // Get the kMetricPolicyInvalidations histogram metric which should be
-  // incremented when an invalidation is received.
-  PolicyInvalidationType GetInvalidationMetric(bool is_missing_payload,
-                                               bool is_expired);
-
   // Determine if invalidations have been enabled longer than the grace period.
   bool GetInvalidationsEnabled();
 
@@ -178,8 +186,8 @@
   };
   State state_;
 
-  // The policy type this invalidator is responsible for.
-  const enterprise_management::DeviceRegisterRequest::Type type_;
+  // The invalidation scope this invalidator is responsible for.
+  const PolicyInvalidationScope scope_;
 
   // The cloud policy core.
   CloudPolicyCore* core_;
diff --git a/chrome/browser/policy/cloud/cloud_policy_invalidator_unittest.cc b/chrome/browser/policy/cloud/cloud_policy_invalidator_unittest.cc
index ad3f7137..f9ca311 100644
--- a/chrome/browser/policy/cloud/cloud_policy_invalidator_unittest.cc
+++ b/chrome/browser/policy/cloud/cloud_policy_invalidator_unittest.cc
@@ -17,6 +17,7 @@
 #include "base/metrics/sample_map.h"
 #include "base/metrics/statistics_recorder.h"
 #include "base/run_loop.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/simple_test_clock.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_simple_task_runner.h"
@@ -33,6 +34,7 @@
 #include "components/policy/core/common/cloud/enterprise_metrics.h"
 #include "components/policy/core/common/cloud/mock_cloud_policy_client.h"
 #include "components/policy/core/common/cloud/mock_cloud_policy_store.h"
+#include "components/policy/core/common/cloud/policy_invalidation_scope.h"
 #include "components/policy/core/common/policy_types.h"
 #include "components/policy/policy_constants.h"
 #include "services/network/test/test_network_connection_tracker.h"
@@ -173,8 +175,8 @@
   // Get an invalidation version for the given time.
   int64_t GetVersion(base::Time time);
 
-  // Get the policy type that the |invalidator_| is responsible for.
-  virtual em::DeviceRegisterRequest::Type GetPolicyType() const;
+  // Get the invalidation scope that the |invalidator_| is responsible for.
+  virtual PolicyInvalidationScope GetPolicyInvalidationScope() const;
 
  private:
   // Checks that the policy was refreshed due to an invalidation with the given
@@ -240,9 +242,9 @@
     bool initialize,
     bool start_refresh_scheduler,
     int64_t highest_handled_invalidation_version) {
-  invalidator_.reset(
-      new CloudPolicyInvalidator(GetPolicyType(), &core_, task_runner_, &clock_,
-                                 highest_handled_invalidation_version));
+  invalidator_.reset(new CloudPolicyInvalidator(
+      GetPolicyInvalidationScope(), &core_, task_runner_, &clock_,
+      highest_handled_invalidation_version));
   if (start_refresh_scheduler) {
     ConnectCore();
     StartRefreshScheduler();
@@ -404,9 +406,9 @@
   return (time - base::Time::UnixEpoch()).InMicroseconds();
 }
 
-em::DeviceRegisterRequest::Type CloudPolicyInvalidatorTestBase::GetPolicyType()
-    const {
-  return UserCloudPolicyInvalidator::GetPolicyType();
+PolicyInvalidationScope
+CloudPolicyInvalidatorTestBase::GetPolicyInvalidationScope() const {
+  return PolicyInvalidationScope::kUser;
 }
 
 bool CloudPolicyInvalidatorTestBase::CheckPolicyRefreshed(
@@ -852,13 +854,10 @@
 
 class CloudPolicyInvalidatorUserTypedTest
     : public CloudPolicyInvalidatorTestBase,
-      public testing::WithParamInterface<em::DeviceRegisterRequest::Type> {
+      public testing::WithParamInterface<PolicyInvalidationScope> {
  protected:
-  CloudPolicyInvalidatorUserTypedTest();
-  // CloudPolicyInvalidatorTest:
-  void SetUp() override;
+  CloudPolicyInvalidatorUserTypedTest() = default;
 
-  // Get the current count for the given metric.
   base::HistogramBase::Count GetCount(MetricPolicyRefresh metric);
   base::HistogramBase::Count GetCountFcm(MetricPolicyRefresh metric);
   base::HistogramBase::Count GetInvalidationCount(PolicyInvalidationType type);
@@ -867,95 +866,52 @@
 
  private:
   // CloudPolicyInvalidatorTest:
-  em::DeviceRegisterRequest::Type GetPolicyType() const override;
+  PolicyInvalidationScope GetPolicyInvalidationScope() const override;
 
-  // Get histogram samples for the given histogram.
-  std::unique_ptr<base::HistogramSamples> GetHistogramSamples(
-      const std::string& name) const;
-
-  // Stores starting histogram counts for kMetricPolicyRefresh.
-  std::unique_ptr<base::HistogramSamples> refresh_samples_;
-  std::unique_ptr<base::HistogramSamples> refresh_samples_fcm_;
-
-  // Stores starting histogram counts for kMetricPolicyInvalidations.
-  std::unique_ptr<base::HistogramSamples> invalidations_samples_;
-  std::unique_ptr<base::HistogramSamples> invalidations_samples_fcm_;
+  base::HistogramTester histogram_tester_;
 
   DISALLOW_COPY_AND_ASSIGN(CloudPolicyInvalidatorUserTypedTest);
 };
 
-CloudPolicyInvalidatorUserTypedTest::CloudPolicyInvalidatorUserTypedTest() {}
-
-void CloudPolicyInvalidatorUserTypedTest::SetUp() {
-  refresh_samples_ = GetHistogramSamples(
-      GetPolicyType() == em::DeviceRegisterRequest::DEVICE ?
-          kMetricDevicePolicyRefresh : kMetricUserPolicyRefresh);
-  refresh_samples_fcm_ =
-      GetHistogramSamples(GetPolicyType() == em::DeviceRegisterRequest::DEVICE
-                              ? kMetricDevicePolicyRefreshFcm
-                              : kMetricUserPolicyRefreshFcm);
-  invalidations_samples_ = GetHistogramSamples(
-      GetPolicyType() == em::DeviceRegisterRequest::DEVICE ?
-          kMetricDevicePolicyInvalidations : kMetricUserPolicyInvalidations);
-  invalidations_samples_fcm_ =
-      GetHistogramSamples(GetPolicyType() == em::DeviceRegisterRequest::DEVICE
-                              ? kMetricDevicePolicyInvalidationsFcm
-                              : kMetricUserPolicyInvalidationsFcm);
-}
-
 base::HistogramBase::Count CloudPolicyInvalidatorUserTypedTest::GetCount(
     MetricPolicyRefresh metric) {
-  return GetHistogramSamples(
-      GetPolicyType() == em::DeviceRegisterRequest::DEVICE ?
-          kMetricDevicePolicyRefresh : kMetricUserPolicyRefresh)->
-              GetCount(metric) - refresh_samples_->GetCount(metric);
+  const char* metric_name = CloudPolicyInvalidator::GetPolicyRefreshMetricName(
+      GetPolicyInvalidationScope());
+  return histogram_tester_.GetHistogramSamplesSinceCreation(metric_name)
+      ->GetCount(metric);
 }
-
 base::HistogramBase::Count CloudPolicyInvalidatorUserTypedTest::GetCountFcm(
     MetricPolicyRefresh metric) {
-  return GetHistogramSamples(GetPolicyType() ==
-                                     em::DeviceRegisterRequest::DEVICE
-                                 ? kMetricDevicePolicyRefreshFcm
-                                 : kMetricUserPolicyRefreshFcm)
-             ->GetCount(metric) -
-         refresh_samples_fcm_->GetCount(metric);
+  const char* metric_name =
+      CloudPolicyInvalidator::GetPolicyRefreshFcmMetricName(
+          GetPolicyInvalidationScope());
+  return histogram_tester_.GetHistogramSamplesSinceCreation(metric_name)
+      ->GetCount(metric);
 }
-
 base::HistogramBase::Count
 CloudPolicyInvalidatorUserTypedTest::GetInvalidationCount(
     PolicyInvalidationType type) {
-  return GetHistogramSamples(
-      GetPolicyType() == em::DeviceRegisterRequest::DEVICE ?
-          kMetricDevicePolicyInvalidations : kMetricUserPolicyInvalidations)->
-          GetCount(type) - invalidations_samples_->GetCount(type);
+  const char* metric_name =
+      CloudPolicyInvalidator::GetPolicyInvalidationMetricName(
+          GetPolicyInvalidationScope());
+  return histogram_tester_.GetHistogramSamplesSinceCreation(metric_name)
+      ->GetCount(type);
 }
-
 base::HistogramBase::Count
 CloudPolicyInvalidatorUserTypedTest::GetInvalidationCountFcm(
     PolicyInvalidationType type) {
-  return GetHistogramSamples(GetPolicyType() ==
-                                     em::DeviceRegisterRequest::DEVICE
-                                 ? kMetricDevicePolicyInvalidationsFcm
-                                 : kMetricUserPolicyInvalidationsFcm)
-             ->GetCount(type) -
-         invalidations_samples_fcm_->GetCount(type);
+  const char* metric_name =
+      CloudPolicyInvalidator::GetPolicyInvalidationFcmMetricName(
+          GetPolicyInvalidationScope());
+  return histogram_tester_.GetHistogramSamplesSinceCreation(metric_name)
+      ->GetCount(type);
 }
 
-em::DeviceRegisterRequest::Type
-CloudPolicyInvalidatorUserTypedTest::GetPolicyType() const {
+PolicyInvalidationScope
+CloudPolicyInvalidatorUserTypedTest::GetPolicyInvalidationScope() const {
   return GetParam();
 }
 
-std::unique_ptr<base::HistogramSamples>
-CloudPolicyInvalidatorUserTypedTest::GetHistogramSamples(
-    const std::string& name) const {
-  base::HistogramBase* histogram =
-      base::StatisticsRecorder::FindHistogram(name);
-  if (!histogram)
-    return std::unique_ptr<base::HistogramSamples>(new base::SampleMap());
-  return histogram->SnapshotSamples();
-}
-
 TEST_P(CloudPolicyInvalidatorUserTypedTest, RefreshMetricsUnregistered) {
   // Store loads occurring before invalidation registration are not counted.
   StartInvalidator();
@@ -1166,20 +1122,11 @@
   EXPECT_EQ(0, GetHighestHandledInvalidationVersion());
 }
 
-#if defined(OS_CHROMEOS)
-INSTANTIATE_TEST_SUITE_P(CloudPolicyInvalidatorUserTypedTestInstance,
-                         CloudPolicyInvalidatorUserTypedTest,
-                         testing::Values(em::DeviceRegisterRequest::USER,
-                                         em::DeviceRegisterRequest::DEVICE));
-#elif defined(OS_ANDROID)
 INSTANTIATE_TEST_SUITE_P(
     CloudPolicyInvalidatorUserTypedTestInstance,
     CloudPolicyInvalidatorUserTypedTest,
-    testing::Values(em::DeviceRegisterRequest::ANDROID_BROWSER));
-#else
-INSTANTIATE_TEST_SUITE_P(CloudPolicyInvalidatorUserTypedTestInstance,
-                         CloudPolicyInvalidatorUserTypedTest,
-                         testing::Values(em::DeviceRegisterRequest::BROWSER));
-#endif
+    testing::Values(PolicyInvalidationScope::kUser,
+                    PolicyInvalidationScope::kDevice,
+                    PolicyInvalidationScope::kDeviceLocalAccount));
 
 }  // namespace policy
diff --git a/chrome/browser/policy/cloud/user_cloud_policy_invalidator.cc b/chrome/browser/policy/cloud/user_cloud_policy_invalidator.cc
index 74e2875..eb9dc4ca 100644
--- a/chrome/browser/policy/cloud/user_cloud_policy_invalidator.cc
+++ b/chrome/browser/policy/cloud/user_cloud_policy_invalidator.cc
@@ -32,7 +32,7 @@
 UserCloudPolicyInvalidator::UserCloudPolicyInvalidator(
     Profile* profile,
     CloudPolicyManager* policy_manager)
-    : CloudPolicyInvalidator(GetPolicyType(),
+    : CloudPolicyInvalidator(PolicyInvalidationScope::kUser,
                              policy_manager->core(),
                              base::ThreadTaskRunnerHandle::Get(),
                              base::DefaultClock::GetInstance(),
@@ -52,18 +52,6 @@
                  content::Source<Profile>(profile));
 }
 
-// static
-enterprise_management::DeviceRegisterRequest::Type
-UserCloudPolicyInvalidator::GetPolicyType() {
-#if defined(OS_CHROMEOS)
-  return enterprise_management::DeviceRegisterRequest::USER;
-#elif defined(OS_ANDROID)
-  return enterprise_management::DeviceRegisterRequest::ANDROID_BROWSER;
-#else
-  return enterprise_management::DeviceRegisterRequest::BROWSER;
-#endif
-}
-
 void UserCloudPolicyInvalidator::Shutdown() {
   CloudPolicyInvalidator::Shutdown();
 }
diff --git a/chrome/browser/policy/cloud/user_cloud_policy_invalidator.h b/chrome/browser/policy/cloud/user_cloud_policy_invalidator.h
index 5b02b66..a0a80273 100644
--- a/chrome/browser/policy/cloud/user_cloud_policy_invalidator.h
+++ b/chrome/browser/policy/cloud/user_cloud_policy_invalidator.h
@@ -8,7 +8,6 @@
 #include "base/macros.h"
 #include "chrome/browser/policy/cloud/cloud_policy_invalidator.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "components/policy/proto/device_management_backend.pb.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 
@@ -32,8 +31,6 @@
   UserCloudPolicyInvalidator(Profile* profile,
                              CloudPolicyManager* policy_manager);
 
-  static enterprise_management::DeviceRegisterRequest::Type GetPolicyType();
-
   // KeyedService:
   void Shutdown() override;
 
diff --git a/chrome/browser/resources/browser_switch/app.html b/chrome/browser/resources/browser_switch/app.html
index 6989006..156465a 100644
--- a/chrome/browser/resources/browser_switch/app.html
+++ b/chrome/browser/resources/browser_switch/app.html
@@ -3,6 +3,7 @@
     @apply --cr-card-elevation;
     background-color: var(--cr-card-background-color);
     border-radius: var(--cr-card-border-radius);
+    color: var(--cr-primary-text-color);
     display: block;
     margin: 16px;
     max-width: 640px;
@@ -11,7 +12,6 @@
   }
 
   h1 {
-    color: var(--cr-primary-text-color);
     font-size: 1rem;
     font-weight: 500;
     margin: 0;
@@ -19,13 +19,22 @@
   }
 
   p {
-    color: var(--cr-primary-text-color);
     /* Should be 13px when html font-size is 16px */
     font-size: 0.8125rem;
     margin: 0;
     max-width: 450px;
   }
+
+  iron-icon {
+    height: 24px;
+    margin-inline-end: 0.5rem;
+    margin-top: -0.4rem;
+    width: 24px;
+  }
 </style>
 
-<h1>[[computeTitle_(error_, secondCounter_)]]</h1>
+<h1>
+  <iron-icon icon="cr:domain"></iron-icon>
+  [[computeTitle_(error_, secondCounter_)]]
+</h1>
 <p inner-h-t-m-l="[[computeDescription_(url_, error_)]]"></p>
diff --git a/chrome/browser/resources/browser_switch/app.js b/chrome/browser/resources/browser_switch/app.js
index 810b0a2..32578aa 100644
--- a/chrome/browser/resources/browser_switch/app.js
+++ b/chrome/browser/resources/browser_switch/app.js
@@ -2,7 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'chrome://resources/cr_elements/icons.m.js';
 import 'chrome://resources/cr_elements/shared_vars_css.m.js';
+import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import './strings.m.js';
 
 import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js
index 9a7b417..34962af1 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js
@@ -54,6 +54,9 @@
     /** @private {number?} */
     this.delayedAttributeOutputId_;
 
+    /** @private {!Date} */
+    this.lastHoverExit_ = new Date();
+
     this.addListener_(EventType.ALERT, this.onAlert);
     this.addListener_(EventType.BLUR, this.onBlur);
     this.addListener_(
@@ -153,7 +156,7 @@
     let targetLeaf = null;
     let targetObject = null;
     while (target && target != target.root) {
-      if (!targetObject && AutomationPredicate.object(target)) {
+      if (!targetObject && AutomationPredicate.touchObject(target)) {
         targetObject = target;
       }
       if (AutomationPredicate.touchLeaf(target)) {
@@ -164,6 +167,19 @@
 
     target = targetLeaf || targetObject;
     if (!target) {
+      // This clears the anchor point in the TouchExplorationController (so
+      // things like double tap won't be directed to the previous target). It
+      // also ensures if a user touch explores back to the previous range, it
+      // will be announced again.
+      ChromeVoxState.instance.setCurrentRange(null);
+
+      // Play a earcon to let the user know they're in the middle of nowhere.
+      if ((new Date() - this.lastHoverExit_) >
+          DesktopAutomationHandler.MIN_HOVER_EXIT_SOUND_DELAY_MS) {
+        ChromeVoxState.instance.nextEarcons_.engine_.onTouchExitAnchor();
+        this.lastHoverExit_ = new Date();
+      }
+      chrome.tts.stop();
       return;
     }
 
@@ -176,6 +192,7 @@
       this.textEditHandler_ = null;
     }
 
+    ChromeVoxState.instance.nextEarcons_.engine_.onTouchEnterAnchor();
     Output.forceModeForNextSpeechUtterance(QueueMode.FLUSH);
     this.onEventDefault(
         new CustomAutomationEvent(evt.type, target, evt.eventFrom));
@@ -663,6 +680,9 @@
  */
 DesktopAutomationHandler.announceActions = false;
 
+/** @const {number} */
+DesktopAutomationHandler.MIN_HOVER_EXIT_SOUND_DELAY_MS = 500;
+
 
 /**
  * Global instance.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js
index 3854fec..cded853 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js
@@ -381,6 +381,34 @@
     this.play('selection_reverse');
   }
 
+  onTouchEnterAnchor() {
+    this.play('static', {gain: this.clickVolume});
+    const freq1 = 220 * Math.pow(EarconEngine.HALF_STEP, 6);
+    this.generateSinusoidal({
+      attack: 0.0,
+      decay: 0.01,
+      dur: 0.03,
+      gain: 0.5,
+      freq: freq1,
+      overtones: 1,
+      overtoneFactor: 0.8
+    });
+  }
+
+  onTouchExitAnchor() {
+    this.play('static', {gain: this.clickVolume});
+    const freq1 = 220 * Math.pow(EarconEngine.HALF_STEP, 13);
+    this.generateSinusoidal({
+      attack: 0.00001,
+      decay: 0.01,
+      dur: 0.1,
+      gain: 0.3,
+      freq: freq1,
+      overtones: 1,
+      overtoneFactor: 0.1
+    });
+  }
+
   /**
    * Generate a synthesized musical note based on a sum of sinusoidals shaped
    * by an envelope, controlled by a number of properties.
diff --git a/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js b/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js
index 4cf3331e..e6592ca 100644
--- a/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js
+++ b/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js
@@ -122,7 +122,7 @@
    * @return {boolean}
    */
   static touchLeaf(node) {
-    return !node.firstChild || node.role == Role.BUTTON ||
+    return !!(!node.firstChild && node.name) || node.role == Role.BUTTON ||
         node.role == Role.POP_UP_BUTTON || node.role == Role.SLIDER ||
         node.role == Role.TEXT_FIELD ||
         (node.role == Role.MENU_ITEM && !hasActionableDescendant(node));
@@ -239,6 +239,20 @@
   }
 
   /**
+   * Matches against nodes visited during touch exploration.
+   * @param {!AutomationNode} node
+   * @return {boolean}
+   */
+  static touchObject(node) {
+    // Exclude large objects such as containers.
+    if (AutomationPredicate.container(node)) {
+      return false;
+    }
+
+    return AutomationPredicate.object(node);
+  }
+
+  /**
    * @param {!AutomationNode} first
    * @param {!AutomationNode} second
    * @return {boolean}
diff --git a/chrome/browser/resources/chromeos/camera/src/js/metrics.js b/chrome/browser/resources/chromeos/camera/src/js/metrics.js
index 2b30f81..c1e2aac 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/metrics.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/metrics.js
@@ -6,6 +6,8 @@
 // eslint-disable-next-line no-unused-vars
 import {Intent} from './intent.js';
 import * as state from './state.js';
+// eslint-disable-next-line no-unused-vars
+import {Facing} from './type.js';
 import {
   Mode,
   Resolution,  // eslint-disable-line no-unused-vars
@@ -94,7 +96,7 @@
 
 /**
  * Returns event builder for the metrics type: capture.
- * @param {?string} facingMode Camera facing-mode of the capture.
+ * @param {!Facing} facingMode Camera facing-mode of the capture.
  * @param {number} length Length of 1 minute buckets for captured video.
  * @param {!Resolution} resolution Capture resolution.
  * @param {!IntentResultType} intentResult
@@ -120,7 +122,7 @@
   const State = state.State;
   return base.category('capture')
       .action(condState(Object.values(Mode)))
-      .label(facingMode || '(not set)')
+      .label(facingMode)
       // Skips 3rd dimension for obsolete 'sound' state.
       .dimen(4, condState([State.MIRROR]))
       .dimen(
diff --git a/chrome/browser/resources/chromeos/camera/src/js/mojo/device_operator.js b/chrome/browser/resources/chromeos/camera/src/js/mojo/device_operator.js
index b1c5382..712074c 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/mojo/device_operator.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/mojo/device_operator.js
@@ -114,7 +114,7 @@
     const {device, status} =
         await this.deviceProvider_.getCameraAppDevice(deviceId);
     if (status === cros.mojom.GetCameraAppDeviceStatus.ERROR_INVALID_ID) {
-      throw new Error('Invalid device id: ', deviceId);
+      throw new Error(`Invalid device id: ${deviceId}`);
     }
     if (device === null) {
       throw new Error('Unknown error');
diff --git a/chrome/browser/resources/chromeos/camera/src/js/type.js b/chrome/browser/resources/chromeos/camera/src/js/type.js
index 6d91ff2..8d534f3 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/type.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/type.js
@@ -87,6 +87,19 @@
   PORTRAIT: 'portrait',
 };
 
+/**
+ * Camera facings.
+ * @enum {string}
+ */
+export const Facing = {
+  USER: 'user',
+  ENVIRONMENT: 'environment',
+  EXTERNAL: 'external',
+  NOT_SET: '(not set)',
+  UNKNOWN: 'unknown',
+};
+
+
 // The types here are used only in jsdoc and are required to be explicitly
 // exported in order to be referenced by closure compiler.
 // TODO(inker): Exports/Imports these jsdoc only types by closure compiler
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera.js
index 61600dc..6077e730 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/views/camera.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera.js
@@ -21,7 +21,10 @@
 import * as sound from '../sound.js';
 import * as state from '../state.js';
 import * as toast from '../toast.js';
-import {Mode} from '../type.js';
+import {
+  Facing,  // eslint-disable-line no-unused-vars
+  Mode,
+} from '../type.js';
 import * as util from '../util.js';
 
 import {Layout} from './camera/layout.js';
@@ -136,10 +139,10 @@
         this.doSaveVideo_.bind(this), playShutterEffect);
 
     /**
-     * @type {?string}
+     * @type {!Facing}
      * @protected
      */
-    this.facingMode_ = null;
+    this.facingMode_ = Facing.UNKNOWN;
 
     /**
      * @type {boolean}
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera/options.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera/options.js
index 837c72f..3b7f161 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/views/camera/options.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera/options.js
@@ -12,6 +12,7 @@
 import * as nav from '../../nav.js';
 import {PerfEvent} from '../../perf.js';
 import * as state from '../../state.js';
+import {Facing} from '../../type.js';
 import * as util from '../../util.js';
 import {ViewName} from '../view.js';
 
@@ -158,14 +159,33 @@
   }
 
   /**
+   * Maps MediaTrackSettings.facingMode to CCA facing type.
+   * @param {string|undefined} facing The target facingMode to map.
+   * @return {!Facing} The mapped CCA facing.
+   * @private
+   */
+  mapFacing_(facing) {
+    switch (facing) {
+      case undefined:
+        return Facing.EXTERNAL;
+      case 'user':
+        return Facing.USER;
+      case 'environment':
+        return Facing.ENVIRONMENT;
+      default:
+        throw new Error('Unknown facing: ' + facing);
+    }
+  }
+
+  /**
    * Updates the options' values for the current constraints and stream.
    * @param {!MediaStream} stream Current Stream in use.
-   * @return {!Promise<?string>} Facing-mode in use.
+   * @return {!Promise<!Facing>} Facing-mode in use.
    */
   async updateValues(stream) {
     const track = stream.getVideoTracks()[0];
     const trackSettings = track.getSettings && track.getSettings();
-    let facingMode = trackSettings && trackSettings.facingMode;
+    const facingMode = trackSettings && trackSettings.facingMode;
     if (this.isV1NoFacingConfig_ === null) {
       // Because the facing mode of external camera will be set to undefined on
       // all devices, to distinguish HALv1 device without facing configuration,
@@ -175,23 +195,24 @@
       // after CCA launched the logic here may misjudge it as this category.
       this.isV1NoFacingConfig_ = facingMode === undefined;
     }
-    facingMode = this.isV1NoFacingConfig_ ? null : facingMode || 'external';
+    const facing =
+        this.isV1NoFacingConfig_ ? Facing.NOT_SET : this.mapFacing_(facingMode);
     this.videoDeviceId_ = trackSettings && trackSettings.deviceId || null;
-    this.updateMirroring_(facingMode);
+    this.updateMirroring_(facing);
     this.audioTrack_ = stream.getAudioTracks()[0];
     this.updateAudioByMic_();
-    return facingMode;
+    return facing;
   }
 
   /**
    * Updates mirroring for a new stream.
-   * @param {?string} facingMode Facing-mode of the stream.
+   * @param {!Facing} facing Facing of the stream.
    * @private
    */
-  updateMirroring_(facingMode) {
+  updateMirroring_(facing) {
     // Update mirroring by detected facing-mode. Enable mirroring by default if
     // facing-mode isn't available.
-    let enabled = facingMode ? facingMode !== 'environment' : true;
+    let enabled = facing !== Facing.ENVIRONMENT;
 
     // Override mirroring only if mirroring was toggled manually.
     if (this.videoDeviceId_ in this.mirroringToggles_) {
diff --git a/chrome/browser/resources/settings/autofill_page/password_check.html b/chrome/browser/resources/settings/autofill_page/password_check.html
index 3bc915c..cc72763b 100644
--- a/chrome/browser/resources/settings/autofill_page/password_check.html
+++ b/chrome/browser/resources/settings/autofill_page/password_check.html
@@ -38,6 +38,12 @@
         $i18n{checkPasswordsAgain}
       </cr-button>
     </div>
+    <div id="noCompromisedCredentials"
+        hidden$="[[hasLeakedCredentials_(leakedPasswords)]]">
+      <div class="settings-box secondary">
+        $i18n{noCompromisedCredentials}
+      </div>
+    </div>
     <div id="passwordCheckBody"
         hidden$="[[!hasLeakedCredentials_(leakedPasswords)]]">
       <div class="settings-box">
diff --git a/chrome/browser/resources/settings/people_page/sync_page.html b/chrome/browser/resources/settings/people_page/sync_page.html
index 896d621..1e6482ea 100644
--- a/chrome/browser/resources/settings/people_page/sync_page.html
+++ b/chrome/browser/resources/settings/people_page/sync_page.html
@@ -200,9 +200,9 @@
               disabled$="[[hideActivityControlsUrl_]]">
             <div class="start settings-box-text">
               $i18n{personalizeGoogleServicesTitle}
-              <div id="history-usage-hint"
-                  class="secondary" hidden$="[[!isSwaaFetched_(Swaa_)]]">
-                [[getHistoryUsageHint_(Swaa_, syncPrefs.encryptAllData,
+              <div id="history-usage-off-hint"
+                  class="secondary" hidden$="[[!isSwaaOff_(Swaa_)]]">
+                [[getHistoryUsageOffHint_(Swaa_, syncPrefs.encryptAllData,
                       syncPrefs.typedUrlsSynced)]]
               </div>
             </div>
diff --git a/chrome/browser/resources/settings/people_page/sync_page.js b/chrome/browser/resources/settings/people_page/sync_page.js
index 30fdf3e..2be922e3 100644
--- a/chrome/browser/resources/settings/people_page/sync_page.js
+++ b/chrome/browser/resources/settings/people_page/sync_page.js
@@ -385,11 +385,7 @@
    * the history usage row.
    * @private
    */
-  getHistoryUsageHint_() {
-    if (this.Swaa_ === SwaaState.ON) {
-      return this.i18n('SwaaOnHint');
-    }
-
+  getHistoryUsageOffHint_() {
     if (this.Swaa_ === SwaaState.OFF) {
       if (this.syncPrefs.encryptAllData) {
         return this.i18n('dataEncryptedHint');
@@ -515,6 +511,14 @@
     return this.Swaa_ === SwaaState.ON || this.Swaa_ === SwaaState.OFF;
   },
 
+  /**
+   * @return {boolean}
+   * @private
+   */
+  isSwaaOff_() {
+    return this.Swaa_ === SwaaState.OFF;
+  },
+
   /** @private */
   onNavigateToPage_() {
     const router = settings.Router.getInstance();
diff --git a/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.html b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.html
index 2633aedd..d1610ef 100644
--- a/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.html
+++ b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.html
@@ -98,4 +98,4 @@
     </paper-tooltip>
   </template>
   <script src="recent_site_permissions.js"></script>
-</dom-module
+</dom-module>
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h
index 3144b74..ab0ac3a 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h
@@ -163,7 +163,7 @@
   // Upload the given file contents for deep scanning. The results will be
   // returned asynchronously by calling |request|'s |callback|. This must be
   // called on the UI thread.
-  void UploadForDeepScanning(std::unique_ptr<Request> request);
+  virtual void UploadForDeepScanning(std::unique_ptr<Request> request);
 
   void OnGetInstanceID(Request* request, const std::string& token);
 
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
index 90778d9..90a58f3 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
@@ -744,14 +744,17 @@
   std::fill(result_.paths_results.begin(), result_.paths_results.end(), status);
 }
 
+BinaryUploadService* DeepScanningDialogDelegate::GetBinaryUploadService() {
+  return g_browser_process->safe_browsing_service()->GetBinaryUploadService(
+      Profile::FromBrowserContext(web_contents_->GetBrowserContext()));
+}
+
 void DeepScanningDialogDelegate::UploadTextForDeepScanning(
     std::unique_ptr<BinaryUploadService::Request> request) {
   DCHECK_EQ(
       DlpDeepScanningClientRequest::WEB_CONTENT_UPLOAD,
       request->deep_scanning_request().dlp_scan_request().content_source());
-  BinaryUploadService* upload_service =
-      g_browser_process->safe_browsing_service()->GetBinaryUploadService(
-          Profile::FromBrowserContext(web_contents_->GetBrowserContext()));
+  BinaryUploadService* upload_service = GetBinaryUploadService();
   if (upload_service)
     upload_service->MaybeUploadForDeepScanning(std::move(request));
 }
@@ -763,9 +766,7 @@
       !data_.do_dlp_scan ||
       (DlpDeepScanningClientRequest::FILE_UPLOAD ==
        request->deep_scanning_request().dlp_scan_request().content_source()));
-  BinaryUploadService* upload_service =
-      g_browser_process->safe_browsing_service()->GetBinaryUploadService(
-          Profile::FromBrowserContext(web_contents_->GetBrowserContext()));
+  BinaryUploadService* upload_service = GetBinaryUploadService();
   if (upload_service)
     upload_service->MaybeUploadForDeepScanning(std::move(request));
 }
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.h b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.h
index 2c604ce8..2e53a3e 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.h
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.h
@@ -29,6 +29,7 @@
 
 namespace safe_browsing {
 
+class BinaryUploadService;
 class DeepScanningDialogViews;
 
 // A tab modal dialog delegate that informs the user of a background deep
@@ -306,6 +307,10 @@
   // DeepScanningFinalResult enum.
   void UpdateFinalResult(DeepScanningFinalResult message);
 
+  // Returns the BinaryUploadService used to upload content for deep scanning.
+  // Virtual to override in tests.
+  virtual BinaryUploadService* GetBinaryUploadService();
+
   // The web contents that is attempting to access the data.
   content::WebContents* web_contents_ = nullptr;
 
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate_browsertest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate_browsertest.cc
new file mode 100644
index 0000000..2cd1b46
--- /dev/null
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate_browsertest.cc
@@ -0,0 +1,300 @@
+// Copyright 2020 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 "base/test/bind_test_util.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.h"
+#include "chrome/browser/safe_browsing/dm_token_utils.h"
+#include "chrome/browser/ui/browser.h"
+
+namespace safe_browsing {
+
+namespace {
+
+class FakeBinaryUploadService : public BinaryUploadService {
+ public:
+  FakeBinaryUploadService() : BinaryUploadService(nullptr, nullptr, nullptr) {}
+
+  // Sets whether the user is authorized to upload data for Deep Scanning.
+  void SetAuthorized(bool authorized) {
+    authorization_result_ = authorized
+                                ? BinaryUploadService::Result::SUCCESS
+                                : BinaryUploadService::Result::UNAUTHORIZED;
+  }
+
+  // Finish the authentication request. Called after ShowForWebContents to
+  // simulate an async callback.
+  void ReturnAuthorizedResponse() {
+    authorization_request_->FinishRequest(authorization_result_,
+                                          DeepScanningClientResponse());
+  }
+
+  void SetResponseForText(BinaryUploadService::Result result,
+                          const DeepScanningClientResponse& response) {
+    prepared_text_result_ = result;
+    prepared_text_response_ = response;
+  }
+
+  void SetResponseForFile(const std::string& path,
+                          BinaryUploadService::Result result,
+                          const DeepScanningClientResponse& response) {
+    prepared_file_results_[path] = result;
+    prepared_file_responses_[path] = response;
+  }
+
+  int requests_count() const { return requests_count_; }
+
+ private:
+  void UploadForDeepScanning(std::unique_ptr<Request> request) override {
+    // The first uploaded request is the authentication one.
+    if (++requests_count_ == 1) {
+      authorization_request_.swap(request);
+    } else {
+      std::string file = request->deep_scanning_request().filename();
+      if (file.empty()) {
+        request->FinishRequest(prepared_text_result_, prepared_text_response_);
+      } else {
+        ASSERT_TRUE(prepared_file_results_.count(file));
+        ASSERT_TRUE(prepared_file_responses_.count(file));
+        request->FinishRequest(prepared_file_results_[file],
+                               prepared_file_responses_[file]);
+      }
+    }
+  }
+
+  BinaryUploadService::Result authorization_result_;
+  std::unique_ptr<Request> authorization_request_;
+  BinaryUploadService::Result prepared_text_result_;
+  DeepScanningClientResponse prepared_text_response_;
+  std::map<std::string, BinaryUploadService::Result> prepared_file_results_;
+  std::map<std::string, DeepScanningClientResponse> prepared_file_responses_;
+  int requests_count_ = 0;
+};
+
+FakeBinaryUploadService* FakeBinaryUploadServiceStorage() {
+  static FakeBinaryUploadService service;
+  return &service;
+}
+
+// A fake delegate with minimal overrides to obtain behavior that's as close to
+// the real one as possible.
+class MinimalFakeDeepScanningDialogDelegate
+    : public DeepScanningDialogDelegate {
+ public:
+  MinimalFakeDeepScanningDialogDelegate(
+      content::WebContents* web_contents,
+      DeepScanningDialogDelegate::Data data,
+      DeepScanningDialogDelegate::CompletionCallback callback)
+      : DeepScanningDialogDelegate(web_contents,
+                                   std::move(data),
+                                   std::move(callback),
+                                   DeepScanAccessPoint::UPLOAD) {}
+
+  static std::unique_ptr<DeepScanningDialogDelegate> Create(
+      content::WebContents* web_contents,
+      DeepScanningDialogDelegate::Data data,
+      DeepScanningDialogDelegate::CompletionCallback callback) {
+    return std::make_unique<MinimalFakeDeepScanningDialogDelegate>(
+        web_contents, std::move(data), std::move(callback));
+  }
+
+ private:
+  BinaryUploadService* GetBinaryUploadService() override {
+    return FakeBinaryUploadServiceStorage();
+  }
+};
+
+constexpr char kDmToken[] = "dm_token";
+
+}  // namespace
+
+// Tests the behavior of the dialog delegate with minimal overriding of methods.
+// Only responses obtained via the BinaryUploadService are faked.
+class DeepScanningDialogDelegateBrowserTest
+    : public DeepScanningBrowserTestBase {
+ public:
+  DeepScanningDialogDelegateBrowserTest() = default;
+
+  void EnableUploadScanning() {
+    SetDMTokenForTesting(policy::DMToken::CreateValidTokenForTesting(kDmToken));
+
+    SetDlpPolicy(CHECK_UPLOADS);
+    SetMalwarePolicy(SEND_UPLOADS);
+    SetWaitPolicy(DELAY_UPLOADS);
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(DeepScanningDialogDelegateBrowserTest, Unauthorized) {
+  EnableUploadScanning();
+
+  DeepScanningDialogDelegate::SetFactoryForTesting(
+      base::BindRepeating(&MinimalFakeDeepScanningDialogDelegate::Create));
+
+  FakeBinaryUploadServiceStorage()->SetAuthorized(false);
+
+  bool called = false;
+  base::RunLoop run_loop;
+  base::RepeatingClosure quit_closure = run_loop.QuitClosure();
+
+  DeepScanningDialogDelegate::Data data;
+  data.do_dlp_scan = true;
+  data.do_malware_scan = true;
+  data.text.emplace_back(base::UTF8ToUTF16("foo"));
+  data.paths.emplace_back(FILE_PATH_LITERAL("/tmp/foo.doc"));
+
+  DeepScanningDialogDelegate::ShowForWebContents(
+      browser()->tab_strip_model()->GetActiveWebContents(), std::move(data),
+      base::BindLambdaForTesting(
+          [&quit_closure, &called](
+              const DeepScanningDialogDelegate::Data& data,
+              const DeepScanningDialogDelegate::Result& result) {
+            ASSERT_EQ(result.text_results.size(), 1u);
+            ASSERT_EQ(result.paths_results.size(), 1u);
+            ASSERT_TRUE(result.text_results[0]);
+            ASSERT_TRUE(result.paths_results[0]);
+            called = true;
+            quit_closure.Run();
+          }),
+      DeepScanAccessPoint::UPLOAD);
+
+  FakeBinaryUploadServiceStorage()->ReturnAuthorizedResponse();
+
+  run_loop.Run();
+  EXPECT_TRUE(called);
+
+  // Only 1 request (the authentication one) should have been uploaded.
+  ASSERT_EQ(FakeBinaryUploadServiceStorage()->requests_count(), 1);
+}
+
+IN_PROC_BROWSER_TEST_F(DeepScanningDialogDelegateBrowserTest, Files) {
+  base::ScopedAllowBlockingForTesting allow_blocking;
+
+  // Create the files to be opened and scanned.
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  base::FilePath ok_path = temp_dir.GetPath().AppendASCII("ok.doc");
+  base::FilePath bad_path = temp_dir.GetPath().AppendASCII("bad.exe");
+
+  base::File ok_file(ok_path, base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+  base::File bad_file(bad_path,
+                      base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+
+  std::string ok_content = "ok file content";
+  std::string bad_content = "bad file content";
+
+  ok_file.WriteAtCurrentPos(ok_content.data(), ok_content.size());
+  bad_file.WriteAtCurrentPos(bad_content.data(), bad_content.size());
+
+  // Set up delegate and upload service.
+  EnableUploadScanning();
+
+  DeepScanningDialogDelegate::SetFactoryForTesting(
+      base::BindRepeating(&MinimalFakeDeepScanningDialogDelegate::Create));
+
+  DeepScanningClientResponse ok_response;
+  ok_response.mutable_dlp_scan_verdict()->set_status(
+      DlpDeepScanningVerdict::SUCCESS);
+  ok_response.mutable_malware_scan_verdict()->set_verdict(
+      MalwareDeepScanningVerdict::CLEAN);
+
+  DeepScanningClientResponse bad_response;
+  bad_response.mutable_dlp_scan_verdict()->set_status(
+      DlpDeepScanningVerdict::SUCCESS);
+  bad_response.mutable_malware_scan_verdict()->set_verdict(
+      MalwareDeepScanningVerdict::MALWARE);
+
+  FakeBinaryUploadServiceStorage()->SetAuthorized(true);
+  FakeBinaryUploadServiceStorage()->SetResponseForFile(
+      "ok.doc", BinaryUploadService::Result::SUCCESS, ok_response);
+  FakeBinaryUploadServiceStorage()->SetResponseForFile(
+      "bad.exe", BinaryUploadService::Result::SUCCESS, bad_response);
+
+  bool called = false;
+  base::RunLoop run_loop;
+  base::RepeatingClosure quit_closure = run_loop.QuitClosure();
+
+  DeepScanningDialogDelegate::Data data;
+  data.do_dlp_scan = true;
+  data.do_malware_scan = true;
+  data.paths.emplace_back(ok_path);
+  data.paths.emplace_back(bad_path);
+
+  // Start test.
+  DeepScanningDialogDelegate::ShowForWebContents(
+      browser()->tab_strip_model()->GetActiveWebContents(), std::move(data),
+      base::BindLambdaForTesting(
+          [&quit_closure, &called](
+              const DeepScanningDialogDelegate::Data& data,
+              const DeepScanningDialogDelegate::Result& result) {
+            ASSERT_TRUE(result.text_results.empty());
+            ASSERT_EQ(result.paths_results.size(), 2u);
+            ASSERT_TRUE(result.paths_results[0]);
+            ASSERT_FALSE(result.paths_results[1]);
+            called = true;
+            quit_closure.Run();
+          }),
+      DeepScanAccessPoint::UPLOAD);
+
+  FakeBinaryUploadServiceStorage()->ReturnAuthorizedResponse();
+
+  run_loop.Run();
+  EXPECT_TRUE(called);
+
+  // There should have been 1 request per file and 1 for authentication.
+  ASSERT_EQ(FakeBinaryUploadServiceStorage()->requests_count(), 3);
+}
+
+IN_PROC_BROWSER_TEST_F(DeepScanningDialogDelegateBrowserTest, Texts) {
+  // Set up delegate and upload service.
+  EnableUploadScanning();
+
+  DeepScanningDialogDelegate::SetFactoryForTesting(
+      base::BindRepeating(&MinimalFakeDeepScanningDialogDelegate::Create));
+
+  FakeBinaryUploadServiceStorage()->SetAuthorized(true);
+  DeepScanningClientResponse response =
+      SimpleDeepScanningClientResponseForTesting(/*dlp=*/false,
+                                                 /*malware=*/base::nullopt);
+  FakeBinaryUploadServiceStorage()->SetResponseForText(
+      BinaryUploadService::Result::SUCCESS, response);
+
+  bool called = false;
+  base::RunLoop run_loop;
+  base::RepeatingClosure quit_closure = run_loop.QuitClosure();
+
+  DeepScanningDialogDelegate::Data data;
+  data.do_dlp_scan = true;
+  data.do_malware_scan = true;
+  data.text.emplace_back(base::UTF8ToUTF16("text1"));
+  data.text.emplace_back(base::UTF8ToUTF16("text2"));
+
+  // Start test.
+  DeepScanningDialogDelegate::ShowForWebContents(
+      browser()->tab_strip_model()->GetActiveWebContents(), std::move(data),
+      base::BindLambdaForTesting(
+          [&quit_closure, &called](
+              const DeepScanningDialogDelegate::Data& data,
+              const DeepScanningDialogDelegate::Result& result) {
+            ASSERT_TRUE(result.paths_results.empty());
+            ASSERT_EQ(result.text_results.size(), 2u);
+            ASSERT_FALSE(result.text_results[0]);
+            ASSERT_FALSE(result.text_results[1]);
+            called = true;
+            quit_closure.Run();
+          }),
+      DeepScanAccessPoint::UPLOAD);
+
+  FakeBinaryUploadServiceStorage()->ReturnAuthorizedResponse();
+
+  run_loop.Run();
+  EXPECT_TRUE(called);
+
+  // There should have been 1 request for all texts and 1 for authentication.
+  ASSERT_EQ(FakeBinaryUploadServiceStorage()->requests_count(), 2);
+}
+
+}  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc
index 427e580f..3739824 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc
@@ -176,7 +176,8 @@
     content::WebContents* web_contents,
     DeepScanAccessPoint access_point,
     bool is_file_scan)
-    : delegate_(std::move(delegate)),
+    : content::WebContentsObserver(web_contents),
+      delegate_(std::move(delegate)),
       web_contents_(web_contents),
       access_point_(std::move(access_point)),
       is_file_scan_(is_file_scan) {
@@ -229,6 +230,10 @@
   return ui::MODAL_TYPE_CHILD;
 }
 
+void DeepScanningDialogViews::WebContentsDestroyed() {
+  delete this;
+}
+
 void DeepScanningDialogViews::ShowResult(
     DeepScanningDialogDelegate::DeepScanningFinalResult result) {
   DCHECK(is_pending());
@@ -285,6 +290,7 @@
   image_->Update();
   side_icon_image_->Update();
   side_icon_spinner_->Update();
+  side_icon_spinner_ = nullptr;
 
   // Update the buttons.
   SetupButtons();
@@ -683,4 +689,16 @@
   observer_for_testing = observer;
 }
 
+views::ImageView* DeepScanningDialogViews::GetTopImageForTesting() const {
+  return image_;
+}
+
+views::Throbber* DeepScanningDialogViews::GetSideIconSpinnerForTesting() const {
+  return side_icon_spinner_;
+}
+
+views::Label* DeepScanningDialogViews::GetMessageForTesting() const {
+  return message_;
+}
+
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.h b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.h
index acb865a..11a6137 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.h
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.h
@@ -11,6 +11,7 @@
 #include "base/time/time.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h"
+#include "content/public/browser/web_contents_observer.h"
 #include "ui/views/animation/bounds_animator.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/window/dialog_delegate.h"
@@ -24,6 +25,9 @@
 }  // namespace gfx
 
 namespace views {
+class ImageView;
+class Label;
+class Throbber;
 class Widget;
 }  // namespace views
 
@@ -35,7 +39,8 @@
 
 // Dialog shown for Deep Scanning to offer the possibility of cancelling the
 // upload to the user.
-class DeepScanningDialogViews : public views::DialogDelegate {
+class DeepScanningDialogViews : public views::DialogDelegate,
+                                public content::WebContentsObserver {
  public:
   // Enum used to represent what the dialog is currently showing.
   enum class DeepScanningDialogStatus {
@@ -116,6 +121,9 @@
   void DeleteDelegate() override;
   ui::ModalType GetModalType() const override;
 
+  // content::WebContentsObserver:
+  void WebContentsDestroyed() override;
+
   // Updates the dialog with the result, and simply delete it from memory if
   // nothing should be shown.
   void ShowResult(DeepScanningDialogDelegate::DeepScanningFinalResult result);
@@ -149,6 +157,11 @@
   // Returns the appropriate top image depending on |dialog_status_|.
   const gfx::ImageSkia* GetTopImage() const;
 
+  // Accessors used to validate the views in tests.
+  views::ImageView* GetTopImageForTesting() const;
+  views::Throbber* GetSideIconSpinnerForTesting() const;
+  views::Label* GetMessageForTesting() const;
+
  private:
   ~DeepScanningDialogViews() override;
 
@@ -203,10 +216,10 @@
 
   // Views above the buttons. |contents_view_| owns every other view.
   std::unique_ptr<views::View> contents_view_;
-  DeepScanningTopImageView* image_;
-  DeepScanningSideIconImageView* side_icon_image_;
-  DeepScanningSideIconSpinnerView* side_icon_spinner_;
-  DeepScanningMessageView* message_;
+  DeepScanningTopImageView* image_ = nullptr;
+  DeepScanningSideIconImageView* side_icon_image_ = nullptr;
+  DeepScanningSideIconSpinnerView* side_icon_spinner_ = nullptr;
+  DeepScanningMessageView* message_ = nullptr;
 
   bool shown_ = false;
 
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views_browsertest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views_browsertest.cc
index 31888915..4ac22ae 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views_browsertest.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views_browsertest.cc
@@ -2,12 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/test/bind_test_util.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "build/build_config.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/fake_deep_scanning_dialog_delegate.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/grit/theme_resources.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/views/controls/image_view.h"
+#include "ui/views/controls/throbber.h"
 
 namespace safe_browsing {
 
@@ -283,6 +290,143 @@
   bool warning_shown_immediately_ = false;
 };
 
+// Tests the behavior of the dialog in the following ways:
+// - It shows the appropriate message depending on its access point and scan
+//   type (file or text).
+// - It shows the appropriate top image depending on its access point and scan
+//   type.
+// - It shows the appropriate spinner depending on its state.
+class DeepScanningDialogViewsAppearanceBrowserTest
+    : public DeepScanningBrowserTestBase,
+      public DeepScanningDialogViews::TestObserver,
+      public testing::WithParamInterface<
+          std::tuple<bool, bool, DeepScanAccessPoint>> {
+ public:
+  DeepScanningDialogViewsAppearanceBrowserTest() {
+    DeepScanningDialogViews::SetObserverForTesting(this);
+  }
+
+  void ViewsFirstShown(DeepScanningDialogViews* views,
+                       base::TimeTicks timestamp) override {
+    // The dialog initially shows the pending message for the appropriate access
+    // point and scan type.
+    base::string16 pending_message = views->GetMessageForTesting()->GetText();
+    int expected_message_id = 0;
+    switch (access_point()) {
+      case DeepScanAccessPoint::UPLOAD:
+        expected_message_id = IDS_DEEP_SCANNING_DIALOG_UPLOAD_PENDING_MESSAGE;
+        break;
+      case DeepScanAccessPoint::DRAG_AND_DROP:
+        expected_message_id =
+            file_scan() ? IDS_DEEP_SCANNING_DIALOG_DRAG_FILES_PENDING_MESSAGE
+                        : IDS_DEEP_SCANNING_DIALOG_DRAG_DATA_PENDING_MESSAGE;
+        break;
+      case DeepScanAccessPoint::PASTE:
+        expected_message_id = IDS_DEEP_SCANNING_DIALOG_PASTE_PENDING_MESSAGE;
+        break;
+      case DeepScanAccessPoint::DOWNLOAD:
+        NOTREACHED();
+    }
+    ASSERT_EQ(pending_message, l10n_util::GetStringUTF16(expected_message_id));
+
+    // The top image is the pending one corresponding to the access point.
+    const gfx::ImageSkia& actual_image =
+        views->GetTopImageForTesting()->GetImage();
+    int expected_image_id = 0;
+    switch (access_point()) {
+      case DeepScanAccessPoint::DRAG_AND_DROP:
+        expected_image_id =
+            file_scan() ? IDR_UPLOAD_SCANNING : IDR_PASTE_SCANNING;
+        break;
+      case DeepScanAccessPoint::UPLOAD:
+        expected_image_id = IDR_UPLOAD_SCANNING;
+        break;
+      case DeepScanAccessPoint::PASTE:
+        expected_image_id = IDR_PASTE_SCANNING;
+        break;
+      case DeepScanAccessPoint::DOWNLOAD:
+        NOTREACHED();
+    }
+    gfx::ImageSkia* expected_image =
+        ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
+            expected_image_id);
+    ASSERT_TRUE(expected_image->BackedBySameObjectAs(actual_image));
+
+    // The spinner should be present.
+    ASSERT_TRUE(views->GetSideIconSpinnerForTesting());
+  }
+
+  void DialogUpdated(
+      DeepScanningDialogViews* views,
+      DeepScanningDialogDelegate::DeepScanningFinalResult result) override {
+    // The dialog shows the failure or success message for the appropriate
+    // access point and scan type.
+    base::string16 final_message = views->GetMessageForTesting()->GetText();
+    int expected_message_id = 0;
+    if (success()) {
+      expected_message_id = IDS_DEEP_SCANNING_DIALOG_SUCCESS_MESSAGE;
+    } else {
+      switch (access_point()) {
+        case DeepScanAccessPoint::UPLOAD:
+          expected_message_id = IDS_DEEP_SCANNING_DIALOG_UPLOAD_FAILURE_MESSAGE;
+          break;
+        case DeepScanAccessPoint::DRAG_AND_DROP:
+          expected_message_id =
+              file_scan() ? IDS_DEEP_SCANNING_DIALOG_DRAG_FILES_FAILURE_MESSAGE
+                          : IDS_DEEP_SCANNING_DIALOG_DRAG_DATA_FAILURE_MESSAGE;
+          break;
+        case DeepScanAccessPoint::PASTE:
+          expected_message_id = IDS_DEEP_SCANNING_DIALOG_PASTE_FAILURE_MESSAGE;
+          break;
+        case DeepScanAccessPoint::DOWNLOAD:
+          NOTREACHED();
+      }
+    }
+    ASSERT_EQ(final_message, l10n_util::GetStringUTF16(expected_message_id));
+
+    // The top image is the failure/success one corresponding to the access
+    // point and scan type.
+    const gfx::ImageSkia& actual_image =
+        views->GetTopImageForTesting()->GetImage();
+    int expected_image_id = 0;
+    switch (access_point()) {
+      case DeepScanAccessPoint::DRAG_AND_DROP:
+        expected_image_id =
+            file_scan() ? success() ? IDR_UPLOAD_SUCCESS : IDR_UPLOAD_VIOLATION
+                        : success() ? IDR_PASTE_SUCCESS : IDR_PASTE_VIOLATION;
+        break;
+      case DeepScanAccessPoint::UPLOAD:
+        expected_image_id =
+            success() ? IDR_UPLOAD_SUCCESS : IDR_UPLOAD_VIOLATION;
+        break;
+      case DeepScanAccessPoint::PASTE:
+        expected_image_id = success() ? IDR_PASTE_SUCCESS : IDR_PASTE_VIOLATION;
+        break;
+      case DeepScanAccessPoint::DOWNLOAD:
+        NOTREACHED();
+    }
+    gfx::ImageSkia* expected_image =
+        ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
+            expected_image_id);
+    ASSERT_TRUE(expected_image->BackedBySameObjectAs(actual_image));
+
+    // The spinner should not be present in the final result since nothing is
+    // pending.
+    ASSERT_FALSE(views->GetSideIconSpinnerForTesting());
+  }
+
+  void DestructorCalled(DeepScanningDialogViews* views) override {
+    // End the test once the dialog gets destroyed.
+    CallQuitClosure();
+  }
+
+  bool file_scan() const { return std::get<0>(GetParam()); }
+
+  bool success() const { return std::get<1>(GetParam()); }
+
+  DeepScanAccessPoint access_point() const { return std::get<2>(GetParam()); }
+};
+
 }  // namespace
 
 IN_PROC_BROWSER_TEST_P(DeepScanningDialogViewsBehaviorBrowserTest, Test) {
@@ -466,4 +610,59 @@
     DeepScanningDialogViewsWarningBrowserTest,
     testing::Combine(testing::Values(kNoDelay, kSmallDelay), testing::Bool()));
 
+IN_PROC_BROWSER_TEST_P(DeepScanningDialogViewsAppearanceBrowserTest, Test) {
+  // Setup policies to enable deep scanning, its UI and the responses to be
+  // simulated.
+  SetDlpPolicy(CHECK_UPLOADS);
+  SetMalwarePolicy(SEND_UPLOADS);
+
+  SetStatusCallbackResponse(
+      SimpleDeepScanningClientResponseForTesting(success(), success()));
+
+  // Always set this policy so the UI is shown.
+  SetWaitPolicy(DELAY_UPLOADS);
+
+  // Set up delegate test values.
+  FakeDeepScanningDialogDelegate::SetResponseDelay(kSmallDelay);
+  SetUpDelegate();
+
+  bool called = false;
+  base::RunLoop run_loop;
+  SetQuitClosure(run_loop.QuitClosure());
+
+  DeepScanningDialogDelegate::Data data;
+  data.do_dlp_scan = true;
+  data.do_malware_scan = true;
+
+  // Use a file path or text to validate the appearance of the dialog for both
+  // types of scans.
+  if (file_scan())
+    data.paths.emplace_back(FILE_PATH_LITERAL("/tmp/foo.doc"));
+  else
+    data.text.emplace_back(base::UTF8ToUTF16("foo"));
+
+  DeepScanningDialogDelegate::ShowForWebContents(
+      browser()->tab_strip_model()->GetActiveWebContents(), std::move(data),
+      base::BindLambdaForTesting(
+          [this, &called](const DeepScanningDialogDelegate::Data& data,
+                          const DeepScanningDialogDelegate::Result& result) {
+            for (bool result : result.paths_results)
+              ASSERT_EQ(result, success());
+            called = true;
+          }),
+      access_point());
+  run_loop.Run();
+  EXPECT_TRUE(called);
+}
+
+INSTANTIATE_TEST_SUITE_P(DeepScanningDialogViewsAppearanceBrowserTest,
+                         DeepScanningDialogViewsAppearanceBrowserTest,
+                         testing::Combine(
+                             /*file_scan=*/testing::Bool(),
+                             /*success=*/testing::Bool(),
+                             /*access_point=*/
+                             testing::Values(DeepScanAccessPoint::UPLOAD,
+                                             DeepScanAccessPoint::DRAG_AND_DROP,
+                                             DeepScanAccessPoint::PASTE)));
+
 }  // namespace safe_browsing
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc
index 32de2b06..4d7b8ad 100644
--- a/chrome/browser/sync/chrome_sync_client.cc
+++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -576,15 +576,6 @@
                  : nullptr;
     }
 #endif  // BUILDFLAG(ENABLE_SPELLCHECK)
-    case syncer::FAVICON_IMAGES:
-    case syncer::FAVICON_TRACKING:
-      if (!base::FeatureList::IsEnabled(switches::kDoNotSyncFaviconDataTypes)) {
-        return GetWeakPtrOrNull(
-            SessionSyncServiceFactory::GetForProfile(profile_)
-                ->GetFaviconCache());
-      }
-      NOTREACHED();
-      return nullptr;
 #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
     case syncer::SUPERVISED_USER_SETTINGS:
       return SupervisedUserSettingsServiceFactory::GetForKey(
@@ -610,9 +601,6 @@
           ->AsWeakPtr();
 #endif  // defined(OS_CHROMEOS)
     default:
-      // The following datatypes still need to be transitioned to the
-      // syncer::SyncableService API:
-      // Bookmarks
       NOTREACHED();
       return nullptr;
   }
diff --git a/chrome/browser/sync/profile_sync_service_factory_unittest.cc b/chrome/browser/sync/profile_sync_service_factory_unittest.cc
index cdd8f321..7b5d5e7 100644
--- a/chrome/browser/sync/profile_sync_service_factory_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_factory_unittest.cc
@@ -111,10 +111,6 @@
     datatypes.push_back(syncer::AUTOFILL_WALLET_METADATA);
     datatypes.push_back(syncer::BOOKMARKS);
     datatypes.push_back(syncer::DEVICE_INFO);
-    if (!base::FeatureList::IsEnabled(switches::kDoNotSyncFaviconDataTypes)) {
-      datatypes.push_back(syncer::FAVICON_TRACKING);
-      datatypes.push_back(syncer::FAVICON_IMAGES);
-    }
     datatypes.push_back(syncer::HISTORY_DELETE_DIRECTIVES);
     if (!base::FeatureList::IsEnabled(switches::kSyncUSSPasswords)) {
       // Password store factory is null for testing. For directory
diff --git a/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillIntegrationTest.java b/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillIntegrationTest.java
index 6ed44382..d2a415b 100644
--- a/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillIntegrationTest.java
+++ b/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillIntegrationTest.java
@@ -36,7 +36,7 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.ScalableTimeout;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.touch_to_fill.data.Credential;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContent;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
diff --git a/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java b/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java
index add1d004..3f05de9 100644
--- a/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java
+++ b/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java
@@ -43,7 +43,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.ScalableTimeout;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.FooterProperties;
 import org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties;
 import org.chromium.chrome.browser.touch_to_fill.data.Credential;
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTest.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTest.java
index 36ace3b6..49e64ce 100644
--- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTest.java
+++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTest.java
@@ -25,7 +25,7 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisableIf;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.LifecycleObserver;
 import org.chromium.chrome.browser.ui.appmenu.test.R;
diff --git a/chrome/browser/ui/blocked_content/popup_blocker.h b/chrome/browser/ui/blocked_content/popup_blocker.h
index cbebb84e..2b3a09d 100644
--- a/chrome/browser/ui/blocked_content/popup_blocker.h
+++ b/chrome/browser/ui/blocked_content/popup_blocker.h
@@ -5,7 +5,7 @@
 #ifndef CHROME_BROWSER_UI_BLOCKED_CONTENT_POPUP_BLOCKER_H_
 #define CHROME_BROWSER_UI_BLOCKED_CONTENT_POPUP_BLOCKER_H_
 
-#include "third_party/blink/public/mojom/window_features/window_features.mojom.h"
+#include "third_party/blink/public/mojom/window_features/window_features.mojom-forward.h"
 #include "ui/base/window_open_disposition.h"
 #include "url/gurl.h"
 
diff --git a/chrome/browser/ui/blocked_content/popup_tracker.cc b/chrome/browser/ui/blocked_content/popup_tracker.cc
index 2b98f853..bd930481 100644
--- a/chrome/browser/ui/blocked_content/popup_tracker.cc
+++ b/chrome/browser/ui/blocked_content/popup_tracker.cc
@@ -33,12 +33,20 @@
 PopupTracker::PopupTracker(content::WebContents* contents,
                            content::WebContents* opener)
     : content::WebContentsObserver(contents),
+      scoped_observer_(this),
       visibility_tracker_(
           base::DefaultTickClock::GetInstance(),
           contents->GetVisibility() != content::Visibility::HIDDEN),
       opener_source_id_(ukm::GetSourceIdForWebContentsDocument(opener)) {
   if (auto* popup_opener = PopupOpenerTabHelper::FromWebContents(opener))
     popup_opener->OnOpenedPopup(this);
+
+  auto* observer_manager =
+      subresource_filter::SubresourceFilterObserverManager::FromWebContents(
+          contents);
+  if (observer_manager) {
+    scoped_observer_.Add(observer_manager);
+  }
 }
 
 void PopupTracker::WebContentsDestroyed() {
@@ -74,6 +82,7 @@
         .SetUserInitiatedClose(web_contents()->GetClosedByUserGesture())
         .SetTrusted(is_trusted_)
         .SetNumInteractions(capped_interactions)
+        .SetSafeBrowsingStatus(static_cast<int>(safe_browsing_status_))
         .Record(ukm::UkmRecorder::Get());
   }
 }
@@ -110,4 +119,29 @@
   num_interactions_++;
 }
 
+// This method will always be called before the DidFinishNavigation associated
+// with this handle.
+// The exception is a navigation restoring a page from back-forward cache --
+// in that case don't issue any requests, therefore we don't get any
+// safe browsing callbacks. See the comment above for the mitigation.
+void PopupTracker::OnSafeBrowsingChecksComplete(
+    content::NavigationHandle* navigation_handle,
+    const SafeBrowsingCheckResults& results) {
+  DCHECK(navigation_handle->IsInMainFrame());
+  safe_browsing_status_ = PopupSafeBrowsingStatus::kSafe;
+  for (const auto& result : results) {
+    if (result.threat_type ==
+            safe_browsing::SBThreatType::SB_THREAT_TYPE_URL_PHISHING ||
+        result.threat_type == safe_browsing::SBThreatType::
+                                  SB_THREAT_TYPE_URL_CLIENT_SIDE_PHISHING ||
+        result.threat_type ==
+            safe_browsing::SBThreatType::SB_THREAT_TYPE_SUBRESOURCE_FILTER)
+      safe_browsing_status_ = PopupSafeBrowsingStatus::kUnsafe;
+  }
+}
+
+void PopupTracker::OnSubresourceFilterGoingAway() {
+  scoped_observer_.RemoveAll();
+}
+
 WEB_CONTENTS_USER_DATA_KEY_IMPL(PopupTracker)
diff --git a/chrome/browser/ui/blocked_content/popup_tracker.h b/chrome/browser/ui/blocked_content/popup_tracker.h
index 05ef9b6..e693471 100644
--- a/chrome/browser/ui/blocked_content/popup_tracker.h
+++ b/chrome/browser/ui/blocked_content/popup_tracker.h
@@ -7,7 +7,10 @@
 
 #include "base/macros.h"
 #include "base/optional.h"
+#include "base/scoped_observer.h"
 #include "base/time/time.h"
+#include "components/subresource_filter/content/browser/subresource_filter_observer.h"
+#include "components/subresource_filter/content/browser/subresource_filter_observer_manager.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
@@ -17,14 +20,23 @@
 class WebContents;
 }
 
-
 // This class tracks new popups, and is used to log metrics on the visibility
 // time of the first document in the popup.
 // TODO(csharrison): Consider adding more metrics like total visibility for the
 // lifetime of the WebContents.
 class PopupTracker : public content::WebContentsObserver,
-                     public content::WebContentsUserData<PopupTracker> {
+                     public content::WebContentsUserData<PopupTracker>,
+                     public subresource_filter::SubresourceFilterObserver {
  public:
+  // These values are persisted to logs. Entries should not be renumbered and
+  // numeric values should never be reused.
+  enum class PopupSafeBrowsingStatus {
+    kNoValue = 0,
+    kSafe = 1,
+    kUnsafe = 2,
+    kMaxValue = kUnsafe,
+  };
+
   static PopupTracker* CreateForWebContents(content::WebContents* contents,
                                             content::WebContents* opener);
   ~PopupTracker() override;
@@ -43,6 +55,16 @@
   void OnVisibilityChanged(content::Visibility visibility) override;
   void DidGetUserInteraction(const blink::WebInputEvent::Type type) override;
 
+  // subresource_filter::SubresourceFilterObserver:
+  void OnSafeBrowsingChecksComplete(
+      content::NavigationHandle* navigation_handle,
+      const SafeBrowsingCheckResults& results) override;
+  void OnSubresourceFilterGoingAway() override;
+
+  ScopedObserver<subresource_filter::SubresourceFilterObserverManager,
+                 subresource_filter::SubresourceFilterObserver>
+      scoped_observer_;
+
   // Will be unset until the first navigation commits. Will be set to the total
   // time the contents was visible at commit time.
   base::Optional<base::TimeDelta> first_load_visible_time_start_;
@@ -62,6 +84,11 @@
 
   bool is_trusted_ = false;
 
+  // Whether the pop-up navigated to a site on the safe browsing list. Set when
+  // the safe browsing checks complete.
+  PopupSafeBrowsingStatus safe_browsing_status_ =
+      PopupSafeBrowsingStatus::kNoValue;
+
   WEB_CONTENTS_USER_DATA_KEY_DECL();
 
   DISALLOW_COPY_AND_ASSIGN(PopupTracker);
diff --git a/chrome/browser/ui/blocked_content/popup_tracker_browsertest.cc b/chrome/browser/ui/blocked_content/popup_tracker_browsertest.cc
index b21ef2e..a374cd5 100644
--- a/chrome/browser/ui/blocked_content/popup_tracker_browsertest.cc
+++ b/chrome/browser/ui/blocked_content/popup_tracker_browsertest.cc
@@ -7,23 +7,29 @@
 #include <memory>
 #include <string>
 
+#include "base/path_service.h"
 #include "base/supports_user_data.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "build/build_config.h"
 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/safe_browsing/test_safe_browsing_database_helper.h"
 #include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/safe_browsing/core/db/v4_embedded_test_server_util.h"
+#include "components/safe_browsing/core/db/v4_test_util.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "content/public/test/test_utils.h"
+#include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -43,6 +49,7 @@
 const char kUkmUserInitiatedClose[] = "UserInitiatedClose";
 const char kUkmTrusted[] = "Trusted";
 const char kUkmNumInteractions[] = "NumInteractions";
+const char kUkmSafeBrowsingStatus[] = "SafeBrowsingStatus";
 }  // namespace
 
 using UkmEntry = ukm::builders::Popup_Closed;
@@ -300,3 +307,172 @@
   EXPECT_FALSE(PopupTracker::FromWebContents(new_contents));
   EXPECT_EQ(0u, GetNumPopupUkmEntries());
 }
+
+// Tests for the subresource_filter popup blocker.
+class SafeBrowsingPopupTrackerBrowserTest : public PopupTrackerBrowserTest {
+ public:
+  SafeBrowsingPopupTrackerBrowserTest() = default;
+  ~SafeBrowsingPopupTrackerBrowserTest() override = default;
+
+  void SetUp() override {
+    database_helper_ = CreateTestDatabase();
+    PopupTrackerBrowserTest::SetUp();
+  }
+
+  void SetUpOnMainThread() override {
+    base::FilePath test_data_dir;
+    base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
+    embedded_test_server()->ServeFilesFromDirectory(test_data_dir);
+    host_resolver()->AddRule("*", "127.0.0.1");
+    content::SetupCrossSiteRedirector(embedded_test_server());
+
+    ASSERT_TRUE(embedded_test_server()->Start());
+  }
+
+  void TearDown() override {
+    InProcessBrowserTest::TearDown();
+    database_helper_.reset();
+  }
+
+  virtual std::unique_ptr<TestSafeBrowsingDatabaseHelper> CreateTestDatabase() {
+    std::vector<safe_browsing::ListIdentifier> list_ids = {
+        safe_browsing::GetUrlSubresourceFilterId()};
+    return std::make_unique<TestSafeBrowsingDatabaseHelper>(
+        std::make_unique<safe_browsing::TestV4GetHashProtocolManagerFactory>(),
+        std::move(list_ids));
+  }
+
+  void ConfigureAsList(const GURL& url,
+                       const safe_browsing::ListIdentifier& list_identifier) {
+    safe_browsing::ThreatMetadata metadata;
+    database_helper_->AddFullHashToDbAndFullHashCache(url, list_identifier,
+                                                      metadata);
+  }
+
+  TestSafeBrowsingDatabaseHelper* database_helper() {
+    return database_helper_.get();
+  }
+
+ private:
+  std::unique_ptr<TestSafeBrowsingDatabaseHelper> database_helper_;
+
+  DISALLOW_COPY_AND_ASSIGN(SafeBrowsingPopupTrackerBrowserTest);
+};
+
+// Pop-ups closed before navigation has finished will receive no safe browsing
+// status.
+IN_PROC_BROWSER_TEST_F(SafeBrowsingPopupTrackerBrowserTest,
+                       PopupClosedBeforeNavigationFinished_LoggedAsNoValue) {
+  const GURL first_url = embedded_test_server()->GetURL("/title1.html");
+  ui_test_utils::NavigateToURL(browser(), first_url);
+
+  const GURL unsafe_url = embedded_test_server()->GetURL("/slow");
+  ConfigureAsList(unsafe_url, safe_browsing::GetUrlSocEngId());
+
+  content::TestNavigationObserver navigation_observer(nullptr, 1);
+  navigation_observer.StartWatchingNewWebContents();
+
+  EXPECT_TRUE(
+      content::ExecJs(browser()->tab_strip_model()->GetActiveWebContents(),
+                      "window.open('/slow?1000')"));
+
+  EXPECT_EQ(2, browser()->tab_strip_model()->count());
+  content::WebContents* popup =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  EXPECT_TRUE(PopupTracker::FromWebContents(popup));
+
+  // Close the popup and check metric.
+  int active_index = browser()->tab_strip_model()->active_index();
+  content::WebContentsDestroyedWatcher destroyed_watcher(popup);
+  browser()->tab_strip_model()->CloseWebContentsAt(
+      active_index, TabStripModel::CLOSE_USER_GESTURE);
+  destroyed_watcher.Wait();
+
+  auto* entry = ExpectAndGetEntry(first_url);
+  test_ukm_recorder_->ExpectEntryMetric(
+      entry, kUkmSafeBrowsingStatus,
+      static_cast<int>(PopupTracker::PopupSafeBrowsingStatus::kNoValue));
+}
+
+IN_PROC_BROWSER_TEST_F(SafeBrowsingPopupTrackerBrowserTest,
+                       SafePopup_LoggedAsSafe) {
+  const GURL first_url = embedded_test_server()->GetURL("/title1.html");
+  ui_test_utils::NavigateToURL(browser(), first_url);
+
+  content::TestNavigationObserver navigation_observer(nullptr, 1);
+  navigation_observer.StartWatchingNewWebContents();
+
+  const GURL second_url = embedded_test_server()->GetURL("/title2.html");
+  EXPECT_TRUE(
+      content::ExecJs(browser()->tab_strip_model()->GetActiveWebContents(),
+                      "window.open('/title2.html')"));
+  navigation_observer.Wait();
+
+  EXPECT_EQ(2, browser()->tab_strip_model()->count());
+  content::WebContents* popup =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  EXPECT_TRUE(PopupTracker::FromWebContents(popup));
+
+  // Close the popup and check metric.
+  int active_index = browser()->tab_strip_model()->active_index();
+  content::WebContentsDestroyedWatcher destroyed_watcher(popup);
+  browser()->tab_strip_model()->CloseWebContentsAt(
+      active_index, TabStripModel::CLOSE_USER_GESTURE);
+  destroyed_watcher.Wait();
+
+  auto* entry = ExpectAndGetEntry(first_url);
+  test_ukm_recorder_->ExpectEntryMetric(
+      entry, kUkmSafeBrowsingStatus,
+      static_cast<int>(PopupTracker::PopupSafeBrowsingStatus::kSafe));
+}
+
+IN_PROC_BROWSER_TEST_F(SafeBrowsingPopupTrackerBrowserTest,
+                       PhishingPopup_LoggedAsUnsafe) {
+  const GURL first_url = embedded_test_server()->GetURL("/title1.html");
+  ui_test_utils::NavigateToURL(browser(), first_url);
+
+  // Associate each domain with a separate safe browsing ListIdentifier to
+  // exercise the set of lists.
+  std::vector<std::pair<std::string, safe_browsing::ListIdentifier>>
+      domain_list_pairs = {
+          {"a.com", safe_browsing::GetUrlSocEngId()},
+          {"b.com", safe_browsing::GetUrlSubresourceFilterId()}};
+
+  // For each pair, configure the local safe browsing database and open a
+  // pop-up to the url.
+  for (const auto& domain_list_pair : domain_list_pairs) {
+    const GURL unsafe_url =
+        embedded_test_server()->GetURL(domain_list_pair.first, "/title2.html");
+    ConfigureAsList(unsafe_url, domain_list_pair.second);
+
+    content::TestNavigationObserver navigation_observer(nullptr, 1);
+    navigation_observer.StartWatchingNewWebContents();
+
+    EXPECT_TRUE(
+        content::ExecJs(browser()->tab_strip_model()->GetActiveWebContents(),
+                        "window.open('" + unsafe_url.spec() + "')"));
+    navigation_observer.Wait();
+
+    EXPECT_EQ(2, browser()->tab_strip_model()->count());
+    content::WebContents* popup =
+        browser()->tab_strip_model()->GetActiveWebContents();
+    EXPECT_TRUE(PopupTracker::FromWebContents(popup));
+
+    // Close the popup and check metric.
+    int active_index = browser()->tab_strip_model()->active_index();
+    content::WebContentsDestroyedWatcher destroyed_watcher(popup);
+    browser()->tab_strip_model()->CloseWebContentsAt(
+        active_index, TabStripModel::CLOSE_USER_GESTURE);
+    destroyed_watcher.Wait();
+  }
+
+  // The URL should have 4 pop-up entries with an unsafe safe browsing status.
+  auto entries = test_ukm_recorder_->GetEntriesByName(
+      ukm::builders::Popup_Closed::kEntryName);
+  EXPECT_EQ(2u, entries.size());
+  for (auto* entry : entries) {
+    test_ukm_recorder_->ExpectEntryMetric(
+        entry, kUkmSafeBrowsingStatus,
+        static_cast<int>(PopupTracker::PopupSafeBrowsingStatus::kUnsafe));
+  }
+}
diff --git a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
index a747e59..53a0e2ec4 100644
--- a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
+++ b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
@@ -14,14 +14,17 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/grit/generated_resources.h"
 #include "extensions/browser/app_window/app_window.h"
 #include "extensions/browser/app_window/native_app_window.h"
+#include "extensions/browser/extension_registry.h"
 #include "extensions/common/extension.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
 using extensions::Extension;
+using extensions::ExtensionRegistry;
 
 namespace {
 
@@ -129,9 +132,17 @@
   // If there is no corresponding AppWindow, this could be a hosted app, so
   // check for a browser.
   if (Browser* browser = chrome::FindBrowserWithWindow(window)) {
+    const std::string app_id =
+        web_app::GetAppIdFromApplicationName(browser->app_name());
     if (profile)
       *profile = browser->profile();
-    return apps::ExtensionAppShimHandler::MaybeGetAppForBrowser(browser);
+    ExtensionRegistry* registry = ExtensionRegistry::Get(browser->profile());
+    const Extension* extension =
+        registry->GetExtensionById(app_id, ExtensionRegistry::ENABLED);
+    if (extension &&
+        (extension->is_platform_app() || extension->is_hosted_app())) {
+      return extension;
+    }
   }
   return nullptr;
 }
diff --git a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm
index d1a5e13..4b98b93 100644
--- a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm
+++ b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm
@@ -208,44 +208,6 @@
   CheckNoAppMenus();
 }
 
-// Test to check that hosted apps have "Find" and "Paste and Match Style" menu
-// items under the "Edit" menu.
-// Disabled until tab versus window apps are properly tested
-// http://crbug.com/517744
-IN_PROC_BROWSER_TEST_F(AppShimMenuControllerBrowserTest,
-                       DISABLED_HostedAppHasAdditionalEditMenuItems) {
-  SetUpApps(HOSTED | PACKAGED_1);
-
-  // Find the first hosted app window.
-  Browser* hosted_app_browser = nullptr;
-  for (Browser* browser : *BrowserList::GetInstance()) {
-    const extensions::Extension* extension =
-        apps::ExtensionAppShimHandler::MaybeGetAppForBrowser(browser);
-    if (extension && extension->is_hosted_app()) {
-      hosted_app_browser = browser;
-      break;
-    }
-  }
-  EXPECT_TRUE(hosted_app_browser);
-
-  // Focus the hosted app.
-  [[NSNotificationCenter defaultCenter]
-      postNotificationName:NSWindowDidBecomeMainNotification
-                    object:hosted_app_browser->window()
-                               ->GetNativeWindow()
-                               .GetNativeNSWindow()];
-  CheckEditMenu(hosted_app_);
-
-  // Now focus a platform app, the Edit menu should not have the additional
-  // options.
-  [[NSNotificationCenter defaultCenter]
-      postNotificationName:NSWindowDidBecomeMainNotification
-                    object:FirstWindowForApp(app_1_)
-                               ->GetNativeWindow()
-                               .GetNativeNSWindow()];
-  CheckEditMenu(app_1_);
-}
-
 // Test that uninstalling an app restores the main menu.
 IN_PROC_BROWSER_TEST_F(AppShimMenuControllerBrowserTest,
                        ExtensionUninstallUpdatesMenuBar) {
diff --git a/chrome/browser/ui/extensions/app_launch_params.h b/chrome/browser/ui/extensions/app_launch_params.h
index 631e330..4d5625c 100644
--- a/chrome/browser/ui/extensions/app_launch_params.h
+++ b/chrome/browser/ui/extensions/app_launch_params.h
@@ -6,7 +6,7 @@
 #define CHROME_BROWSER_UI_EXTENSIONS_APP_LAUNCH_PARAMS_H_
 
 #include "chrome/browser/apps/app_service/app_launch_params.h"
-#include "components/services/app_service/public/mojom/types.mojom.h"
+#include "components/services/app_service/public/mojom/types.mojom-forward.h"
 #include "ui/base/window_open_disposition.h"
 
 class Profile;
diff --git a/chrome/browser/ui/global_media_controls/media_notification_service.h b/chrome/browser/ui/global_media_controls/media_notification_service.h
index a2b85e8..c72036aa 100644
--- a/chrome/browser/ui/global_media_controls/media_notification_service.h
+++ b/chrome/browser/ui/global_media_controls/media_notification_service.h
@@ -24,7 +24,7 @@
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/media_session/public/mojom/audio_focus.mojom.h"
-#include "services/media_session/public/mojom/media_controller.mojom.h"
+#include "services/media_session/public/mojom/media_controller.mojom-forward.h"
 
 namespace content {
 class WebContents;
diff --git a/chrome/browser/ui/intent_picker_tab_helper.h b/chrome/browser/ui/intent_picker_tab_helper.h
index 49bd36b2..36a0fcd 100644
--- a/chrome/browser/ui/intent_picker_tab_helper.h
+++ b/chrome/browser/ui/intent_picker_tab_helper.h
@@ -12,7 +12,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/apps/intent_helper/apps_navigation_types.h"
-#include "chrome/services/app_service/public/mojom/types.mojom.h"
+#include "chrome/services/app_service/public/mojom/types.mojom-forward.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
 
diff --git a/chrome/browser/ui/search/search_tab_helper.h b/chrome/browser/ui/search/search_tab_helper.h
index f9feaddf..0e8d9095 100644
--- a/chrome/browser/ui/search/search_tab_helper.h
+++ b/chrome/browser/ui/search/search_tab_helper.h
@@ -18,7 +18,7 @@
 #include "chrome/browser/search/chrome_colors/chrome_colors_service.h"
 #include "chrome/browser/search/instant_service_observer.h"
 #include "chrome/browser/ui/search/search_ipc_router.h"
-#include "chrome/common/search.mojom.h"
+#include "chrome/common/search.mojom-forward.h"
 #include "chrome/common/search/instant_types.h"
 #include "chrome/common/search/ntp_logging_events.h"
 #include "components/ntp_tiles/ntp_tile_impression.h"
diff --git a/chrome/browser/ui/serial/serial_chooser_controller.h b/chrome/browser/ui/serial/serial_chooser_controller.h
index 876fbf39a..919a19f 100644
--- a/chrome/browser/ui/serial/serial_chooser_controller.h
+++ b/chrome/browser/ui/serial/serial_chooser_controller.h
@@ -13,7 +13,7 @@
 #include "base/strings/string16.h"
 #include "chrome/browser/chooser_controller/chooser_controller.h"
 #include "content/public/browser/serial_chooser.h"
-#include "services/device/public/mojom/serial.mojom.h"
+#include "services/device/public/mojom/serial.mojom-forward.h"
 #include "third_party/blink/public/mojom/serial/serial.mojom.h"
 #include "url/origin.h"
 
diff --git a/chrome/browser/ui/views/apps/app_uninstall_dialog_view.h b/chrome/browser/ui/views/apps/app_uninstall_dialog_view.h
index f2de59c..d1521449 100644
--- a/chrome/browser/ui/views/apps/app_uninstall_dialog_view.h
+++ b/chrome/browser/ui/views/apps/app_uninstall_dialog_view.h
@@ -10,7 +10,7 @@
 #include "base/macros.h"
 #include "chrome/browser/apps/app_service/uninstall_dialog.h"
 #include "chrome/browser/ui/views/apps/app_dialog_view.h"
-#include "chrome/services/app_service/public/mojom/types.mojom.h"
+#include "chrome/services/app_service/public/mojom/types.mojom-forward.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
 
 class Profile;
diff --git a/chrome/browser/ui/views/crostini/crostini_browser_test_util.h b/chrome/browser/ui/views/crostini/crostini_browser_test_util.h
index 14f9825..361e7b9 100644
--- a/chrome/browser/ui/views/crostini/crostini_browser_test_util.h
+++ b/chrome/browser/ui/views/crostini/crostini_browser_test_util.h
@@ -10,7 +10,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
 #include "chrome/test/base/browser_process_platform_part_test_api_chromeos.h"
-#include "services/network/public/mojom/network_change_manager.mojom.h"
+#include "services/network/public/mojom/network_change_manager.mojom-forward.h"
 
 class CrostiniBrowserTestChromeBrowserMainExtraParts;
 
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view.h b/chrome/browser/ui/views/intent_picker_bubble_view.h
index d708284d9..17dfd7ba 100644
--- a/chrome/browser/ui/views/intent_picker_bubble_view.h
+++ b/chrome/browser/ui/views/intent_picker_bubble_view.h
@@ -15,7 +15,7 @@
 #include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/page_action/page_action_icon_type.h"
 #include "chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h"
-#include "chrome/services/app_service/public/mojom/types.mojom.h"
+#include "chrome/services/app_service/public/mojom/types.mojom-forward.h"
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/gfx/image/image.h"
 #include "ui/views/controls/button/button.h"
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_sink_button.cc b/chrome/browser/ui/views/media_router/cast_dialog_sink_button.cc
index fd8a604..3b13515 100644
--- a/chrome/browser/ui/views/media_router/cast_dialog_sink_button.cc
+++ b/chrome/browser/ui/views/media_router/cast_dialog_sink_button.cc
@@ -47,9 +47,8 @@
 
   // views::ImageView:
   void OnThemeChanged() override {
-    const SkColor icon_color =
-        ui::NativeTheme::GetInstanceForNativeUi()->GetSystemColor(
-            ui::NativeTheme::kColorId_DefaultIconColor);
+    const SkColor icon_color = GetNativeTheme()->GetSystemColor(
+        ui::NativeTheme::kColorId_DefaultIconColor);
     SetImage(gfx::CreateVectorIcon(::vector_icons::kInfoOutlineIcon,
                                    kPrimaryIconSize, icon_color));
   }
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc
index 9e4dfe3f..59f7df9f 100644
--- a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc
+++ b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc
@@ -100,9 +100,6 @@
   static constexpr int kExpandedTableRowCount = 3;
 
   explicit CollapsibleListView(ui::TableModel* model) {
-    const SkColor icon_color =
-        ui::NativeTheme::GetInstanceForNativeUi()->GetSystemColor(
-            ui::NativeTheme::kColorId_DefaultIconColor);
     const views::LayoutProvider* provider = ChromeLayoutProvider::Get();
 
     SetLayoutManager(std::make_unique<views::BoxLayout>(
@@ -138,12 +135,8 @@
     label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
     label_layout->SetFlexForView(label, 1);
     auto button = views::CreateVectorToggleImageButton(this);
-    views::SetImageFromVectorIconWithColor(
-        button.get(), kCaretDownIcon, ui::TableModel::kIconSize, icon_color);
     button->SetTooltipText(
         l10n_util::GetStringUTF16(IDS_NATIVE_FILE_SYSTEM_USAGE_EXPAND));
-    views::SetToggledImageFromVectorIconWithColor(
-        button.get(), kCaretUpIcon, ui::TableModel::kIconSize, icon_color);
     button->SetToggledTooltipText(
         l10n_util::GetStringUTF16(IDS_NATIVE_FILE_SYSTEM_USAGE_COLLAPSE));
     expand_collapse_button_ = label_container->AddChildView(std::move(button));
@@ -173,6 +166,18 @@
     table_view_parent_->SetVisible(false);
   }
 
+  // views::View
+  void OnThemeChanged() override {
+    const SkColor icon_color = GetNativeTheme()->GetSystemColor(
+        ui::NativeTheme::kColorId_DefaultIconColor);
+    views::SetImageFromVectorIconWithColor(
+        expand_collapse_button_, kCaretDownIcon, ui::TableModel::kIconSize,
+        icon_color);
+    views::SetToggledImageFromVectorIconWithColor(
+        expand_collapse_button_, kCaretUpIcon, ui::TableModel::kIconSize,
+        icon_color);
+  }
+
   // views::ButtonListener:
   void ButtonPressed(views::Button* sender, const ui::Event& event) override {
     table_is_expanded_ = !table_is_expanded_;
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest_base.h b/chrome/browser/ui/views/payments/payment_request_browsertest_base.h
index d4c6976..f951a32 100644
--- a/chrome/browser/ui/views/payments/payment_request_browsertest_base.h
+++ b/chrome/browser/ui/views/payments/payment_request_browsertest_base.h
@@ -29,7 +29,7 @@
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "testing/gmock/include/gmock/gmock.h"
-#include "third_party/blink/public/mojom/payments/payment_request.mojom.h"
+#include "third_party/blink/public/mojom/payments/payment_request.mojom-forward.h"
 
 namespace autofill {
 class AutofillProfile;
diff --git a/chrome/browser/ui/views/payments/payment_request_views_util.cc b/chrome/browser/ui/views/payments/payment_request_views_util.cc
index d8bf4ae..459f812f 100644
--- a/chrome/browser/ui/views/payments/payment_request_views_util.cc
+++ b/chrome/browser/ui/views/payments/payment_request_views_util.cc
@@ -27,6 +27,7 @@
 #include "components/payments/core/strings_util.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/vector_icons/vector_icons.h"
+#include "third_party/blink/public/mojom/payments/payment_request.mojom.h"
 #include "ui/base/default_style.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
diff --git a/chrome/browser/ui/views/payments/payment_request_views_util.h b/chrome/browser/ui/views/payments/payment_request_views_util.h
index 6a0ba66b..8b3cfe4a 100644
--- a/chrome/browser/ui/views/payments/payment_request_views_util.h
+++ b/chrome/browser/ui/views/payments/payment_request_views_util.h
@@ -9,7 +9,7 @@
 #include <string>
 
 #include "base/strings/string16.h"
-#include "third_party/blink/public/mojom/payments/payment_request.mojom.h"
+#include "third_party/blink/public/mojom/payments/payment_request.mojom-forward.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/image/image_skia.h"
diff --git a/chrome/browser/ui/views/tabs/tab_strip.h b/chrome/browser/ui/views/tabs/tab_strip.h
index 736c41a..5eb4e6a2 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.h
+++ b/chrome/browser/ui/views/tabs/tab_strip.h
@@ -28,7 +28,6 @@
 #include "chrome/browser/ui/views/tabs/tab_drag_context.h"
 #include "chrome/browser/ui/views/tabs/tab_group_header.h"
 #include "chrome/browser/ui/views/tabs/tab_group_views.h"
-#include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "components/tab_groups/tab_group_visual_data.h"
 #include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/material_design/material_design_controller_observer.h"
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.h b/chrome/browser/ui/views/toolbar/toolbar_view.h
index d7acda28..7cb5e901 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_view.h
+++ b/chrome/browser/ui/views/toolbar/toolbar_view.h
@@ -37,7 +37,7 @@
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/arc/intent_helper/arc_intent_picker_app_fetcher.h"
 #include "components/arc/intent_helper/arc_intent_helper_bridge.h"
-#include "components/arc/mojom/intent_helper.mojom.h"  // nogncheck https://crbug.com/784179
+#include "components/arc/mojom/intent_helper.mojom-forward.h"  // nogncheck https://crbug.com/784179
 #endif  // defined(OS_CHROMEOS)
 
 class AppMenuButton;
diff --git a/chrome/browser/ui/views/touch_selection_menu_runner_chromeos.h b/chrome/browser/ui/views/touch_selection_menu_runner_chromeos.h
index d61a3581..1a02c57 100644
--- a/chrome/browser/ui/views/touch_selection_menu_runner_chromeos.h
+++ b/chrome/browser/ui/views/touch_selection_menu_runner_chromeos.h
@@ -9,7 +9,7 @@
 #include <string>
 #include <vector>
 
-#include "components/arc/mojom/intent_helper.mojom.h"
+#include "components/arc/mojom/intent_helper.mojom-forward.h"
 #include "ui/aura/window_tracker.h"
 #include "ui/views/touchui/touch_selection_menu_runner_views.h"
 
diff --git a/chrome/browser/ui/webui/app_management/app_management_page_handler.h b/chrome/browser/ui/webui/app_management/app_management_page_handler.h
index 6bc45d4..039c18af 100644
--- a/chrome/browser/ui/webui/app_management/app_management_page_handler.h
+++ b/chrome/browser/ui/webui/app_management/app_management_page_handler.h
@@ -7,7 +7,7 @@
 
 #include "base/macros.h"
 #include "base/scoped_observer.h"
-#include "chrome/browser/ui/webui/app_management/app_management.mojom.h"
+#include "chrome/browser/ui/webui/app_management/app_management.mojom-forward.h"
 #include "chrome/browser/ui/webui/app_management/app_management_shelf_delegate_chromeos.h"
 #include "chrome/services/app_service/public/cpp/app_registry_cache.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.h b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.h
index 0b09770..8f22cb5 100644
--- a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.h
+++ b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.h
@@ -6,7 +6,7 @@
 #define CHROME_BROWSER_UI_WEBUI_BLUETOOTH_INTERNALS_BLUETOOTH_INTERNALS_UI_H_
 
 #include "base/macros.h"
-#include "chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals.mojom.h"
+#include "chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals.mojom-forward.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "ui/webui/mojo_web_ui_controller.h"
 
diff --git a/chrome/browser/ui/webui/ntp/cookie_controls_handler.cc b/chrome/browser/ui/webui/ntp/cookie_controls_handler.cc
index b04b93e..d5d8841 100644
--- a/chrome/browser/ui/webui/ntp/cookie_controls_handler.cc
+++ b/chrome/browser/ui/webui/ntp/cookie_controls_handler.cc
@@ -17,11 +17,12 @@
 static const char* kPolicyIcon = "cr20:domain";
 }  // namespace
 
-CookieControlsHandler::CookieControlsHandler(Profile* profile) {
-  service_ = CookieControlsServiceFactory::GetForProfile(profile);
-}
+CookieControlsHandler::CookieControlsHandler(Profile* profile)
+    : service_(CookieControlsServiceFactory::GetForProfile(profile)) {}
 
-CookieControlsHandler::~CookieControlsHandler() = default;
+CookieControlsHandler::~CookieControlsHandler() {
+  service_->RemoveObserver(this);
+}
 
 void CookieControlsHandler::RegisterMessages() {
   web_ui()->RegisterMessageCallback(
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index 9b1e8106..b5cdea1 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -739,6 +739,8 @@
       {"changePasswordButton", IDS_SETTINGS_CHANGE_PASSWORD_BUTTON},
       {"leakedPassword", IDS_SETTINGS_COMPROMISED_PASSWORD_REASON_LEAKED},
       {"phishedPassword", IDS_SETTINGS_COMPROMISED_PASSWORD_REASON_PHISHED},
+      {"noCompromisedCredentials",
+       IDS_SETTINGS_NO_COMPROMISED_CREDENTIALS_LABEL},
       {"creditCards", IDS_AUTOFILL_PAYMENT_METHODS},
       {"noPaymentMethodsFound", IDS_SETTINGS_PAYMENT_METHODS_NONE},
       {"googlePayments", IDS_SETTINGS_GOOGLE_PAYMENTS},
diff --git a/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc
index e82721bb..e971e14 100644
--- a/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc
@@ -232,7 +232,6 @@
              IDS_SETTINGS_USE_HISTORY_TO_PERSONALIZE_GOOGLE_SERVICES_TITLE},
             {"SwaaOn", IDS_SETTINGS_SWAA_ON},
             {"SwaaOff", IDS_SETTINGS_SWAA_OFF},
-            {"SwaaOnHint", IDS_SETTINGS_SWAA_ON_HINT},
             {"dataEncryptedHint", IDS_SETTINGS_DATA_ENCRYPTED_HINT},
             {"historySyncOffHint", IDS_SETTINGS_HISTORY_SYNC_OFF_HINT},
             {"SwaaOffHint", IDS_SETTINGS_SWAA_OFF_HINT},
diff --git a/chrome/browser/ui/webui/signin/inline_login_ui.cc b/chrome/browser/ui/webui/signin/inline_login_ui.cc
index d36f43f..555c5e9b5 100644
--- a/chrome/browser/ui/webui/signin/inline_login_ui.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_ui.cc
@@ -28,6 +28,7 @@
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h"
 #include "chrome/browser/ui/webui/signin/inline_login_handler_chromeos.h"
+#include "ui/resources/grit/webui_resources.h"
 #include "ui/strings/grit/ui_strings.h"
 #else
 #include "chrome/browser/ui/webui/signin/inline_login_handler_impl.h"
@@ -65,6 +66,9 @@
   source->AddResourcePath("gaia_auth_host.js", IDR_GAIA_AUTH_AUTHENTICATOR_JS);
 
 #if defined(OS_CHROMEOS)
+  source->OverrideContentSecurityPolicyScriptSrc(
+      "script-src chrome://resources chrome://test 'self';");
+
   source->AddResourcePath("edu", IDU_EDU_LOGIN_EDU_LOGIN_HTML);
   source->AddResourcePath("app.js", IDU_EDU_LOGIN_EDU_LOGIN_JS);
   source->AddResourcePath("edu_login_button.js",
@@ -75,6 +79,9 @@
   source->AddResourcePath("browser_proxy.js", IDR_EDU_LOGIN_BROWSER_PROXY_JS);
   source->AddResourcePath("edu_login_util.js", IDR_EDU_LOGIN_EDU_LOGIN_UTIL_JS);
 
+  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER);
+  source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER);
+
   AddEduStrings(source);
 #endif
 
diff --git a/chrome/browser/web_applications/web_app_migration_manager.cc b/chrome/browser/web_applications/web_app_migration_manager.cc
index 90eefbc7..b203e680 100644
--- a/chrome/browser/web_applications/web_app_migration_manager.cc
+++ b/chrome/browser/web_applications/web_app_migration_manager.cc
@@ -180,8 +180,12 @@
 
   web_app->SetThemeColor(bookmark_app_registrar_.GetAppThemeColor(app_id));
   web_app->SetDisplayMode(bookmark_app_registrar_.GetAppDisplayMode(app_id));
-  web_app->SetUserDisplayMode(
-      bookmark_app_registrar_.GetAppUserDisplayMode(app_id));
+
+  DisplayMode user_display_mode =
+      bookmark_app_registrar_.GetAppUserDisplayMode(app_id);
+  if (user_display_mode != DisplayMode::kUndefined)
+    web_app->SetUserDisplayMode(user_display_mode);
+
   web_app->SetIsLocallyInstalled(
       bookmark_app_registrar_.IsLocallyInstalled(app_id));
   web_app->SetIconInfos(bookmark_app_registrar_.GetAppIconInfos(app_id));
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index f31f4a2..f09b37bc 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -601,8 +601,8 @@
     "PushMessagingBackgroundMode", base::FEATURE_DISABLED_BY_DEFAULT};
 
 // Enables using quiet prompts for notification permission requests.
-const base::Feature kQuietNotificationPrompts{
-    "QuietNotificationPrompts", base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kQuietNotificationPrompts{"QuietNotificationPrompts",
+                                              base::FEATURE_ENABLED_BY_DEFAULT};
 
 #if defined(OS_CHROMEOS)
 // Enables permanent removal of Legacy Supervised Users on startup.
diff --git a/chrome/common/extensions/api/passwords_private.idl b/chrome/common/extensions/api/passwords_private.idl
index 3a5a57fc..b83c5c5 100644
--- a/chrome/common/extensions/api/passwords_private.idl
+++ b/chrome/common/extensions/api/passwords_private.idl
@@ -241,6 +241,13 @@
     // Invokes |callback| on completion.
     static void removeCompromisedCredential(CompromisedCredential credential,
                                             optional VoidCallback callback);
+
+    // Starts a check for compromised passwords. Invokes |callback| on
+    // completion.
+    static void startPasswordCheck(optional VoidCallback callback);
+    // Stops checking for compromised passwords. Invokes |callback| on
+    // completion.
+    static void stopPasswordCheck(optional VoidCallback callback);
   };
 
   interface Events {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 773498e4..8372c0da 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -819,7 +819,7 @@
       "//testing/test_env.py",
       "//third_party/mocha/mocha.js",
       "//third_party/polymer/v1_0/components-chromium/iron-test-helpers/mock-interactions.js",
-      "//third_party/pywebsocket/src/mod_pywebsocket/",
+      "//third_party/pywebsocket3/src/mod_pywebsocket/",
       "//third_party/simplejson/",
       "//third_party/tlslite/",
       "//ui/webui/resources/",
@@ -1165,6 +1165,7 @@
       "../browser/safe_browsing/chrome_cleaner/reporter_runner_browsertest_win.cc",
       "../browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.cc",
       "../browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h",
+      "../browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate_browsertest.cc",
       "../browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views_browsertest.cc",
       "../browser/safe_browsing/download_protection/download_protection_service_browsertest.cc",
       "../browser/safe_browsing/test_safe_browsing_database_helper.cc",
@@ -3666,7 +3667,7 @@
     "//extensions/test/data/",
     "//google_apis/test/data/",
     "//net/tools/testserver/",
-    "//third_party/pywebsocket/src/mod_pywebsocket/",
+    "//third_party/pywebsocket3/src/mod_pywebsocket/",
     "//third_party/tlslite/",
     "//third_party/zlib/google/test/data/",
     "//tools/metrics/histograms/enums.xml",
@@ -5795,7 +5796,7 @@
       "//ppapi/tests/test_page.css.mock-http-headers",
       "//third_party/mocha/mocha.js",
       "//third_party/polymer/v1_0/components-chromium/iron-test-helpers/mock-interactions.js",
-      "//third_party/pywebsocket/src/mod_pywebsocket/",
+      "//third_party/pywebsocket3/src/mod_pywebsocket/",
       "//third_party/tlslite/",
       "//third_party/zlib/google/test/data/",
       "//tools/metrics/histograms/enums.xml",
@@ -6381,7 +6382,7 @@
     data = [
       "//chrome/test/data/sync/",
       "//net/tools/testserver/",
-      "//third_party/pywebsocket/src/mod_pywebsocket/",
+      "//third_party/pywebsocket3/src/mod_pywebsocket/",
       "//third_party/tlslite/",
       "//testing/xvfb.py",
     ]
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetTestRule.java
index dbb721a9..33548f0 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetTestRule.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetTestRule.java
@@ -5,7 +5,7 @@
 package org.chromium.chrome.browser.widget.bottomsheet;
 
 import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
-import static org.chromium.chrome.browser.ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE;
+import static org.chromium.chrome.browser.flags.ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE;
 
 import android.support.test.InstrumentationRegistry;
 import android.support.test.uiautomator.UiDevice;
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/tests/FirstRunControllerTest.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/tests/FirstRunControllerTest.java
index bfbabc2..849ee5f 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/tests/FirstRunControllerTest.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/tests/FirstRunControllerTest.java
@@ -16,7 +16,7 @@
 
 import org.chromium.base.test.BaseJUnit4ClassRunner;
 import org.chromium.base.test.params.ParameterizedCommandLineFlags.Switches;
-import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.pagecontroller.controllers.first_run.TOSController;
 import org.chromium.chrome.test.pagecontroller.controllers.ntp.NewTabPageController;
 import org.chromium.chrome.test.pagecontroller.rules.ChromeUiApplicationTestRule;
diff --git a/chrome/test/data/android/render_tests/TabGridIphTest.iph_landscape.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/TabGridIphTest.iph_landscape.Nexus_5-19.png.sha1
index 9b52df5..f8554e0 100644
--- a/chrome/test/data/android/render_tests/TabGridIphTest.iph_landscape.Nexus_5-19.png.sha1
+++ b/chrome/test/data/android/render_tests/TabGridIphTest.iph_landscape.Nexus_5-19.png.sha1
@@ -1 +1 @@
-d042754b31261730a99f1ab48b8d2be8da49da3f
\ No newline at end of file
+3658acf6c513bbd6bb721e35d0e9f1ed2fd5f9a8
\ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/TabGridIphTest.iph_landscape.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/TabGridIphTest.iph_landscape.Nexus_5X-23.png.sha1
index 96fe4f8..ae14c1f 100644
--- a/chrome/test/data/android/render_tests/TabGridIphTest.iph_landscape.Nexus_5X-23.png.sha1
+++ b/chrome/test/data/android/render_tests/TabGridIphTest.iph_landscape.Nexus_5X-23.png.sha1
@@ -1 +1 @@
-bb0917985d1b2966460727b5073794aef03a2785
\ No newline at end of file
+236e00bcc45cb47de9cca93e29a8e4d9b7475f50
\ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/TabGridIphTest.iph_portrait.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/TabGridIphTest.iph_portrait.Nexus_5-19.png.sha1
index dc91a67..e3cda44 100644
--- a/chrome/test/data/android/render_tests/TabGridIphTest.iph_portrait.Nexus_5-19.png.sha1
+++ b/chrome/test/data/android/render_tests/TabGridIphTest.iph_portrait.Nexus_5-19.png.sha1
@@ -1 +1 @@
-9da492922e5f75bb701c41ea8541ff6635e94a70
\ No newline at end of file
+5687e3199646a34e553b9c2f8c1338caaea9a515
\ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/TabGridIphTest.iph_portrait.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/TabGridIphTest.iph_portrait.Nexus_5X-23.png.sha1
index 2a9393c..eb43d0b 100644
--- a/chrome/test/data/android/render_tests/TabGridIphTest.iph_portrait.Nexus_5X-23.png.sha1
+++ b/chrome/test/data/android/render_tests/TabGridIphTest.iph_portrait.Nexus_5X-23.png.sha1
@@ -1 +1 @@
-a9ffabcd7e6f2a8c02bbc74d4f5e9819d9ce29e1
\ No newline at end of file
+4b993838cf4c79cce3bf08914041d1a7bc4f3e00
\ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/passwords_private/test.js b/chrome/test/data/extensions/api_test/passwords_private/test.js
index df39fbe..ab9727b8 100644
--- a/chrome/test/data/extensions/api_test/passwords_private/test.js
+++ b/chrome/test/data/extensions/api_test/passwords_private/test.js
@@ -41,8 +41,7 @@
         numSavedPasswords = savedPasswordsList.length;
         chrome.passwordsPrivate.removeSavedPassword(savedPasswordsList[0].id);
       } else if (numCalls == 2) {
-        chrome.test.assertEq(
-            savedPasswordsList.length, numSavedPasswords - 1);
+        chrome.test.assertEq(savedPasswordsList.length, numSavedPasswords - 1);
         chrome.passwordsPrivate.undoRemoveSavedPasswordOrException();
       } else if (numCalls == 3) {
         chrome.test.assertEq(savedPasswordsList.length, numSavedPasswords);
@@ -339,6 +338,27 @@
           chrome.test.succeed();
         });
   },
+
+  function startPasswordCheck() {
+    chrome.passwordsPrivate.startPasswordCheck(() => {
+      chrome.test.assertNoLastError();
+      chrome.test.succeed();
+    });
+  },
+
+  function startPasswordCheckFailed() {
+    chrome.passwordsPrivate.startPasswordCheck(() => {
+      chrome.test.assertLastError('Starting password check failed.');
+      chrome.test.succeed();
+    });
+  },
+
+  function stopPasswordCheck() {
+    chrome.passwordsPrivate.stopPasswordCheck(() => {
+      chrome.test.assertNoLastError();
+      chrome.test.succeed();
+    });
+  },
 ];
 
 var testToRun = window.location.search.substring(1);
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index d11f415..8d56e34 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -135,6 +135,7 @@
       "../../../browser/ui/webui/chromeos/certificate_manager_dialog_browsertest.js",
       "../chromeos/oobe_webui_browsertest.js",
       "certificate_viewer_dialog_test.js",
+      "chromeos/edu_login/edu_login_browsertest.js",
       "set_time_dialog_browsertest.js",
       "settings/a11y/crostini_settings_details_a11y_test.js",
       "settings/a11y/crostini_settings_export_import_a11y_test.js",
diff --git a/chrome/test/data/webui/chromeos/edu_login/edu_login_browsertest.js b/chrome/test/data/webui/chromeos/edu_login/edu_login_browsertest.js
new file mode 100644
index 0000000..75ba0150
--- /dev/null
+++ b/chrome/test/data/webui/chromeos/edu_login/edu_login_browsertest.js
@@ -0,0 +1,68 @@
+// Copyright 2020 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.
+
+/** @fileoverview Runs the EDU login flow tests. */
+
+GEN_INCLUDE(['//chrome/test/data/webui/polymer_browser_test_base.js']);
+
+const EduLoginTest = class extends PolymerTest {
+  /** @override */
+  get browsePreload() {
+    throw 'this is abstract and should be overridden by subclasses';
+  }
+
+  get suiteName() {
+    throw 'this is abstract and should be overridden by subclasses';
+  }
+
+  /** @override */
+  get extraLibraries() {
+    return [
+      '//third_party/mocha/mocha.js',
+      '//chrome/test/data/webui/mocha_adapter.js',
+    ];
+  }
+
+  /** @param {string} testName The name of the test to run. */
+  runMochaTest(testName) {
+    runMochaTest(this.suiteName, testName);
+  }
+};
+
+// eslint-disable-next-line no-var
+var EduLoginButtonTest = class extends EduLoginTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://chrome-signin/test_loader.html?module=chromeos/edu_login/edu_login_button_test.js';
+  }
+
+  /** @override */
+  get suiteName() {
+    return edu_login_button_tests.suiteName;
+  }
+};
+
+TEST_F('EduLoginButtonTest', 'OkButtonProperties', function() {
+  this.runMochaTest(edu_login_button_tests.TestNames.OkButtonProperties);
+});
+
+TEST_F('EduLoginButtonTest', 'NextButtonProperties', function() {
+  this.runMochaTest(edu_login_button_tests.TestNames.NextButtonProperties);
+});
+
+TEST_F('EduLoginButtonTest', 'BackButtonProperties', function() {
+  this.runMochaTest(edu_login_button_tests.TestNames.BackButtonProperties);
+});
+
+TEST_F('EduLoginButtonTest', 'OkButtonRtlIcon', function() {
+  this.runMochaTest(edu_login_button_tests.TestNames.OkButtonRtlIcon);
+});
+
+TEST_F('EduLoginButtonTest', 'NextButtonRtlIcon', function() {
+  this.runMochaTest(edu_login_button_tests.TestNames.NextButtonRtlIcon);
+});
+
+TEST_F('EduLoginButtonTest', 'BackButtonRtlIcon', function() {
+  this.runMochaTest(edu_login_button_tests.TestNames.BackButtonRtlIcon);
+});
diff --git a/chrome/test/data/webui/chromeos/edu_login/edu_login_button_test.js b/chrome/test/data/webui/chromeos/edu_login/edu_login_button_test.js
new file mode 100644
index 0000000..0a7bd739
--- /dev/null
+++ b/chrome/test/data/webui/chromeos/edu_login/edu_login_button_test.js
@@ -0,0 +1,103 @@
+// Copyright 2020 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.
+
+import 'chrome://chrome-signin/edu_login_button.js';
+
+import {assert} from 'chrome://resources/js/assert.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+window.edu_login_button_tests = {};
+edu_login_button_tests.suiteName = 'EduLoginButtonTest';
+
+/** @enum {string} */
+edu_login_button_tests.TestNames = {
+  OkButtonProperties: 'OK button properties',
+  NextButtonProperties: 'Next button properties',
+  BackButtonProperties: 'Back button properties',
+  OkButtonRtlIcon: 'OK button RTL icon',
+  NextButtonRtlIcon: 'Next button RTL icon',
+  BackButtonRtlIcon: 'Back button RTL icon',
+};
+
+/** @param {boolean} isRTL */
+function finishSetup(isRTL) {
+  document.documentElement.dir = isRTL ? 'rtl' : 'ltr';
+  flush();
+}
+
+suite(edu_login_button_tests.suiteName, function() {
+  let okButton;
+  let nextButton;
+  let backButton;
+
+  setup(function() {
+    PolymerTest.clearBody();
+    document.body.innerHTML = `
+      <edu-login-button button-type="ok" id="okButton"></edu-login-button>
+      <edu-login-button button-type="next" id="nextButton" disabled>
+      </edu-login-button>
+      <edu-login-button button-type="back" id="backButton"></edu-login-button>
+    `;
+    okButton = document.body.querySelector('#okButton');
+    nextButton = document.body.querySelector('#nextButton');
+    backButton = document.body.querySelector('#backButton');
+  });
+
+  test(assert(edu_login_button_tests.TestNames.OkButtonProperties), function() {
+    finishSetup(false);
+    assertEquals('ok', okButton.buttonType);
+    assertFalse(okButton.disabled);
+    assertEquals(1, okButton.$$('cr-button').classList.length);
+    assertEquals('action-button', okButton.$$('cr-button').classList[0]);
+    assertEquals(
+        loadTimeData.getString('okButton'),
+        okButton.$$('cr-button').textContent.trim());
+    // OK button shouldn't have icon.
+    assertEquals(null, okButton.$$('iron-icon'));
+  });
+
+  test(
+      assert(edu_login_button_tests.TestNames.NextButtonProperties),
+      function() {
+        finishSetup(false);
+        assertEquals('next', nextButton.buttonType);
+        assertTrue(nextButton.disabled);
+        assertEquals(1, nextButton.$$('cr-button').classList.length);
+        assertEquals('action-button', nextButton.$$('cr-button').classList[0]);
+        assertEquals(
+            loadTimeData.getString('nextButton'),
+            nextButton.$$('cr-button').textContent.trim());
+        assertEquals('cr:chevron-right', nextButton.$$('iron-icon').icon);
+      });
+
+  test(
+      assert(edu_login_button_tests.TestNames.BackButtonProperties),
+      function() {
+        finishSetup(false);
+        assertEquals('back', backButton.buttonType);
+        assertFalse(backButton.disabled);
+        assertEquals(0, backButton.$$('cr-button').classList.length);
+        assertEquals(
+            loadTimeData.getString('backButton'),
+            backButton.$$('cr-button').textContent.trim());
+        assertEquals('cr:chevron-left', backButton.$$('iron-icon').icon);
+      });
+
+  test(assert(edu_login_button_tests.TestNames.OkButtonRtlIcon), function() {
+    finishSetup(true);
+    // OK button shouldn't have icon.
+    assertEquals(null, okButton.$$('iron-icon'));
+  });
+
+  test(assert(edu_login_button_tests.TestNames.NextButtonRtlIcon), function() {
+    finishSetup(true);
+    assertEquals('cr:chevron-left', nextButton.$$('iron-icon').icon);
+  });
+
+  test(assert(edu_login_button_tests.TestNames.BackButtonRtlIcon), function() {
+    finishSetup(true);
+    assertEquals('cr:chevron-right', backButton.$$('iron-icon').icon);
+  });
+});
diff --git a/chrome/test/data/webui/settings/password_check_test.js b/chrome/test/data/webui/settings/password_check_test.js
index af3dbb8..ad774b0 100644
--- a/chrome/test/data/webui/settings/password_check_test.js
+++ b/chrome/test/data/webui/settings/password_check_test.js
@@ -70,6 +70,7 @@
     test('testNoCompromisedCredentials', function() {
       const checkPasswordSection = createCheckPasswordSection();
       assertTrue(checkPasswordSection.$.passwordCheckBody.hidden);
+      assertFalse(checkPasswordSection.$.noCompromisedCredentials.hidden);
       validateLeakedPasswordsList(
           checkPasswordSection.$.leakedPasswordList, []);
     });
@@ -91,6 +92,7 @@
           .then(() => {
             Polymer.dom.flush();
             assertFalse(checkPasswordSection.$.passwordCheckBody.hidden);
+            assertTrue(checkPasswordSection.$.noCompromisedCredentials.hidden);
             validateLeakedPasswordsList(
                 checkPasswordSection.$.leakedPasswordList, leakedPasswords);
           });
diff --git a/chrome/test/data/webui/settings/people_page_sync_page_test.js b/chrome/test/data/webui/settings/people_page_sync_page_test.js
index 5c4ef899..9e54dde 100644
--- a/chrome/test/data/webui/settings/people_page_sync_page_test.js
+++ b/chrome/test/data/webui/settings/people_page_sync_page_test.js
@@ -48,7 +48,6 @@
         syncSetupFriendlySettings: true,
         SwaaOn: 'On',
         SwaaOff: 'Off',
-        SwaaOnHint: 'SwaaOnHint',
         SwaaOffHint: 'SwaaOffHint',
         historySyncOffHint: 'historySyncOffHint',
         dataEncryptedHint: 'dataEncryptedHint',
@@ -567,11 +566,12 @@
     });
 
     test('Swaa', async function() {
-      function verifyResults(hidden, Swaa, SwaaHint, hideActivityControlsUrl) {
+      function verifyResults(
+          hidden, Swaa, SwaaOffHint, hideActivityControlsUrl) {
         const SwaaText = syncPage.$$('#history-usage-state .secondary');
-        const historyUsageHint = syncPage.$$('#history-usage-hint');
+        const historyUsageOffHint = syncPage.$$('#history-usage-off-hint');
         assertEquals(SwaaText.hidden, hidden);
-        assertEquals(historyUsageHint.hidden, hidden);
+        assertEquals(historyUsageOffHint.hidden, Swaa !== 'Off');
         assertEquals(
             syncPage.$$('#history-usage-row')
                 .querySelector('.icon-external')
@@ -580,7 +580,9 @@
 
         if (!hidden) {
           assertEquals(SwaaText.textContent.trim(), Swaa);
-          assertEquals(historyUsageHint.textContent.trim(), SwaaHint);
+          if (Swaa === 'Off') {
+            assertEquals(historyUsageOffHint.textContent.trim(), SwaaOffHint);
+          }
         }
       }
 
@@ -604,8 +606,7 @@
       assertFalse(syncSection.hidden);
       await browserProxy.whenCalled('queryIsHistoryRecordingEnabled');
       verifyResults(
-          /*hidden=*/ false, 'On', 'SwaaOnHint',
-          /*hideActivityControlsUrl=*/ false);
+          /*hidden=*/ false, 'On', '', /*hideActivityControlsUrl=*/ false);
 
       // Data encrypted with custom passphrase.
       setSyncPrefs({encryptAllData: true});
diff --git a/chrome/updater/app/app.cc b/chrome/updater/app/app.cc
index a6f89011..e4a82180 100644
--- a/chrome/updater/app/app.cc
+++ b/chrome/updater/app/app.cc
@@ -37,17 +37,21 @@
   base::ThreadPoolInstance::CreateAndStartWithDefaultParams("Updater");
   base::SingleThreadTaskExecutor main_task_executor(base::MessagePumpType::UI);
   Initialize();
-  base::RunLoop runloop;
-  base::ScopedDisallowBlocking no_blocking_allowed_on_ui_thread;
   int exit_code = 0;
-  quit_ = base::BindOnce(
-      [](base::OnceClosure quit, int* exit_code_out, int exit_code) {
-        *exit_code_out = exit_code;
-        std::move(quit).Run();
-      },
-      runloop.QuitWhenIdleClosure(), &exit_code);
-  FirstTaskRun();
-  runloop.Run();
+  {
+    base::ScopedDisallowBlocking no_blocking_allowed_on_ui_thread;
+    base::RunLoop runloop;
+    quit_ = base::BindOnce(
+        [](base::OnceClosure quit, int* exit_code_out, int exit_code) {
+          *exit_code_out = exit_code;
+          std::move(quit).Run();
+        },
+        runloop.QuitWhenIdleClosure(), &exit_code);
+    FirstTaskRun();
+    runloop.Run();
+  }
+
+  // Shutting down the thread pool involves joining threads.
   base::ThreadPoolInstance::Get()->Shutdown();
   return exit_code;
 }
diff --git a/chrome/updater/constants.h b/chrome/updater/constants.h
index a70b9a98f..f260c50 100644
--- a/chrome/updater/constants.h
+++ b/chrome/updater/constants.h
@@ -15,6 +15,8 @@
 // Chrome's app ID.
 extern const char kChromeAppId[];
 
+// "0.0.0.0". Historically, a null version has been used to indicate a
+// new install.
 extern const char kNullVersion[];
 
 // Command line switches.
diff --git a/chrome/updater/installer.cc b/chrome/updater/installer.cc
index 0fc2b3e0..7d31f24 100644
--- a/chrome/updater/installer.cc
+++ b/chrome/updater/installer.cc
@@ -61,9 +61,12 @@
   // |pv| is the version of the registered app, persisted in prefs, and used
   // in the update checks and pings.
   const auto pv = persisted_data_->GetProductVersion(app_id_);
-  if (pv.IsValid())
+  if (pv.IsValid()) {
     pv_ = pv;
-  fingerprint_ = persisted_data_->GetFingerprint(app_id_);
+    fingerprint_ = persisted_data_->GetFingerprint(app_id_);
+  } else {
+    pv_ = base::Version(kNullVersion);
+  }
 
   update_client::CrxComponent component;
   component.installer = scoped_refptr<Installer>(this);
diff --git a/chrome/updater/win/install_app.cc b/chrome/updater/win/install_app.cc
index 0ffc50c..318e065 100644
--- a/chrome/updater/win/install_app.cc
+++ b/chrome/updater/win/install_app.cc
@@ -487,7 +487,6 @@
 
 InstallAppController::~InstallAppController() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  FlushPrefs();
 }
 
 void InstallAppController::InstallApp(const std::string& app_id) {
@@ -550,7 +549,7 @@
 // by calling UpdateClient::GetCrxUpdateState.
 void InstallAppController::InstallComplete() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
+  FlushPrefs();
   install_progress_observer_ipc_ = nullptr;
   update_client_->RemoveObserver(this);
   update_client_ = nullptr;
@@ -692,11 +691,7 @@
 
 void InstallAppController::FlushPrefs() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  base::RunLoop runloop;
-  config_->GetPrefService()->CommitPendingWrite(base::BindOnce(
-      [](base::OnceClosure quit_closure) { std::move(quit_closure).Run(); },
-      runloop.QuitWhenIdleClosure()));
-  runloop.Run();
+  config_->GetPrefService()->SchedulePendingLossyWrites();
 }
 
 DWORD InstallAppController::GetUIThreadID() const {
@@ -706,6 +701,7 @@
 
 }  // namespace
 
+// Installs the updater and one application specified by |app_id|.
 class AppInstall : public App {
  public:
   explicit AppInstall(const std::string& app_id);
@@ -720,6 +716,10 @@
   std::string app_id_;
   scoped_refptr<Configurator> config_;
   std::unique_ptr<InstallAppController> app_install_controller_;
+
+  // The splash screen has a fading effect. That means that the splash screen
+  // needs to be alive for a while, until the fading effect is over.
+  std::unique_ptr<ui::SplashScreen> splash_screen_;
 };
 
 AppInstall::AppInstall(const std::string& app_id) : app_id_(app_id) {}
@@ -732,8 +732,8 @@
 void AppInstall::FirstTaskRun() {
   DCHECK(base::ThreadTaskRunnerHandle::IsSet());
 
-  ui::SplashScreen splash_screen(kAppNameChrome);
-  splash_screen.Show();
+  splash_screen_ = std::make_unique<ui::SplashScreen>(kAppNameChrome);
+  splash_screen_->Show();
 
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE,
@@ -745,7 +745,7 @@
              base::OnceCallback<void(int)> done, int result) {
             splash_screen->Dismiss(base::BindOnce(std::move(done), result));
           },
-          &splash_screen, base::BindOnce(&AppInstall::SetupDone, this)));
+          splash_screen_.get(), base::BindOnce(&AppInstall::SetupDone, this)));
 }
 
 void AppInstall::SetupDone(int result) {
diff --git a/chrome/updater/win/ui/splash_screen.cc b/chrome/updater/win/ui/splash_screen.cc
index 17c5a1d..22fa747 100644
--- a/chrome/updater/win/ui/splash_screen.cc
+++ b/chrome/updater/win/ui/splash_screen.cc
@@ -41,6 +41,9 @@
 
 SplashScreen::~SplashScreen() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  // TODO(crbug.com/1059094) this assert may fire when the dtor is called
+  // while the window is fading out.
   DCHECK(state_ == WindowState::STATE_CREATED ||
          state_ == WindowState::STATE_CLOSED);
 }
@@ -58,6 +61,7 @@
 }
 
 void SplashScreen::Dismiss(base::OnceClosure on_close_closure) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   on_close_closure_ = std::move(on_close_closure);
   switch (state_) {
     case WindowState::STATE_CREATED:
diff --git a/chromecast/media/audio/cast_audio_manager_unittest.cc b/chromecast/media/audio/cast_audio_manager_unittest.cc
index 86f3dce..e64e4f2d2 100644
--- a/chromecast/media/audio/cast_audio_manager_unittest.cc
+++ b/chromecast/media/audio/cast_audio_manager_unittest.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/test/task_environment.h"
 #include "build/build_config.h"
 #include "chromecast/chromecast_buildflags.h"
diff --git a/chromecast/media/audio/cast_audio_output_stream_unittest.cc b/chromecast/media/audio/cast_audio_output_stream_unittest.cc
index 6fbc2d1..ae4d4a7 100644
--- a/chromecast/media/audio/cast_audio_output_stream_unittest.cc
+++ b/chromecast/media/audio/cast_audio_output_stream_unittest.cc
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
diff --git a/chromecast/renderer/cast_url_loader_throttle_provider.cc b/chromecast/renderer/cast_url_loader_throttle_provider.cc
index 1dfafd5..5feb1118 100644
--- a/chromecast/renderer/cast_url_loader_throttle_provider.cc
+++ b/chromecast/renderer/cast_url_loader_throttle_provider.cc
@@ -5,6 +5,7 @@
 #include "chromecast/renderer/cast_url_loader_throttle_provider.h"
 
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "chromecast/common/activity_filtering_url_loader_throttle.h"
 #include "chromecast/common/cast_url_loader_throttle.h"
 #include "content/public/renderer/render_frame.h"
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 988628e..cd051ff 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-12954.0.0
\ No newline at end of file
+12955.0.0
\ No newline at end of file
diff --git a/chromeos/components/account_manager/account_manager.cc b/chromeos/components/account_manager/account_manager.cc
index 03ef9cd..1089c1f 100644
--- a/chromeos/components/account_manager/account_manager.cc
+++ b/chromeos/components/account_manager/account_manager.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/files/file_util.h"
 #include "base/files/important_file_writer.h"
 #include "base/location.h"
diff --git a/chromeos/components/sample_system_web_app_ui/sample_system_web_app_ui.cc b/chromeos/components/sample_system_web_app_ui/sample_system_web_app_ui.cc
index 9b032b2..5edbd36 100644
--- a/chromeos/components/sample_system_web_app_ui/sample_system_web_app_ui.cc
+++ b/chromeos/components/sample_system_web_app_ui/sample_system_web_app_ui.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/memory/ptr_util.h"
 #include "chromeos/components/sample_system_web_app_ui/url_constants.h"
 #include "chromeos/grit/chromeos_sample_system_web_app_resources.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chromeos/components/sync_wifi/network_test_helper.cc b/chromeos/components/sync_wifi/network_test_helper.cc
index d9226fb..2c569a2 100644
--- a/chromeos/components/sync_wifi/network_test_helper.cc
+++ b/chromeos/components/sync_wifi/network_test_helper.cc
@@ -4,6 +4,7 @@
 
 #include "chromeos/components/sync_wifi/network_test_helper.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "chromeos/components/sync_wifi/network_type_conversions.h"
@@ -99,4 +100,4 @@
 
 }  // namespace sync_wifi
 
-}  // namespace chromeos
\ No newline at end of file
+}  // namespace chromeos
diff --git a/chromeos/components/sync_wifi/synced_network_updater_impl_unittest.cc b/chromeos/components/sync_wifi/synced_network_updater_impl_unittest.cc
index c535893..9e14fec 100644
--- a/chromeos/components/sync_wifi/synced_network_updater_impl_unittest.cc
+++ b/chromeos/components/sync_wifi/synced_network_updater_impl_unittest.cc
@@ -8,6 +8,7 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc
index 89efb70..f402870c 100644
--- a/chromeos/constants/chromeos_features.cc
+++ b/chromeos/constants/chromeos_features.cc
@@ -135,6 +135,10 @@
 const base::Feature kEduCoexistence{"EduCoexistence",
                                     base::FEATURE_DISABLED_BY_DEFAULT};
 
+// If enabled, emoji suggestion will be shown when user type "space".
+const base::Feature kEmojiSuggestAddition{"EmojiSuggestAddition",
+                                          base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables Device End Of Lifetime warning notifications.
 const base::Feature kEolWarningNotifications{"EolWarningNotifications",
                                              base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chromeos/constants/chromeos_features.h b/chromeos/constants/chromeos_features.h
index 5d8ff98..005303c 100644
--- a/chromeos/constants/chromeos_features.h
+++ b/chromeos/constants/chromeos_features.h
@@ -68,6 +68,8 @@
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kDriveFsMirroring;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
+extern const base::Feature kEmojiSuggestAddition;
+COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kEolWarningNotifications;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kEduCoexistence;
diff --git a/chromeos/dbus/fake_concierge_client.cc b/chromeos/dbus/fake_concierge_client.cc
index f88a222..297e9ac 100644
--- a/chromeos/dbus/fake_concierge_client.cc
+++ b/chromeos/dbus/fake_concierge_client.cc
@@ -92,8 +92,10 @@
   import_disk_image_called_ = true;
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
-      base::BindOnce(&FakeConciergeClient::FakeImportCallbacks,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+      base::BindOnce(std::move(callback), import_disk_image_response_));
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(&FakeConciergeClient::NotifyDiskImageProgress,
+                                weak_ptr_factory_.GetWeakPtr()));
 }
 
 void FakeConciergeClient::CancelDiskImageOperation(
@@ -106,9 +108,7 @@
       base::BindOnce(std::move(callback), cancel_disk_image_response_));
 }
 
-void FakeConciergeClient::FakeImportCallbacks(
-    DBusMethodCallback<vm_tools::concierge::ImportDiskImageResponse> callback) {
-  std::move(callback).Run(import_disk_image_response_);
+void FakeConciergeClient::NotifyDiskImageProgress() {
   // Trigger DiskImageStatus signals.
   for (auto const& signal : disk_image_status_signals_) {
     OnDiskImageProgress(signal);
@@ -275,6 +275,9 @@
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::BindOnce(std::move(callback), resize_disk_image_response_));
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(&FakeConciergeClient::NotifyDiskImageProgress,
+                                weak_ptr_factory_.GetWeakPtr()));
 }
 
 void FakeConciergeClient::NotifyVmStarted(
diff --git a/chromeos/dbus/fake_concierge_client.h b/chromeos/dbus/fake_concierge_client.h
index cd3885b..6bcaf26 100644
--- a/chromeos/dbus/fake_concierge_client.h
+++ b/chromeos/dbus/fake_concierge_client.h
@@ -254,10 +254,8 @@
   void NotifyTremplinStarted(
       const vm_tools::cicerone::TremplinStartedSignal& signal);
 
-  // Fakes a sequence of progress callbacks.
-  void FakeImportCallbacks(
-      DBusMethodCallback<vm_tools::concierge::ImportDiskImageResponse>
-          callback);
+  // Notifies observers with a sequence of DiskImageStatus signals.
+  void NotifyDiskImageProgress();
   // Notifies observers with a DiskImageStatus signal.
   void OnDiskImageProgress(
       const vm_tools::concierge::DiskImageStatusResponse& signal);
diff --git a/chromeos/dbus/power/native_timer.cc b/chromeos/dbus/power/native_timer.cc
index a0515a3..77071e15 100644
--- a/chromeos/dbus/power/native_timer.cc
+++ b/chromeos/dbus/power/native_timer.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/files/file_descriptor_watcher_posix.h"
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
diff --git a/chromeos/dbus/shill/shill_client_helper.cc b/chromeos/dbus/shill/shill_client_helper.cc
index f378c367..2c683be 100644
--- a/chromeos/dbus/shill/shill_client_helper.cc
+++ b/chromeos/dbus/shill/shill_client_helper.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/location.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/device_event_log/device_event_log.h"
diff --git a/chromeos/services/assistant/assistant_settings_manager_impl.cc b/chromeos/services/assistant/assistant_settings_manager_impl.cc
index 4c86ce27..06c6304 100644
--- a/chromeos/services/assistant/assistant_settings_manager_impl.cc
+++ b/chromeos/services/assistant/assistant_settings_manager_impl.cc
@@ -9,6 +9,7 @@
 #include "ash/public/cpp/assistant/assistant_state_base.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "chromeos/dbus/util/version_loader.h"
 #include "chromeos/services/assistant/assistant_manager_service_impl.h"
 #include "chromeos/services/assistant/cros_platform_api.h"
diff --git a/chromeos/services/assistant/platform/audio_media_data_source.cc b/chromeos/services/assistant/platform/audio_media_data_source.cc
index bceed9d..85a6b89b 100644
--- a/chromeos/services/assistant/platform/audio_media_data_source.cc
+++ b/chromeos/services/assistant/platform/audio_media_data_source.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/time/time.h"
 
 namespace chromeos {
diff --git a/chromeos/services/device_sync/device_sync_impl.cc b/chromeos/services/device_sync/device_sync_impl.cc
index 38461cc..cd0ba47 100644
--- a/chromeos/services/device_sync/device_sync_impl.cc
+++ b/chromeos/services/device_sync/device_sync_impl.cc
@@ -5,6 +5,7 @@
 #include "chromeos/services/device_sync/device_sync_impl.h"
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/chromeos/services/device_sync/device_sync_service_unittest.cc b/chromeos/services/device_sync/device_sync_service_unittest.cc
index a855a57..0d08c3b 100644
--- a/chromeos/services/device_sync/device_sync_service_unittest.cc
+++ b/chromeos/services/device_sync/device_sync_service_unittest.cc
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/no_destructor.h"
 #include "base/optional.h"
diff --git a/chromeos/services/multidevice_setup/device_reenroller.cc b/chromeos/services/multidevice_setup/device_reenroller.cc
index ecdec9974..30eec61 100644
--- a/chromeos/services/multidevice_setup/device_reenroller.cc
+++ b/chromeos/services/multidevice_setup/device_reenroller.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/containers/flat_set.h"
+#include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
 #include "base/timer/timer.h"
 #include "chromeos/components/multidevice/logging/logging.h"
diff --git a/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client_impl.cc b/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client_impl.cc
index dd853f8..d487fbe 100644
--- a/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client_impl.cc
+++ b/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client_impl.cc
@@ -8,6 +8,7 @@
 #include "chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client_impl.h"
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
 #include "chromeos/components/multidevice/logging/logging.h"
 #include "chromeos/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h"
diff --git a/chromeos/services/secure_channel/active_connection_manager_impl.cc b/chromeos/services/secure_channel/active_connection_manager_impl.cc
index 2b4d699..1c1a162 100644
--- a/chromeos/services/secure_channel/active_connection_manager_impl.cc
+++ b/chromeos/services/secure_channel/active_connection_manager_impl.cc
@@ -4,6 +4,7 @@
 
 #include "chromeos/services/secure_channel/active_connection_manager_impl.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
 #include "base/stl_util.h"
 #include "chromeos/components/multidevice/logging/logging.h"
diff --git a/chromeos/services/secure_channel/ble_synchronizer.cc b/chromeos/services/secure_channel/ble_synchronizer.cc
index 26eff70..fec4580 100644
--- a/chromeos/services/secure_channel/ble_synchronizer.cc
+++ b/chromeos/services/secure_channel/ble_synchronizer.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/chromeos/services/secure_channel/multiplexed_channel_impl.cc b/chromeos/services/secure_channel/multiplexed_channel_impl.cc
index 35867fd0..2ede5c5b 100644
--- a/chromeos/services/secure_channel/multiplexed_channel_impl.cc
+++ b/chromeos/services/secure_channel/multiplexed_channel_impl.cc
@@ -5,6 +5,7 @@
 #include "chromeos/services/secure_channel/multiplexed_channel_impl.h"
 
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
 #include "base/stl_util.h"
 #include "chromeos/components/multidevice/logging/logging.h"
diff --git a/chromeos/services/secure_channel/public/cpp/client/connection_attempt_impl.cc b/chromeos/services/secure_channel/public/cpp/client/connection_attempt_impl.cc
index 5faba75d..6d4f6830 100644
--- a/chromeos/services/secure_channel/public/cpp/client/connection_attempt_impl.cc
+++ b/chromeos/services/secure_channel/public/cpp/client/connection_attempt_impl.cc
@@ -5,6 +5,7 @@
 #include "chromeos/services/secure_channel/public/cpp/client/connection_attempt_impl.h"
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
 #include "chromeos/services/secure_channel/public/cpp/client/client_channel_impl.h"
 
diff --git a/chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl.cc b/chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl.cc
index 38b89ef..3bbad1f 100644
--- a/chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl.cc
+++ b/chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl.cc
@@ -5,6 +5,7 @@
 #include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl.h"
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
 #include "base/task_runner.h"
 #include "chromeos/services/secure_channel/public/cpp/client/connection_attempt_impl.h"
diff --git a/chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl_unittest.cc b/chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl_unittest.cc
index 56604c7..114e0c46 100644
--- a/chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl_unittest.cc
+++ b/chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/no_destructor.h"
 #include "base/optional.h"
diff --git a/chromeos/services/secure_channel/single_client_message_proxy_impl.cc b/chromeos/services/secure_channel/single_client_message_proxy_impl.cc
index df4aafe..66c16e2d 100644
--- a/chromeos/services/secure_channel/single_client_message_proxy_impl.cc
+++ b/chromeos/services/secure_channel/single_client_message_proxy_impl.cc
@@ -4,6 +4,7 @@
 
 #include "chromeos/services/secure_channel/single_client_message_proxy_impl.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
 
 namespace chromeos {
diff --git a/components/arc/ime/arc_ime_service_unittest.cc b/components/arc/ime/arc_ime_service_unittest.cc
index 19a8f0ab..cb9028e 100644
--- a/components/arc/ime/arc_ime_service_unittest.cc
+++ b/components/arc/ime/arc_ime_service_unittest.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "ash/keyboard/ui/keyboard_ui_controller.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/arc/mojom/ime.mojom.h"
diff --git a/components/arc/intent_helper/link_handler_model.cc b/components/arc/intent_helper/link_handler_model.cc
index e065b816..1fc5069f 100644
--- a/components/arc/intent_helper/link_handler_model.cc
+++ b/components/arc/intent_helper/link_handler_model.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/arc/arc_service_manager.h"
diff --git a/components/arc/usb/usb_host_bridge.cc b/components/arc/usb/usb_host_bridge.cc
index 632e837d..4495b4fa 100644
--- a/components/arc/usb/usb_host_bridge.cc
+++ b/components/arc/usb/usb_host_bridge.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/logging.h"
 #include "base/memory/singleton.h"
 #include "base/strings/stringprintf.h"
diff --git a/components/autofill/core/browser/form_data_importer_unittest.cc b/components/autofill/core/browser/form_data_importer_unittest.cc
index 664d6ee..31123a2 100644
--- a/components/autofill/core/browser/form_data_importer_unittest.cc
+++ b/components/autofill/core/browser/form_data_importer_unittest.cc
@@ -14,6 +14,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/feature_list.h"
 #include "base/guid.h"
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc
index bac147d..227156f 100644
--- a/components/autofill/core/browser/personal_data_manager_unittest.cc
+++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -15,6 +15,7 @@
 #include <vector>
 
 #include "base/base64.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/guid.h"
 #include "base/i18n/time_formatting.h"
diff --git a/components/autofill/core/browser/webdata/web_data_service_unittest.cc b/components/autofill/core/browser/webdata/web_data_service_unittest.cc
index 7c872bd3..ed8411ff 100644
--- a/components/autofill/core/browser/webdata/web_data_service_unittest.cc
+++ b/components/autofill/core/browser/webdata/web_data_service_unittest.cc
@@ -7,6 +7,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
diff --git a/components/autofill_assistant/browser/actions/show_form_action.cc b/components/autofill_assistant/browser/actions/show_form_action.cc
index 2c7ddf4..ce8391e 100644
--- a/components/autofill_assistant/browser/actions/show_form_action.cc
+++ b/components/autofill_assistant/browser/actions/show_form_action.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "components/autofill_assistant/browser/actions/action_delegate.h"
 #include "components/autofill_assistant/browser/user_action.h"
diff --git a/components/autofill_assistant/browser/controller.h b/components/autofill_assistant/browser/controller.h
index 6cfd01f..876593db 100644
--- a/components/autofill_assistant/browser/controller.h
+++ b/components/autofill_assistant/browser/controller.h
@@ -10,6 +10,7 @@
 #include <string>
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/optional.h"
 #include "components/autofill_assistant/browser/basic_interactions.h"
diff --git a/components/autofill_assistant/browser/controller_unittest.cc b/components/autofill_assistant/browser/controller_unittest.cc
index 4be8b716..bd6aa16 100644
--- a/components/autofill_assistant/browser/controller_unittest.cc
+++ b/components/autofill_assistant/browser/controller_unittest.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/guid.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/gmock_callback_support.h"
diff --git a/components/autofill_assistant/browser/features.cc b/components/autofill_assistant/browser/features.cc
index fb8d8314..06912af40 100644
--- a/components/autofill_assistant/browser/features.cc
+++ b/components/autofill_assistant/browser/features.cc
@@ -12,9 +12,9 @@
 const base::Feature kAutofillAssistant{"AutofillAssistant",
                                        base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Controls whether to query backend service to start any assisted actions.
+// Controls whether to enable Assistant Autofill in a normal Chrome tab.
 const base::Feature kAutofillAssistantChromeEntry{
-    "AutofillAssistantChromeEntry", base::FEATURE_DISABLED_BY_DEFAULT};
+    "AutofillAssistantChromeEntry", base::FEATURE_ENABLED_BY_DEFAULT};
 
 const base::Feature kAutofillAssistantDirectActions{
     "AutofillAssistantDirectActions", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/browser_sync/profile_sync_components_factory_impl.cc b/components/browser_sync/profile_sync_components_factory_impl.cc
index 7144f2b..73a4c661 100644
--- a/components/browser_sync/profile_sync_components_factory_impl.cc
+++ b/components/browser_sync/profile_sync_components_factory_impl.cc
@@ -255,26 +255,6 @@
                       .get()),
               history_disabled_pref_));
     }
-
-    // If |kDoNotSyncFaviconDataTypes| feature is enabled, never register
-    // controllers for favicon sync. Otherwise, it is enabled by default and we
-    // should register unless explicitly disabled.
-    if (!base::FeatureList::IsEnabled(switches::kDoNotSyncFaviconDataTypes) &&
-        !disabled_types.Has(syncer::FAVICON_IMAGES) &&
-        !disabled_types.Has(syncer::FAVICON_TRACKING)) {
-      controllers.push_back(
-          std::make_unique<SyncableServiceBasedModelTypeController>(
-              syncer::FAVICON_IMAGES,
-              sync_client_->GetModelTypeStoreService()->GetStoreFactory(),
-              sync_client_->GetSyncableServiceForType(syncer::FAVICON_IMAGES),
-              dump_stack));
-      controllers.push_back(
-          std::make_unique<SyncableServiceBasedModelTypeController>(
-              syncer::FAVICON_TRACKING,
-              sync_client_->GetModelTypeStoreService()->GetStoreFactory(),
-              sync_client_->GetSyncableServiceForType(syncer::FAVICON_TRACKING),
-              dump_stack));
-    }
   }
 
   // Password sync is enabled by default.  Register unless explicitly
diff --git a/components/captive_portal/content/captive_portal_tab_helper.cc b/components/captive_portal/content/captive_portal_tab_helper.cc
index 0e70503..9d21cf3 100644
--- a/components/captive_portal/content/captive_portal_tab_helper.cc
+++ b/components/captive_portal/content/captive_portal_tab_helper.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/debug/dump_without_crashing.h"
+#include "base/memory/ptr_util.h"
 #include "components/captive_portal/content/captive_portal_login_detector.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_handle.h"
diff --git a/components/captive_portal/content/captive_portal_tab_helper_unittest.cc b/components/captive_portal/content/captive_portal_tab_helper_unittest.cc
index 394fe7d..3e94366 100644
--- a/components/captive_portal/content/captive_portal_tab_helper_unittest.cc
+++ b/components/captive_portal/content/captive_portal_tab_helper_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/macros.h"
 #include "components/captive_portal/content/captive_portal_service.h"
diff --git a/components/cast_channel/cast_socket.h b/components/cast_channel/cast_socket.h
index 4d1726d1..de772d2 100644
--- a/components/cast_channel/cast_socket.h
+++ b/components/cast_channel/cast_socket.h
@@ -20,7 +20,6 @@
 #include "base/timer/timer.h"
 #include "components/cast_channel/cast_auth_util.h"
 #include "components/cast_channel/cast_channel_enum.h"
-#include "components/cast_channel/cast_socket.h"
 #include "components/cast_channel/cast_transport.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/completion_once_callback.h"
diff --git a/components/cdm/browser/media_drm_storage_impl.cc b/components/cdm/browser/media_drm_storage_impl.cc
index b6102a0bf..eb45fce 100644
--- a/components/cdm/browser/media_drm_storage_impl.cc
+++ b/components/cdm/browser/media_drm_storage_impl.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
 #include "base/optional.h"
 #include "base/strings/string_util.h"
diff --git a/components/component_updater/installer_policies/on_device_head_suggest_component_installer.cc b/components/component_updater/installer_policies/on_device_head_suggest_component_installer.cc
index 87b64e6a..0063574 100644
--- a/components/component_updater/installer_policies/on_device_head_suggest_component_installer.cc
+++ b/components/component_updater/installer_policies/on_device_head_suggest_component_installer.cc
@@ -77,7 +77,7 @@
 }
 
 bool OnDeviceHeadSuggestInstallerPolicy::RequiresNetworkEncryption() const {
-  return true;
+  return false;
 }
 
 update_client::CrxInstaller::Result
diff --git a/components/cronet/android/cronet_url_request_context_adapter.cc b/components/cronet/android/cronet_url_request_context_adapter.cc
index 7a38432..53f67e5 100644
--- a/components/cronet/android/cronet_url_request_context_adapter.cc
+++ b/components/cronet/android/cronet_url_request_context_adapter.cc
@@ -26,6 +26,7 @@
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/components/cronet/url_request_context_config_unittest.cc b/components/cronet/url_request_context_config_unittest.cc
index 6cd9d98..1e3cd5b 100644
--- a/components/cronet/url_request_context_config_unittest.cc
+++ b/components/cronet/url_request_context_config_unittest.cc
@@ -67,8 +67,9 @@
   options.SetPath({"QUIC", "connection_options"}, base::Value("TIME,TBBR,REJ"));
   options.SetPath(
       {"QUIC", "set_quic_flags"},
-      base::Value("FLAGS_quic_reloadable_flag_quic_enable_version_t050=true,"
-                  "FLAGS_quic_reloadable_flag_quic_enable_version_t099=true"));
+      base::Value(
+          "FLAGS_quic_reloadable_flag_quic_enable_version_t050=true,"
+          "FLAGS_quic_reloadable_flag_quic_enable_version_draft_27=true"));
   options.SetPath({"AsyncDNS", "enable"}, base::Value(true));
   options.SetPath({"NetworkErrorLogging", "enable"}, base::Value(true));
   options.SetPath({"NetworkErrorLogging", "preloaded_report_to_headers"},
@@ -141,7 +142,7 @@
 
   // Initialize QUIC flags set by the config.
   FLAGS_quic_reloadable_flag_quic_enable_version_t050 = false;
-  FLAGS_quic_reloadable_flag_quic_enable_version_t099 = false;
+  FLAGS_quic_reloadable_flag_quic_enable_version_draft_27 = false;
 
   URLRequestContextConfig config(
       // Enable QUIC.
@@ -193,7 +194,7 @@
   EXPECT_EQ(quic_connection_options, quic_params->connection_options);
 
   EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_enable_version_t050);
-  EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_enable_version_t099);
+  EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_enable_version_draft_27);
 
   // Check Custom QUIC User Agent Id.
   EXPECT_EQ("Custom QUIC UAID", quic_params->user_agent_id);
diff --git a/components/domain_reliability/monitor_unittest.cc b/components/domain_reliability/monitor_unittest.cc
index efbb9f27..16b758a 100644
--- a/components/domain_reliability/monitor_unittest.cc
+++ b/components/domain_reliability/monitor_unittest.cc
@@ -13,6 +13,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/strings/string_piece.h"
 #include "base/test/test_simple_task_runner.h"
 #include "components/domain_reliability/baked_in_configs.h"
diff --git a/components/download/internal/common/download_item_impl_delegate.cc b/components/download/internal/common/download_item_impl_delegate.cc
index ea06237..51ec22d 100644
--- a/components/download/internal/common/download_item_impl_delegate.cc
+++ b/components/download/internal/common/download_item_impl_delegate.cc
@@ -4,6 +4,7 @@
 
 #include "components/download/public/common/download_item_impl_delegate.h"
 
+#include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "build/build_config.h"
 #include "components/download/public/common/auto_resumption_handler.h"
diff --git a/components/download/internal/common/download_item_impl_unittest.cc b/components/download/internal/common/download_item_impl_unittest.cc
index 4ee8a1a..9c7ccba 100644
--- a/components/download/internal/common/download_item_impl_unittest.cc
+++ b/components/download/internal/common/download_item_impl_unittest.cc
@@ -13,6 +13,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/containers/circular_deque.h"
 #include "base/containers/queue.h"
diff --git a/components/exo/surface.cc b/components/exo/surface.cc
index d16b771..2aac8ec 100644
--- a/components/exo/surface.cc
+++ b/components/exo/surface.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "ash/public/cpp/shell_window_ids.h"
+#include "base/bind_helpers.h"
 #include "base/callback_helpers.h"
 #include "base/containers/adapters.h"
 #include "base/logging.h"
diff --git a/components/favicon/core/history_ui_favicon_request_handler_impl.cc b/components/favicon/core/history_ui_favicon_request_handler_impl.cc
index c1835bd..c112f4a 100644
--- a/components/favicon/core/history_ui_favicon_request_handler_impl.cc
+++ b/components/favicon/core/history_ui_favicon_request_handler_impl.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "components/favicon/core/favicon_service.h"
diff --git a/components/gc/core/page_memory.cc b/components/gc/core/page_memory.cc
index 746c724..7d7e2e9 100644
--- a/components/gc/core/page_memory.cc
+++ b/components/gc/core/page_memory.cc
@@ -5,7 +5,6 @@
 #include "components/gc/core/page_memory.h"
 
 #include "base/bits.h"
-#include "base/memory/ptr_util.h"
 #include "components/gc/core/globals.h"
 
 namespace gc {
@@ -32,14 +31,21 @@
   }
 }
 
-MemoryRegion GuardMemoryRegion(const MemoryRegion overall_page_region) {
-  // Always add guard pages, independently of whether they are actually
-  // protected or not.
-  MemoryRegion writeable_page_region(
-      overall_page_region.base() + kGuardPageSize,
-      overall_page_region.size() - 2 * kGuardPageSize);
-  DCHECK(overall_page_region.Contains(writeable_page_region));
-  return writeable_page_region;
+void Protect(PageAllocator* allocator, const PageMemory& page_memory) {
+  if (SupportsCommittingGuardPages(allocator)) {
+    // Swap the same region, providing the OS with a chance for fast lookup and
+    // change.
+    CHECK(allocator->SetPermissions(page_memory.writeable_region().base(),
+                                    page_memory.writeable_region().size(),
+                                    PageAllocator::Permission::kNoAccess));
+  } else {
+    // See Unprotect().
+    CHECK_EQ(0u,
+             page_memory.overall_region().size() % allocator->CommitPageSize());
+    CHECK(allocator->SetPermissions(page_memory.overall_region().base(),
+                                    page_memory.overall_region().size(),
+                                    PageAllocator::Permission::kNoAccess));
+  }
 }
 
 MemoryRegion ReserveMemoryRegion(PageAllocator* allocator,
@@ -53,6 +59,11 @@
   return reserved_region;
 }
 
+void FreeMemoryRegion(PageAllocator* allocator,
+                      const MemoryRegion& reserved_region) {
+  allocator->FreePages(reserved_region.base(), reserved_region.size());
+}
+
 }  // namespace
 
 PageMemoryRegion::PageMemoryRegion(PageAllocator* allocator,
@@ -63,9 +74,12 @@
       is_large_(is_large) {}
 
 PageMemoryRegion::~PageMemoryRegion() {
-  allocator_->FreePages(reserved_region().base(), reserved_region().size());
+  FreeMemoryRegion(allocator_, reserved_region());
 }
 
+// static
+constexpr size_t NormalPageMemoryRegion::kNumPageRegions;
+
 NormalPageMemoryRegion::NormalPageMemoryRegion(PageAllocator* allocator)
     : PageMemoryRegion(
           allocator,
@@ -73,21 +87,30 @@
                               base::bits::Align(kPageSize * kNumPageRegions,
                                                 allocator->AllocatePageSize())),
           false) {
+#ifdef DEBUG
   for (size_t i = 0; i < kNumPageRegions; ++i) {
-    const MemoryRegion overall_page_region(
-        reserved_region_.base() + i * kPageSize, kPageSize);
-    DCHECK(reserved_region_.Contains(overall_page_region));
-    const MemoryRegion writeable_page_region =
-        GuardMemoryRegion(overall_page_region);
-    page_memories_[i] = PageMemory(overall_page_region, writeable_page_region);
+    DCHECK_EQ(false, page_memories_in_use_[i]);
   }
+#endif  // DEBUG
 }
 
 NormalPageMemoryRegion::~NormalPageMemoryRegion() = default;
 
+void NormalPageMemoryRegion::Allocate(Address writeable_base) {
+  const size_t index = GetIndex(writeable_base);
+  ChangeUsed(index, true);
+  Unprotect(allocator_, GetPageMemory(index));
+}
+
+void NormalPageMemoryRegion::Free(Address writeable_base) {
+  const size_t index = GetIndex(writeable_base);
+  ChangeUsed(index, false);
+  Protect(allocator_, GetPageMemory(index));
+}
+
 void NormalPageMemoryRegion::UnprotectForTesting() {
   for (size_t i = 0; i < kNumPageRegions; ++i) {
-    Unprotect(allocator_, page_memories_[i]);
+    Unprotect(allocator_, GetPageMemory(i));
   }
 }
 
@@ -98,16 +121,88 @@
           ReserveMemoryRegion(allocator,
                               base::bits::Align(length + 2 * kGuardPageSize,
                                                 allocator->AllocatePageSize())),
-          true) {
-  const MemoryRegion writeable_page_region =
-      GuardMemoryRegion(reserved_region_);
-  page_memory_ = PageMemory(reserved_region_, writeable_page_region);
-}
+          true) {}
 
 LargePageMemoryRegion::~LargePageMemoryRegion() = default;
 
 void LargePageMemoryRegion::UnprotectForTesting() {
-  Unprotect(allocator_, page_memory_);
+  Unprotect(allocator_, GetPageMemory());
+}
+
+PageMemoryRegionTree::PageMemoryRegionTree() = default;
+
+PageMemoryRegionTree::~PageMemoryRegionTree() = default;
+
+void PageMemoryRegionTree::Add(PageMemoryRegion* region) {
+  DCHECK(region);
+  auto result = set_.emplace(region->reserved_region().base(), region);
+  DCHECK(result.second);
+}
+
+void PageMemoryRegionTree::Remove(PageMemoryRegion* region) {
+  DCHECK(region);
+  auto size = set_.erase(region->reserved_region().base());
+  DCHECK_EQ(1u, size);
+}
+
+NormalPageMemoryPool::NormalPageMemoryPool() = default;
+
+NormalPageMemoryPool::~NormalPageMemoryPool() = default;
+
+void NormalPageMemoryPool::Add(Address writeable_base) {
+  pool_.push_back(writeable_base);
+}
+
+Address NormalPageMemoryPool::Take() {
+  if (pool_.empty())
+    return nullptr;
+  Address writeable_base = pool_.back();
+  pool_.pop_back();
+  return writeable_base;
+}
+
+PageBackend::PageBackend(PageAllocator* allocator) : allocator_(allocator) {}
+
+PageBackend::~PageBackend() = default;
+
+Address PageBackend::AllocateNormalPageMemory() {
+  Address writeable_base = page_pool_.Take();
+  if (!writeable_base) {
+    auto pmr = std::make_unique<NormalPageMemoryRegion>(allocator_);
+    for (size_t i = 0; i < NormalPageMemoryRegion::kNumPageRegions; ++i) {
+      page_pool_.Add(pmr->GetPageMemory(i).writeable_region().base());
+    }
+    page_memory_region_tree_.Add(pmr.get());
+    normal_page_memory_regions_.push_back(std::move(pmr));
+    return AllocateNormalPageMemory();
+  }
+  static_cast<NormalPageMemoryRegion*>(
+      page_memory_region_tree_.Lookup(writeable_base))
+      ->Allocate(writeable_base);
+  return writeable_base;
+}
+
+void PageBackend::FreeNormalPageMemory(Address writeable_base) {
+  static_cast<NormalPageMemoryRegion*>(
+      page_memory_region_tree_.Lookup(writeable_base))
+      ->Free(writeable_base);
+  page_pool_.Add(writeable_base);
+}
+
+Address PageBackend::AllocateLargePageMemory(size_t size) {
+  auto pmr = std::make_unique<LargePageMemoryRegion>(allocator_, size);
+  const PageMemory pm = pmr->GetPageMemory();
+  Unprotect(allocator_, pm);
+  page_memory_region_tree_.Add(pmr.get());
+  large_page_memory_regions_.insert({pmr.get(), std::move(pmr)});
+  return pm.writeable_region().base();
+}
+
+void PageBackend::FreeLargePageMemory(Address writeable_base) {
+  PageMemoryRegion* pmr = page_memory_region_tree_.Lookup(writeable_base);
+  page_memory_region_tree_.Remove(pmr);
+  auto size = large_page_memory_regions_.erase(pmr);
+  DCHECK_EQ(1u, size);
 }
 
 }  // namespace internal
diff --git a/components/gc/core/page_memory.h b/components/gc/core/page_memory.h
index e19230d6..7a451c4 100644
--- a/components/gc/core/page_memory.h
+++ b/components/gc/core/page_memory.h
@@ -7,7 +7,9 @@
 
 #include <array>
 #include <memory>
+#include <unordered_map>
 
+#include "base/containers/flat_map.h"
 #include "base/logging.h"
 #include "components/gc/core/gc_export.h"
 #include "components/gc/core/globals.h"
@@ -51,14 +53,13 @@
 // PageMemory provides the backing of a single normal or large page.
 class GC_EXPORT PageMemory final {
  public:
-  PageMemory() = default;
-  PageMemory(MemoryRegion overall, MemoryRegion writable)
-      : overall_(overall), writable_(writable) {
-    DCHECK(overall.Contains(writable));
+  PageMemory(MemoryRegion overall, MemoryRegion writeable)
+      : overall_(overall), writable_(writeable) {
+    DCHECK(overall.Contains(writeable));
   }
 
-  const MemoryRegion overall_region() const { return overall_; }
   const MemoryRegion writeable_region() const { return writable_; }
+  const MemoryRegion overall_region() const { return overall_; }
 
  private:
   MemoryRegion overall_;
@@ -69,11 +70,15 @@
  public:
   virtual ~PageMemoryRegion();
 
-  MemoryRegion reserved_region() const { return reserved_region_; }
-
+  const MemoryRegion reserved_region() const { return reserved_region_; }
   bool is_large() const { return is_large_; }
 
-  // Disallow copy.
+  // Lookup writeable base for an |address| that's contained in
+  // PageMemoryRegion. Filters out addresses that are contained in non-writeable
+  // regions (e.g. guard pages).
+  inline Address Lookup(Address address) const;
+
+  // Disallow copy/move.
   PageMemoryRegion(const PageMemoryRegion&) = delete;
   PageMemoryRegion& operator=(const PageMemoryRegion&) = delete;
 
@@ -95,13 +100,40 @@
   explicit NormalPageMemoryRegion(PageAllocator*);
   ~NormalPageMemoryRegion() override;
 
-  const PageMemory* begin() { return page_memories_.cbegin(); }
-  const PageMemory* end() { return page_memories_.cend(); }
+  const PageMemory GetPageMemory(size_t index) const {
+    DCHECK_LT(index, kNumPageRegions);
+    return PageMemory(
+        MemoryRegion(reserved_region().base() + kPageSize * index, kPageSize),
+        MemoryRegion(
+            reserved_region().base() + kPageSize * index + kGuardPageSize,
+            kPageSize - 2 * kGuardPageSize));
+  }
+
+  // Allocates a normal page at |writeable_base| address. Changes page
+  // protection.
+  void Allocate(Address writeable_base);
+
+  // Frees a normal page at at |writeable_base| address. Changes page
+  // protection.
+  void Free(Address);
+
+  inline Address Lookup(Address) const;
 
   void UnprotectForTesting() final;
 
  private:
-  std::array<PageMemory, kNumPageRegions> page_memories_ = {};
+  void ChangeUsed(size_t index, bool value) {
+    DCHECK_LT(index, kNumPageRegions);
+    DCHECK_EQ(value, !page_memories_in_use_[index]);
+    page_memories_in_use_[index] = value;
+  }
+
+  size_t GetIndex(Address address) const {
+    return static_cast<size_t>(address - reserved_region().base()) >>
+           kPageSizeLog2;
+  }
+
+  std::array<bool, kNumPageRegions> page_memories_in_use_ = {};
 };
 
 // LargePageMemoryRegion serves a single large PageMemory object.
@@ -110,14 +142,137 @@
   LargePageMemoryRegion(PageAllocator*, size_t);
   ~LargePageMemoryRegion() override;
 
-  const PageMemory* page_memory() const { return &page_memory_; }
+  const PageMemory GetPageMemory() const {
+    return PageMemory(
+        MemoryRegion(reserved_region().base(), reserved_region().size()),
+        MemoryRegion(reserved_region().base() + kGuardPageSize,
+                     reserved_region().size() - 2 * kGuardPageSize));
+  }
+
+  inline Address Lookup(Address) const;
 
   void UnprotectForTesting() final;
+};
+
+// A PageMemoryRegionTree is a binary search tree of PageMemoryRegions sorted
+// by reserved base addresses.
+//
+// The tree does not keep its elements alive but merely provides indexing
+// capabilities.
+class GC_EXPORT PageMemoryRegionTree final {
+ public:
+  PageMemoryRegionTree();
+  ~PageMemoryRegionTree();
+
+  void Add(PageMemoryRegion*);
+  void Remove(PageMemoryRegion*);
+
+  inline PageMemoryRegion* Lookup(Address) const;
 
  private:
-  PageMemory page_memory_;
+  // Using flat_map allows to improve locality to minimize cache misses and
+  // balance binary lookup.
+  base::flat_map<Address, PageMemoryRegion*> set_;
 };
 
+// A pool of PageMemory objects represented by the writeable base addresses.
+//
+// The pool does not keep its elements alive but merely provides pooling
+// capabilities.
+class GC_EXPORT NormalPageMemoryPool final {
+ public:
+  NormalPageMemoryPool();
+  ~NormalPageMemoryPool();
+
+  void Add(Address);
+  Address Take();
+
+ private:
+  std::vector<Address> pool_;
+};
+
+// A backend that is used for allocating and freeing normal and large pages.
+//
+// Internally maintaints a set of PageMemoryRegions. The backend keeps its used
+// regions alive.
+class GC_EXPORT PageBackend final {
+ public:
+  explicit PageBackend(PageAllocator*);
+  ~PageBackend();
+
+  // Allocates a normal page from the backend.
+  //
+  // Returns the writeable base of the region.
+  Address AllocateNormalPageMemory();
+
+  // Returns normal page memory back to the backend. Expects the
+  // |writeable_base| returned by |AllocateNormalMemory()|.
+  void FreeNormalPageMemory(Address writeable_base);
+
+  // Allocates a large page from the backend.
+  //
+  // Returns the writeable base of the region.
+  Address AllocateLargePageMemory(size_t size);
+
+  // Returns large page memory back to the backend. Expects the |writeable_base|
+  // returned by |AllocateLargePageMemory()|.
+  void FreeLargePageMemory(Address writeable_base);
+
+  // Returns the writeable base if |address| is contained in a valid page
+  // memory.
+  inline Address Lookup(Address) const;
+
+  // Disallow copy/move.
+  PageBackend(const PageBackend&) = delete;
+  PageBackend& operator=(const PageBackend&) = delete;
+
+ private:
+  PageAllocator* allocator_;
+  NormalPageMemoryPool page_pool_;
+  PageMemoryRegionTree page_memory_region_tree_;
+  std::vector<std::unique_ptr<PageMemoryRegion>> normal_page_memory_regions_;
+  std::unordered_map<PageMemoryRegion*, std::unique_ptr<PageMemoryRegion>>
+      large_page_memory_regions_;
+};
+
+Address NormalPageMemoryRegion::Lookup(Address address) const {
+  size_t index = GetIndex(address);
+  if (!page_memories_in_use_[index])
+    return nullptr;
+  const MemoryRegion writeable_region = GetPageMemory(index).writeable_region();
+  return writeable_region.Contains(address) ? writeable_region.base() : nullptr;
+}
+
+Address LargePageMemoryRegion::Lookup(Address address) const {
+  const MemoryRegion writeable_region = GetPageMemory().writeable_region();
+  return writeable_region.Contains(address) ? writeable_region.base() : nullptr;
+}
+
+Address PageMemoryRegion::Lookup(Address address) const {
+  DCHECK(reserved_region().Contains(address));
+  return is_large()
+             ? static_cast<const LargePageMemoryRegion*>(this)->Lookup(address)
+             : static_cast<const NormalPageMemoryRegion*>(this)->Lookup(
+                   address);
+}
+
+PageMemoryRegion* PageMemoryRegionTree::Lookup(Address address) const {
+  auto it = set_.upper_bound(address);
+  // This check also covers set_.size() > 0, since for empty vectors it is
+  // guaranteed that begin() == end().
+  if (it == set_.begin())
+    return nullptr;
+  auto* result = std::next(it, -1)->second;
+  if (address < result->reserved_region().end())
+    return result;
+  return nullptr;
+}
+
+Address PageBackend::Lookup(Address address) const {
+  PageMemoryRegion* pmr = page_memory_region_tree_.Lookup(address);
+  return pmr ? pmr->Lookup(address) : nullptr;
+}
+
 }  // namespace internal
 }  // namespace gc
 
diff --git a/components/gc/core/page_memory_test.cc b/components/gc/core/page_memory_test.cc
index fc73c81..61fd34a 100644
--- a/components/gc/core/page_memory_test.cc
+++ b/components/gc/core/page_memory_test.cc
@@ -2,9 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/gc/core/page_memory.h"
+#include <iterator>
 
 #include "build/build_config.h"
+#include "components/gc/core/page_memory.h"
 #include "components/gc/test/base_allocator.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -15,11 +16,10 @@
 TEST(PageMemoryRegionTest, NormalPageMemoryRegion) {
   gc::test::BaseAllocator allocator;
   auto pmr = std::make_unique<NormalPageMemoryRegion>(&allocator);
-  constexpr size_t kExpectedPageMemories = 10;
-  size_t page_memory_cnt = 0;
+  pmr->UnprotectForTesting();
   MemoryRegion prev_overall;
-  for (auto& pm : *pmr) {
-    page_memory_cnt++;
+  for (size_t i = 0; i < NormalPageMemoryRegion::kNumPageRegions; ++i) {
+    const PageMemory pm = pmr->GetPageMemory(i);
     // Previous PageMemory aligns with the current one.
     if (prev_overall.base()) {
       EXPECT_EQ(prev_overall.end(), pm.overall_region().base());
@@ -28,7 +28,8 @@
         MemoryRegion(pm.overall_region().base(), pm.overall_region().size());
     // Writeable region is contained in overall region.
     EXPECT_TRUE(pm.overall_region().Contains(pm.writeable_region()));
-
+    EXPECT_EQ(0u, pm.writeable_region().base()[0]);
+    EXPECT_EQ(0u, pm.writeable_region().end()[-1]);
     // Front guard page.
     EXPECT_EQ(pm.writeable_region().base(),
               pm.overall_region().base() + kGuardPageSize);
@@ -36,18 +37,16 @@
     EXPECT_EQ(pm.overall_region().end(),
               pm.writeable_region().end() + kGuardPageSize);
   }
-  EXPECT_EQ(kExpectedPageMemories, page_memory_cnt);
 }
 
 TEST(PageMemoryRegionTest, LargePageMemoryRegion) {
   gc::test::BaseAllocator allocator;
   auto pmr = std::make_unique<LargePageMemoryRegion>(&allocator, 1024);
   pmr->UnprotectForTesting();
-  // Only one PageMemory.
-  const auto* pm = pmr->page_memory();
-  EXPECT_LE(1024u, pm->writeable_region().size());
-  EXPECT_EQ(0u, pm->writeable_region().base()[0]);
-  EXPECT_EQ(0u, pm->writeable_region().end()[-1]);
+  const PageMemory pm = pmr->GetPageMemory();
+  EXPECT_LE(1024u, pm.writeable_region().size());
+  EXPECT_EQ(0u, pm.writeable_region().base()[0]);
+  EXPECT_EQ(0u, pm.writeable_region().end()[-1]);
 }
 
 TEST(PageMemoryRegionTest, PlatformUsesGuardPages) {
@@ -81,7 +80,7 @@
   gc::test::BaseAllocator allocator;
   auto pmr = std::make_unique<NormalPageMemoryRegion>(&allocator);
   if (SupportsCommittingGuardPages(&allocator)) {
-    EXPECT_DEATH(access(pmr->begin()->overall_region().base()[0]), "");
+    EXPECT_DEATH(access(pmr->GetPageMemory(0).overall_region().base()[0]), "");
   }
 }
 
@@ -89,10 +88,133 @@
   gc::test::BaseAllocator allocator;
   auto pmr = std::make_unique<NormalPageMemoryRegion>(&allocator);
   if (SupportsCommittingGuardPages(&allocator)) {
-    EXPECT_DEATH(access(pmr->begin()->writeable_region().end()[0]), "");
+    EXPECT_DEATH(access(pmr->GetPageMemory(0).writeable_region().end()[0]), "");
   }
 }
 
+TEST(PageMemoryRegionTreeTest, AddNormalLookupRemove) {
+  gc::test::BaseAllocator allocator;
+  auto pmr = std::make_unique<NormalPageMemoryRegion>(&allocator);
+  PageMemoryRegionTree tree;
+  tree.Add(pmr.get());
+  ASSERT_EQ(pmr.get(), tree.Lookup(pmr->reserved_region().base()));
+  ASSERT_EQ(pmr.get(), tree.Lookup(pmr->reserved_region().end() - 1));
+  ASSERT_EQ(nullptr, tree.Lookup(pmr->reserved_region().base() - 1));
+  ASSERT_EQ(nullptr, tree.Lookup(pmr->reserved_region().end()));
+  tree.Remove(pmr.get());
+  ASSERT_EQ(nullptr, tree.Lookup(pmr->reserved_region().base()));
+  ASSERT_EQ(nullptr, tree.Lookup(pmr->reserved_region().end() - 1));
+}
+
+TEST(PageMemoryRegionTreeTest, AddLargeLookupRemove) {
+  gc::test::BaseAllocator allocator;
+  constexpr size_t kLargeSize = 5012;
+  auto pmr = std::make_unique<LargePageMemoryRegion>(&allocator, kLargeSize);
+  PageMemoryRegionTree tree;
+  tree.Add(pmr.get());
+  ASSERT_EQ(pmr.get(), tree.Lookup(pmr->reserved_region().base()));
+  ASSERT_EQ(pmr.get(), tree.Lookup(pmr->reserved_region().end() - 1));
+  ASSERT_EQ(nullptr, tree.Lookup(pmr->reserved_region().base() - 1));
+  ASSERT_EQ(nullptr, tree.Lookup(pmr->reserved_region().end()));
+  tree.Remove(pmr.get());
+  ASSERT_EQ(nullptr, tree.Lookup(pmr->reserved_region().base()));
+  ASSERT_EQ(nullptr, tree.Lookup(pmr->reserved_region().end() - 1));
+}
+
+TEST(PageMemoryRegionTreeTest, AddLookupRemoveMultiple) {
+  gc::test::BaseAllocator allocator;
+  auto pmr1 = std::make_unique<NormalPageMemoryRegion>(&allocator);
+  constexpr size_t kLargeSize = 3127;
+  auto pmr2 = std::make_unique<LargePageMemoryRegion>(&allocator, kLargeSize);
+  PageMemoryRegionTree tree;
+  tree.Add(pmr1.get());
+  tree.Add(pmr2.get());
+  ASSERT_EQ(pmr1.get(), tree.Lookup(pmr1->reserved_region().base()));
+  ASSERT_EQ(pmr1.get(), tree.Lookup(pmr1->reserved_region().end() - 1));
+  ASSERT_EQ(pmr2.get(), tree.Lookup(pmr2->reserved_region().base()));
+  ASSERT_EQ(pmr2.get(), tree.Lookup(pmr2->reserved_region().end() - 1));
+  tree.Remove(pmr1.get());
+  ASSERT_EQ(pmr2.get(), tree.Lookup(pmr2->reserved_region().base()));
+  ASSERT_EQ(pmr2.get(), tree.Lookup(pmr2->reserved_region().end() - 1));
+  tree.Remove(pmr2.get());
+  ASSERT_EQ(nullptr, tree.Lookup(pmr2->reserved_region().base()));
+  ASSERT_EQ(nullptr, tree.Lookup(pmr2->reserved_region().end() - 1));
+}
+
+TEST(NormalPageMemoryPool, ConstructorEmpty) {
+  gc::test::BaseAllocator allocator;
+  NormalPageMemoryPool pool;
+  EXPECT_EQ(nullptr, pool.Take());
+}
+
+TEST(NormalPageMemoryPool, AddTakeSameBucket) {
+  gc::test::BaseAllocator allocator;
+  auto pmr = std::make_unique<NormalPageMemoryRegion>(&allocator);
+  const PageMemory pm = pmr->GetPageMemory(0);
+  NormalPageMemoryPool pool;
+  pool.Add(pm.writeable_region().base());
+  EXPECT_EQ(pm.writeable_region().base(), pool.Take());
+}
+
+TEST(PageBackendTest, AllocateNormalUsesPool) {
+  gc::test::BaseAllocator allocator;
+  PageBackend backend(&allocator);
+  Address writeable_base1 = backend.AllocateNormalPageMemory();
+  EXPECT_NE(nullptr, writeable_base1);
+  backend.FreeNormalPageMemory(writeable_base1);
+  Address writeable_base2 = backend.AllocateNormalPageMemory();
+  EXPECT_NE(nullptr, writeable_base2);
+  EXPECT_EQ(writeable_base1, writeable_base2);
+}
+
+TEST(PageBackendTest, AllocateLarge) {
+  gc::test::BaseAllocator allocator;
+  PageBackend backend(&allocator);
+  Address writeable_base1 = backend.AllocateLargePageMemory(13731);
+  EXPECT_NE(nullptr, writeable_base1);
+  Address writeable_base2 = backend.AllocateLargePageMemory(9478);
+  EXPECT_NE(nullptr, writeable_base2);
+  EXPECT_NE(writeable_base1, writeable_base2);
+  backend.FreeLargePageMemory(writeable_base1);
+  backend.FreeLargePageMemory(writeable_base2);
+}
+
+TEST(PageBackendTest, LookupNormal) {
+  gc::test::BaseAllocator allocator;
+  PageBackend backend(&allocator);
+  Address writeable_base = backend.AllocateNormalPageMemory();
+  EXPECT_EQ(nullptr, backend.Lookup(writeable_base - kGuardPageSize));
+  EXPECT_EQ(nullptr, backend.Lookup(writeable_base - 1));
+  EXPECT_EQ(writeable_base, backend.Lookup(writeable_base));
+  EXPECT_EQ(writeable_base, backend.Lookup(writeable_base + kPageSize -
+                                           2 * kGuardPageSize - 1));
+  EXPECT_EQ(nullptr,
+            backend.Lookup(writeable_base + kPageSize - 2 * kGuardPageSize));
+  EXPECT_EQ(nullptr,
+            backend.Lookup(writeable_base - kGuardPageSize + kPageSize - 1));
+}
+
+TEST(PageBackendTest, LookupLarge) {
+  gc::test::BaseAllocator allocator;
+  PageBackend backend(&allocator);
+  constexpr size_t kSize = 7934;
+  Address writeable_base = backend.AllocateLargePageMemory(kSize);
+  EXPECT_EQ(nullptr, backend.Lookup(writeable_base - kGuardPageSize));
+  EXPECT_EQ(nullptr, backend.Lookup(writeable_base - 1));
+  EXPECT_EQ(writeable_base, backend.Lookup(writeable_base));
+  EXPECT_EQ(writeable_base, backend.Lookup(writeable_base + kSize - 1));
+}
+
+TEST(PageBackendDeathTest, DestructingBackendDestroysPageMemory) {
+  gc::test::BaseAllocator allocator;
+  Address base;
+  {
+    PageBackend backend(&allocator);
+    base = backend.AllocateNormalPageMemory();
+  }
+  EXPECT_DEATH(access(base[0]), "");
+}
+
 }  // namespace test
 }  // namespace internal
 }  // namespace gc
diff --git a/components/grpc_support/bidirectional_stream.cc b/components/grpc_support/bidirectional_stream.cc
index defabbf7..2ba28c2 100644
--- a/components/grpc_support/bidirectional_stream.cc
+++ b/components/grpc_support/bidirectional_stream.cc
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
diff --git a/components/guest_view/browser/guest_view_base.cc b/components/guest_view/browser/guest_view_base.cc
index 91fb67de..e53c0014 100644
--- a/components/guest_view/browser/guest_view_base.cc
+++ b/components/guest_view/browser/guest_view_base.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/lazy_instance.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/guest_view/browser/guest_view_event.h"
 #include "components/guest_view/browser/guest_view_manager.h"
diff --git a/components/heap_profiling/supervisor.cc b/components/heap_profiling/supervisor.cc
index c0f7e51..734e92a 100644
--- a/components/heap_profiling/supervisor.cc
+++ b/components/heap_profiling/supervisor.cc
@@ -5,6 +5,7 @@
 #include "components/heap_profiling/supervisor.h"
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/no_destructor.h"
 #include "base/task/post_task.h"
diff --git a/components/invalidation/impl/README.md b/components/invalidation/impl/README.md
index 3a57ff5..604200d 100644
--- a/components/invalidation/impl/README.md
+++ b/components/invalidation/impl/README.md
@@ -1,6 +1,6 @@
 # Invalidations Component
 
-### Introduction
+## Introduction
 Let's start with an example.  On Chrome OS there exists a concept called
 "policy" - one can think of them as dynamic flags that change Chrome's
 behaviour.  They are changed on the Admin Panel from where they get propagated
@@ -22,157 +22,128 @@
 invalidation related interaction between client device and server is done
 through Invalidation Service.
 
-**Invalidation** (message to invalidate some object) is sent and received using
-a publish/subscribe service. We have a couple of those publish/subscribe
-services, some of which are Tango - [go/tango](http://go/tango) and Fandango -
-[go/fandango](http://go/fandango).
+An **Invalidation** (a message to invalidate some object) is sent and received
+using a publish/subscribe service. In practice, this is Firebase Cloud Messaging
+(FCM, see
+[firebase.google.com/docs/cloud-messaging](https://firebase.google.com/docs/cloud-messaging)
+or [go/fcm](http://go/fcm)) and Fandango (see
+[go/fandango](http://go/fandango)).
 
 In general the whole thing looks as follows:
 ![Invalidations component UML](../images/InvalidationService.png)
 
 ***
 
+## Terminology
+
+* **InstanceID**: An identifier for "a specific app installed on a specific
+  device". The term comes from GMSCore on Android. Here, an "app" is a client of
+  invalidations, such as Sync, Drive, or Policy. It's just a mostly random
+  string of 8 bytes, created by Chrome.
+* **Registration**: As in "registering with FCM"; means making an InstanceID
+  known to the FCM server. The result of registering is an **InstanceID token**
+  (note that this is different from an InstanceID).
+* **Topic**: A "namespace" or "channel" of messages that clients can subscribe
+  to. For Sync, they correspond to data types. A topic can be either private
+  (i.e. GAIA-keyed) or public. For private topics, a unique ID derived from the
+  user's GAIA ID is appended to the topic name to make it unique (though this
+  is an implementation detail which is hidden from clients).
+* **Subscription**: As in "subscribing to a topic", i.e. telling the server that
+  this client (identified by InstanceID token) is interested in a given topic.
+* **ProjectID** (aka **SenderID**): An ID from the Google Cloud Platform console
+  that identifies a client of invalidations (such as Sync, Drive, or Policy).
+  E.g. for Sync its value is kInvalidationGCMSenderId. Note that (as opposed to
+  InstanceID) this is constant across all users and Chrome instances.
+
+***
+
+## Classes
+
 ### InvalidationHandler
 
-**InvalidationHandler** - is a client of InvalidationService (see below).
-Everyone who wants to use InvalidationService to receive Invalidation
-(notification of change in some object) needs to implement
-**InvalidationHandler** to receive those messages. **InvalidationHandler** has
-the following methods (the list is not full):
+An **InvalidationHandler** is a client (receiver) of Invalidations. Every
+feature that wants to receive Invalidations needs to implement an
+InvalidationHandler and register it with InvalidationService (see below).
+InvalidationHandler has the following methods (the list is not exhaustive):
 
-* **OnIncomingInvalidation** - is called from InvalidationService to notify
-about incoming Invalidation.
-
-At the end of documentation, one can find the additional material for adding
-**InvalidationHandler**.
+* **OnIncomingInvalidation** is called from InvalidationService to notify
+about incoming Invalidation messages.
+* **GetOwnerName** must return a unique name for this InvalidationHandler.
 
 ***
 
 ### InvalidationService
 
-Class **InvalidationService** is just an interface which provides the following
-methods (the list is not exhaustive).
+**InvalidationService** is the main entry point for clients of the Invalidations
+system. This is where an InvalidationHandler registers/unregisters itself, and
+where it registers the Topics it is interested in. When a message arrives,
+InvalidationService calls OnIncomingInvalidation for the receiving
+InvalidationHandler.
 
-* **RegisterInvalidationHandler** - allows InvalidationHandler to register
-itself as a observer for Invalidations. **InvalidationService** will only
+InvalidationService provides the following methods (the list is not exhaustive):
+
+* **RegisterInvalidationHandler** allows an InvalidationHandler to register
+itself as a observer for Invalidations. InvalidationService will only
 dispatch messages to registered handlers.
+* **UpdateInterestedTopics** allows InvalidationHandler to change the set of
+Topics it is interested in.
+* **UnregisterInvalidationHandler** lets an InvalidationHandler unregister
+itself again, after which it stops receiving Invalidations.
 
-* **UpdateRegisteredInvalidationIds** - allows InvalidationHandler to change the
-ids of Objects it is interested in receiving Invalidations for.
-
-* **UnregisterInvalidationHandler** - when InvalidationHandler unregisters it
-stops receiving Invalidations.
+An InvalidationService instance is usually tied to a profile (via
+**ProfileInvalidationProviderFactory**), but on ChromeOS there is also a
+device-scoped instance, managed by **AffiliatedInvalidationServiceProvider**
+(used for device policies, which must apply even before any user is signed in).
 
 ***
 
 ### FCMInvalidationService
 
-**FCMInvalidationService** - is the implementation of InvalidationService that
-uses [Fandango](http://go/fandango) as its publish/subscribe service.
-
-**FCMInvalidationService** is the main entry point for InvalidationHandler. This
-is where InvalidationHandler registers/unregisters itself in
-InvalidationService, and registers Objects to invalidate. When a message comes,
-**FCMInvalidationService** calls OnIncomingInvalidation for the receiving
-InvalidationHandler.
-
-Actually **FCMInvalidationService** just provides the abstraction above for
-InvalidationHandler, while in fact it just manages
-InvalidatorRegistrarWithMemory and FCMInvalidationListener, who do the actual
-work.
+**FCMInvalidationService** is the only real (non-test) implementation of
+InvalidationService, using [FCM](http://go/fcm)+[Fandango](http://go/fandango)
+as its publish/subscribe service. It delegates most of the work to
+InvalidatorRegistrarWithMemory and FCMInvalidationListener.
 
 ***
 
 ### InvalidatorRegistrarWithMemory
 
-**InvalidatorRegistrarWithMemory** stores registered InvalidationHandlers,
-stores objects to invalidate and stores mapping between objects and
-InvalidationHandlers to know which InvalidationHandlers are interested in which
-objects. When a message comes from FCMInvalidationListener,
-**InvalidatorRegistrarWithMemory** dispatches that message (Invalidation) to the
-receiving InvalidationHandler.
+**InvalidatorRegistrarWithMemory** maintains the mapping between Topics and
+InvalidationHandlers. When a message arrives via FCMInvalidationListener,
+InvalidatorRegistrarWithMemory dispatches that message (invalidation) to the
+appropriate InvalidationHandler.
+
+InvalidatorRegistrarWithMemory also persists the set of Topics per handler, to
+avoid redundant re-subscriptions after every Chrome restart.
 
 ***
 
 ### FCMInvalidationListener
 
-**FCMInvalidationListener** just gets the list of topics to subscribe from
-FCMInvalidationService, and when **FCMInvalidationListener** receives
-Invalidations on those topics, it just passes them up to FCMInvalidationService.
-
-And again the description above is just a good abstraction of
-**FCMInvalidationListener** for FCMInvalidationService, while in fact
-**FCMInvalidationListener** manages PerUserTopicRegistrationManager and
-FCMNetworkHandler who do the actual work.
+**FCMInvalidationListener** gets the list of interesting Topics from
+FCMInvalidationService. It passes the Topics to PerUserTopicSubscriptionManager
+(see below) for subscription/unsubscription, receives Invalidation messages from
+FCMNetworkHandler, and passes Invalidations for the interesting Topics back to
+FCMInvalidationService.
 
 ***
 
-### PerUserTopicRegistrationManager
+### PerUserTopicSubscriptionManager
 
-**PerUserTopicRegistrationManager** manages subscriptions to topics. Topics in
-this case are objects we are interested in invalidating.
+**PerUserTopicSubscriptionManager** manages subscriptions to Topics, sending
+subscription or unsubscriptions requests to the server as necessary. It persists
+the set of subscribed Topics in prefs to avoid redundant re-subscriptions after
+Chrome restarts.
 
 ***
 
 ### FCMNetworkHandler
 
-**FCMNetworkHandler** is the class responsible for communication via GCM
-channel. Provides the following functionality:
+**FCMNetworkHandler** is responsible for communication via GCM channel. It
+provides the following functionality:
 
-* Retrieves the auth token required for the subscription. When this token is
-received, it is passed to PerUserTopicRegistrationManager which subscribes to
-topics with the given auth token.
-
+* Retrieves the InstanceID token required for the subscription. When this token
+  is received, it is passed to PerUserTopicSubscriptionManager which subscribes
+  to Topics with the given token.
 * Receives messages from GCM driver and passes them up to
-FCMInvalidationListener, where they are converted to Invalidations.
-
-***
-
-### TiclInvalidationService (deprecated)
-
-TiclInvalidationService - is the implementation of InvalidationService that uses
-[Tango](http://go/tango) as its publish/subscribe service.
-
-***
-
-## For those who want to add InvalidationHandler
-
-### Public vs. Private topics
-
-FCMInvalidationService has a different registration process for public and
-private topics. When registering with a public topic, publish/subscribe service
-will fan out all outgoing messages to all devices subscribed to this topic. For
-example: If a device subscribes to "DeviceGuestModeEnabled" public topic all
-instances subscribed to this topic will receive all outgoing messages addressed
-to topic "DeviceGuestModeEnabled". But if 2 devices with different InstanceID
-subscribe to private topic "BOOKMARK", they will receive different set of
-messages addressed to pair ("BOOKMARK", InstanceID) respectively.
-
-### Project Id
-
-In the UML diagram above there are 3 classes that inherit from
-InvalidationHandler:
-
-* SyncEngineImpl
-
-* CloudPolicyInvalidator
-
-* DriveNotificationManager
-
-There is a notion of SenderId which is different for every InvalidationHandler.
-SenderId is used when registering to topics, to receive a topic of a particular
-sender. So for example server side logic of CloudPolicy posts messages using
-SenderId of "1013309121859", and client side logic which is
-CloudPolicyInvalidator should register to topics using the SenderId
-"1013309121859".
-
-### InvalidationService for profile and for device
-
-Usually InvalidationService is bound to a profile which can be spinned up using
-**ProfileInvalidationProviderFactory**, but sometimes there is no profile as in
-the special case of CloudPolicyInvalidator. CloudPolicyInvalidator is interested
-in receiving Invalidations on policies. Chrome OS team defines 2 types of
-policies - User and Device. Device policies should be received even when there
-is no one signed in to a Chrome OS device, thus there is no profile. For this
-reason there is a special class **AffiliatedInvalidationServiceProvider** which
-spawns InvalidationService even when there is no profile.
+  FCMInvalidationListener, where they are converted to Invalidations.
diff --git a/components/invalidation/impl/fcm_invalidation_listener_unittest.cc b/components/invalidation/impl/fcm_invalidation_listener_unittest.cc
index f3f261f..2b037d5 100644
--- a/components/invalidation/impl/fcm_invalidation_listener_unittest.cc
+++ b/components/invalidation/impl/fcm_invalidation_listener_unittest.cc
@@ -7,6 +7,7 @@
 #include <string>
 #include <vector>
 
+#include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/test/task_environment.h"
diff --git a/components/invalidation/impl/per_user_topic_subscription_request.cc b/components/invalidation/impl/per_user_topic_subscription_request.cc
index a4ccacc..fed6f76 100644
--- a/components/invalidation/impl/per_user_topic_subscription_request.cc
+++ b/components/invalidation/impl/per_user_topic_subscription_request.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/json/json_writer.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/stringprintf.h"
 #include "base/values.h"
diff --git a/components/javascript_dialogs/tab_modal_dialog_manager.cc b/components/javascript_dialogs/tab_modal_dialog_manager.cc
index 430db2aa..6499696 100644
--- a/components/javascript_dialogs/tab_modal_dialog_manager.cc
+++ b/components/javascript_dialogs/tab_modal_dialog_manager.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/stringprintf.h"
 #include "components/javascript_dialogs/app_modal_dialog_manager.h"
diff --git a/components/language/content/browser/geo_language_model_unittest.cc b/components/language/content/browser/geo_language_model_unittest.cc
index 77453c8..28287ac6 100644
--- a/components/language/content/browser/geo_language_model_unittest.cc
+++ b/components/language/content/browser/geo_language_model_unittest.cc
@@ -5,6 +5,7 @@
 #include "components/language/content/browser/geo_language_model.h"
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/test/task_environment.h"
 #include "base/timer/timer.h"
diff --git a/components/language/content/browser/geo_language_provider_unittest.cc b/components/language/content/browser/geo_language_provider_unittest.cc
index 247deda2..a5d6aca 100644
--- a/components/language/content/browser/geo_language_provider_unittest.cc
+++ b/components/language/content/browser/geo_language_provider_unittest.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
diff --git a/components/language/ios/browser/ios_language_detection_tab_helper.mm b/components/language/ios/browser/ios_language_detection_tab_helper.mm
index 2026118..a696eef 100644
--- a/components/language/ios/browser/ios_language_detection_tab_helper.mm
+++ b/components/language/ios/browser/ios_language_detection_tab_helper.mm
@@ -4,6 +4,7 @@
 
 #include "components/language/ios/browser/ios_language_detection_tab_helper.h"
 
+#include "base/memory/ptr_util.h"
 #include "components/language/core/browser/url_language_histogram.h"
 #include "components/translate/core/common/language_detection_details.h"
 
diff --git a/components/leveldb_proto/internal/shared_proto_database.cc b/components/leveldb_proto/internal/shared_proto_database.cc
index b34f125..04e1292 100644
--- a/components/leveldb_proto/internal/shared_proto_database.cc
+++ b/components/leveldb_proto/internal/shared_proto_database.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "base/sequenced_task_runner.h"
 #include "base/task/post_task.h"
 #include "base/task/thread_pool.h"
diff --git a/components/leveldb_proto/public/proto_database_provider.h b/components/leveldb_proto/public/proto_database_provider.h
index a6d4e841..7ca2e053 100644
--- a/components/leveldb_proto/public/proto_database_provider.h
+++ b/components/leveldb_proto/public/proto_database_provider.h
@@ -9,6 +9,7 @@
 
 #include "base/component_export.h"
 #include "base/files/file_path.h"
+#include "base/memory/ptr_util.h"
 #include "base/sequenced_task_runner.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/leveldb_proto/internal/proto_database_impl.h"
diff --git a/components/media_message_center/media_notification_view_impl_unittest.cc b/components/media_message_center/media_notification_view_impl_unittest.cc
index 28b7b897..9f331c3 100644
--- a/components/media_message_center/media_notification_view_impl_unittest.cc
+++ b/components/media_message_center/media_notification_view_impl_unittest.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/containers/flat_set.h"
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/components/network_hints/browser/simple_network_hints_handler_impl.cc b/components/network_hints/browser/simple_network_hints_handler_impl.cc
index 45022a96..e48ceaa 100644
--- a/components/network_hints/browser/simple_network_hints_handler_impl.cc
+++ b/components/network_hints/browser/simple_network_hints_handler_impl.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
diff --git a/components/network_session_configurator/OWNERS b/components/network_session_configurator/OWNERS
index 757f464..ed36aa9 100644
--- a/components/network_session_configurator/OWNERS
+++ b/components/network_session_configurator/OWNERS
@@ -1,4 +1,6 @@
 bnc@chromium.org
 rch@chromium.org
 zhongyi@chromium.org
+file://net/OWNERS
+file://net/quic/OWNERS # For QUICHE rolls only.
 # COMPONENT: Internals>Network
diff --git a/components/network_session_configurator/browser/network_session_configurator_unittest.cc b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
index c1a3e7c..cd78812 100644
--- a/components/network_session_configurator/browser/network_session_configurator_unittest.cc
+++ b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
@@ -601,18 +601,18 @@
 
 TEST_F(NetworkSessionConfiguratorTest, QuicFlags) {
   FLAGS_quic_reloadable_flag_quic_enable_version_t050 = false;
-  FLAGS_quic_reloadable_flag_quic_enable_version_t099 = false;
+  FLAGS_quic_reloadable_flag_quic_enable_version_draft_27 = false;
   std::map<std::string, std::string> field_trial_params;
   field_trial_params["set_quic_flags"] =
       "FLAGS_quic_reloadable_flag_quic_enable_version_t050=true,"
-      "FLAGS_quic_reloadable_flag_quic_enable_version_t099=true";
+      "FLAGS_quic_reloadable_flag_quic_enable_version_draft_27=true";
   variations::AssociateVariationParams("QUIC", "Enabled", field_trial_params);
   base::FieldTrialList::CreateFieldTrial("QUIC", "Enabled");
 
   ParseFieldTrials();
 
   EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_enable_version_t050);
-  EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_enable_version_t099);
+  EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_enable_version_draft_27);
 }
 
 TEST_F(NetworkSessionConfiguratorTest, Http2SettingsFromFieldTrialParams) {
diff --git a/components/offline_pages/core/background/pick_request_task_unittest.cc b/components/offline_pages/core/background/pick_request_task_unittest.cc
index 831f091..792437e 100644
--- a/components/offline_pages/core/background/pick_request_task_unittest.cc
+++ b/components/offline_pages/core/background/pick_request_task_unittest.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/containers/circular_deque.h"
 #include "base/time/time.h"
 #include "components/offline_pages/core/background/device_conditions.h"
diff --git a/components/offline_pages/core/model/delete_page_task.cc b/components/offline_pages/core/model/delete_page_task.cc
index 26cfa9ee..3d367ca1 100644
--- a/components/offline_pages/core/model/delete_page_task.cc
+++ b/components/offline_pages/core/model/delete_page_task.cc
@@ -11,6 +11,7 @@
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
diff --git a/components/offline_pages/core/model/store_visuals_task.cc b/components/offline_pages/core/model/store_visuals_task.cc
index 92608dc..94022b1 100644
--- a/components/offline_pages/core/model/store_visuals_task.cc
+++ b/components/offline_pages/core/model/store_visuals_task.cc
@@ -5,6 +5,7 @@
 #include "components/offline_pages/core/model/store_visuals_task.h"
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "components/offline_pages/core/offline_clock.h"
 #include "components/offline_pages/core/offline_page_metadata_store.h"
 #include "components/offline_pages/core/offline_store_utils.h"
diff --git a/components/omnibox/browser/on_device_head_provider.cc b/components/omnibox/browser/on_device_head_provider.cc
index b2009ac..ff49ede 100644
--- a/components/omnibox/browser/on_device_head_provider.cc
+++ b/components/omnibox/browser/on_device_head_provider.cc
@@ -9,6 +9,7 @@
 #include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
 #include "base/i18n/case_conversion.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
diff --git a/components/optimization_guide/optimization_guide_store.cc b/components/optimization_guide/optimization_guide_store.cc
index 61ae686..3f6154ac 100644
--- a/components/optimization_guide/optimization_guide_store.cc
+++ b/components/optimization_guide/optimization_guide_store.cc
@@ -5,6 +5,7 @@
 #include "components/optimization_guide/optimization_guide_store.h"
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/strcat.h"
diff --git a/components/paint_preview/browser/android/paint_preview_utils.cc b/components/paint_preview/browser/android/paint_preview_utils.cc
index 1a4823ed..905ca11 100644
--- a/components/paint_preview/browser/android/paint_preview_utils.cc
+++ b/components/paint_preview/browser/android/paint_preview_utils.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
diff --git a/components/password_manager/core/browser/credential_manager_impl_unittest.cc b/components/password_manager/core/browser/credential_manager_impl_unittest.cc
index 9bef5f8..6697b44 100644
--- a/components/password_manager/core/browser/credential_manager_impl_unittest.cc
+++ b/components/password_manager/core/browser/credential_manager_impl_unittest.cc
@@ -12,6 +12,7 @@
 #include <tuple>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/components/password_manager/core/browser/leak_detection_dialog_utils.h b/components/password_manager/core/browser/leak_detection_dialog_utils.h
index df14e4a..ffdcf96 100644
--- a/components/password_manager/core/browser/leak_detection_dialog_utils.h
+++ b/components/password_manager/core/browser/leak_detection_dialog_utils.h
@@ -10,7 +10,6 @@
 #include "base/macros.h"
 #include "base/strings/string16.h"
 #include "base/util/type_safety/strong_alias.h"
-#include "components/password_manager/core/browser/leak_detection_dialog_utils.h"
 #include "components/password_manager/core/browser/password_manager_metrics_util.h"
 #include "ui/gfx/range/range.h"
 #include "url/gurl.h"
diff --git a/components/password_manager/core/browser/multi_store_password_save_manager.cc b/components/password_manager/core/browser/multi_store_password_save_manager.cc
index 0e8358c..35f0f73 100644
--- a/components/password_manager/core/browser/multi_store_password_save_manager.cc
+++ b/components/password_manager/core/browser/multi_store_password_save_manager.cc
@@ -142,10 +142,23 @@
   // 3. Moving credentials upon an update. FormFetch will have an outdated
   // credentials. Fix it if this turns out to be a product requirement.
 
-  const std::vector<const PasswordForm*> account_store_matches =
-      AccountStoreMatches(form_fetcher_->GetBestMatches());
-  for (const PasswordForm* match :
-       ProfileStoreMatches(form_fetcher_->GetBestMatches())) {
+  std::vector<const PasswordForm*> account_store_matches =
+      AccountStoreMatches(form_fetcher_->GetNonFederatedMatches());
+  const std::vector<const PasswordForm*> account_store_federated_matches =
+      AccountStoreMatches(form_fetcher_->GetFederatedMatches());
+  account_store_matches.insert(account_store_matches.end(),
+                               account_store_federated_matches.begin(),
+                               account_store_federated_matches.end());
+
+  std::vector<const PasswordForm*> profile_store_matches =
+      ProfileStoreMatches(form_fetcher_->GetNonFederatedMatches());
+  const std::vector<const PasswordForm*> profile_store_federated_matches =
+      ProfileStoreMatches(form_fetcher_->GetFederatedMatches());
+  profile_store_matches.insert(profile_store_matches.end(),
+                               profile_store_federated_matches.begin(),
+                               profile_store_federated_matches.end());
+
+  for (const PasswordForm* match : profile_store_matches) {
     DCHECK(!match->IsUsingAccountStore());
     // Ignore credentials matches for other usernames.
     if (match->username_value != pending_credentials_.username_value)
diff --git a/components/password_manager/core/browser/multi_store_password_save_manager_unittest.cc b/components/password_manager/core/browser/multi_store_password_save_manager_unittest.cc
index a3a59507..b1be7d59 100644
--- a/components/password_manager/core/browser/multi_store_password_save_manager_unittest.cc
+++ b/components/password_manager/core/browser/multi_store_password_save_manager_unittest.cc
@@ -169,6 +169,12 @@
     fetcher_->NotifyFetchCompleted();
   }
 
+  void SetFederatedAndNotifyFetchCompleted(
+      const std::vector<const autofill::PasswordForm*>& federated) {
+    fetcher_->set_federated(federated);
+    fetcher_->NotifyFetchCompleted();
+  }
+
   void SetAccountStoreEnabled(bool is_enabled) {
     ON_CALL(*client()->GetPasswordFeatureManager(),
             IsOptedInForAccountStorage())
@@ -180,6 +186,17 @@
         .WillByDefault(Return(store));
   }
 
+  PasswordForm CreateSavedFederated() {
+    autofill::PasswordForm federated;
+    federated.origin = GURL("https://example.in/login");
+    federated.signon_realm = "federation://example.in/google.com";
+    federated.type = autofill::PasswordForm::Type::kApi;
+    federated.federation_origin =
+        url::Origin::Create(GURL("https://google.com/"));
+    federated.username_value = ASCIIToUTF16("federated_username");
+    return federated;
+  }
+
   MockPasswordManagerClient* client() { return &client_; }
   MockFormSaver* mock_account_form_saver() { return mock_account_form_saver_; }
   MockFormSaver* mock_profile_form_saver() { return mock_profile_form_saver_; }
@@ -492,4 +509,51 @@
   password_save_manager()->MoveCredentialsToAccountStore();
 }
 
+TEST_F(MultiStorePasswordSaveManagerTest,
+       MovePSLMatchedCredentialsFromProfileToAccountStore) {
+  PasswordForm saved_match_in_profile_store(saved_match_);
+  saved_match_in_profile_store.in_store = PasswordForm::Store::kProfileStore;
+  PasswordForm psl_saved_match_in_profile_store(psl_saved_match_);
+  psl_saved_match_in_profile_store.in_store =
+      PasswordForm::Store::kProfileStore;
+  SetNonFederatedAndNotifyFetchCompleted(
+      {&saved_match_in_profile_store, &psl_saved_match_in_profile_store});
+
+  password_save_manager()->CreatePendingCredentials(
+      saved_match_in_profile_store, observed_form_, submitted_form_,
+      /*is_http_auth=*/false,
+      /*is_credential_api_save=*/false);
+
+  EXPECT_CALL(*mock_profile_form_saver(), Remove(saved_match_in_profile_store));
+  EXPECT_CALL(*mock_profile_form_saver(),
+              Remove(psl_saved_match_in_profile_store));
+  EXPECT_CALL(*mock_account_form_saver(),
+              Save(saved_match_in_profile_store, _, _));
+  EXPECT_CALL(*mock_account_form_saver(),
+              Save(psl_saved_match_in_profile_store, _, _));
+
+  password_save_manager()->MoveCredentialsToAccountStore();
+}
+
+TEST_F(MultiStorePasswordSaveManagerTest,
+       MoveFederatedCredentialsFromProfileToAccountStore) {
+  PasswordForm federated_match_in_profile_store = CreateSavedFederated();
+  federated_match_in_profile_store.in_store =
+      PasswordForm::Store::kProfileStore;
+
+  SetFederatedAndNotifyFetchCompleted({&federated_match_in_profile_store});
+
+  password_save_manager()->CreatePendingCredentials(
+      federated_match_in_profile_store, observed_form_, submitted_form_,
+      /*is_http_auth=*/false,
+      /*is_credential_api_save=*/false);
+
+  EXPECT_CALL(*mock_profile_form_saver(),
+              Remove(federated_match_in_profile_store));
+
+  EXPECT_CALL(*mock_account_form_saver(),
+              Save(federated_match_in_profile_store, _, _));
+
+  password_save_manager()->MoveCredentialsToAccountStore();
+}
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/password_store.h b/components/password_manager/core/browser/password_store.h
index 6c44dd5..cb43114 100644
--- a/components/password_manager/core/browser/password_store.h
+++ b/components/password_manager/core/browser/password_store.h
@@ -10,6 +10,7 @@
 #include <string>
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/callback_list.h"
 #include "base/gtest_prod_util.h"
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
index 4fadd241..5474b32 100644
--- a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
+++ b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/mock_callback.h"
diff --git a/components/password_manager_strings.grdp b/components/password_manager_strings.grdp
index b84df79..5846134 100644
--- a/components/password_manager_strings.grdp
+++ b/components/password_manager_strings.grdp
@@ -62,4 +62,7 @@
   <message name="IDS_PASSWORD_MANAGER_DEFAULT_EXPORT_FILENAME" desc="Chrome suggests this file name when user chooses to export their passwords saved with Chrome.">
     Chrome Passwords
   </message>
+   <message name="IDS_PASSWORD_CHANGE" desc="The text of the change password button in the dialog for credentials leaked.">
+    Change password
+  </message>
 </grit-part>
diff --git a/components/performance_manager/decorators/page_load_tracker_decorator_unittest.cc b/components/performance_manager/decorators/page_load_tracker_decorator_unittest.cc
index 91c66b2..11784420 100644
--- a/components/performance_manager/decorators/page_load_tracker_decorator_unittest.cc
+++ b/components/performance_manager/decorators/page_load_tracker_decorator_unittest.cc
@@ -8,6 +8,7 @@
 #include <type_traits>
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "base/time/time.h"
 #include "components/performance_manager/graph/frame_node_impl.h"
 #include "components/performance_manager/graph/page_node_impl.h"
diff --git a/components/plugins/renderer/webview_plugin.cc b/components/plugins/renderer/webview_plugin.cc
index a98b4f49..5b051be 100644
--- a/components/plugins/renderer/webview_plugin.cc
+++ b/components/plugins/renderer/webview_plugin.cc
@@ -10,6 +10,7 @@
 
 #include "base/auto_reset.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/location.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/numerics/safe_conversions.h"
diff --git a/components/policy/core/common/BUILD.gn b/components/policy/core/common/BUILD.gn
index 1a91195..ad63e00 100644
--- a/components/policy/core/common/BUILD.gn
+++ b/components/policy/core/common/BUILD.gn
@@ -78,6 +78,7 @@
     "cloud/machine_level_user_cloud_policy_manager.h",
     "cloud/machine_level_user_cloud_policy_store.cc",
     "cloud/machine_level_user_cloud_policy_store.h",
+    "cloud/policy_invalidation_scope.h",
     "cloud/policy_value_validator.h",
     "cloud/realtime_reporting_job_configuration.cc",
     "cloud/realtime_reporting_job_configuration.h",
diff --git a/components/policy/core/common/cloud/enterprise_metrics.cc b/components/policy/core/common/cloud/enterprise_metrics.cc
index 13333762..035fc39 100644
--- a/components/policy/core/common/cloud/enterprise_metrics.cc
+++ b/components/policy/core/common/cloud/enterprise_metrics.cc
@@ -17,14 +17,24 @@
 const char kMetricUserPolicyChromeOSSessionAbort[] =
     "Enterprise.UserPolicyChromeOS.SessionAbort";
 
-const char kMetricDevicePolicyRefresh[] = "Enterprise.DevicePolicyRefresh2";
+const char kMetricDevicePolicyRefresh[] = "Enterprise.DevicePolicyRefresh3";
 const char kMetricDevicePolicyRefreshFcm[] =
-    "Enterprise.FCMInvalidationService.DevicePolicyRefresh2";
+    "Enterprise.FCMInvalidationService.DevicePolicyRefresh3";
 
 const char kMetricDevicePolicyInvalidations[] =
-    "Enterprise.DevicePolicyInvalidations";
+    "Enterprise.DevicePolicyInvalidations2";
 const char kMetricDevicePolicyInvalidationsFcm[] =
-    "Enterprise.FCMInvalidationService.DevicePolicyInvalidations";
+    "Enterprise.FCMInvalidationService.DevicePolicyInvalidations2";
+
+const char kMetricDeviceLocalAccountPolicyRefresh[] =
+    "Enterprise.DeviceLocalAccountPolicyRefresh3";
+const char kMetricDeviceLocalAccountPolicyRefreshFcm[] =
+    "Enterprise.FCMInvalidationService.DeviceLocalAccountPolicyRefresh3";
+
+const char kMetricDeviceLocalAccountPolicyInvalidations[] =
+    "Enterprise.DeviceLocalAccountPolicyInvalidations2";
+const char kMetricDeviceLocalAccountPolicyInvalidationsFcm[] =
+    "Enterprise.FCMInvalidationService.DeviceLocalAccountPolicyInvalidations2";
 
 const char kMetricPolicyInvalidationRegistration[] =
     "Enterprise.PolicyInvalidationsRegistrationResult";
diff --git a/components/policy/core/common/cloud/enterprise_metrics.h b/components/policy/core/common/cloud/enterprise_metrics.h
index 55df4c5..e06edd2e 100644
--- a/components/policy/core/common/cloud/enterprise_metrics.h
+++ b/components/policy/core/common/cloud/enterprise_metrics.h
@@ -222,15 +222,25 @@
 // Names for the UMA counters. They are shared from here since the events
 // from the same enum above can be triggered in different files, and must use
 // the same UMA histogram name.
+// Metrics name from UMA dashboard cloud be used in codesearch as is, so please
+// keep the names without format specifiers (e.g. %s).
 POLICY_EXPORT extern const char kMetricUserPolicyRefresh[];
 POLICY_EXPORT extern const char kMetricUserPolicyRefreshFcm[];
 POLICY_EXPORT extern const char kMetricUserPolicyInvalidations[];
 POLICY_EXPORT extern const char kMetricUserPolicyInvalidationsFcm[];
 POLICY_EXPORT extern const char kMetricUserPolicyChromeOSSessionAbort[];
+
 POLICY_EXPORT extern const char kMetricDevicePolicyRefresh[];
 POLICY_EXPORT extern const char kMetricDevicePolicyRefreshFcm[];
 POLICY_EXPORT extern const char kMetricDevicePolicyInvalidations[];
 POLICY_EXPORT extern const char kMetricDevicePolicyInvalidationsFcm[];
+
+POLICY_EXPORT extern const char kMetricDeviceLocalAccountPolicyRefresh[];
+POLICY_EXPORT extern const char kMetricDeviceLocalAccountPolicyRefreshFcm[];
+POLICY_EXPORT extern const char kMetricDeviceLocalAccountPolicyInvalidations[];
+POLICY_EXPORT extern const char
+    kMetricDeviceLocalAccountPolicyInvalidationsFcm[];
+
 POLICY_EXPORT extern const char kMetricPolicyInvalidationRegistration[];
 POLICY_EXPORT extern const char kMetricPolicyInvalidationRegistrationFcm[];
 
diff --git a/components/policy/core/common/cloud/policy_invalidation_scope.h b/components/policy/core/common/cloud/policy_invalidation_scope.h
new file mode 100644
index 0000000..c14563cc
--- /dev/null
+++ b/components/policy/core/common/cloud/policy_invalidation_scope.h
@@ -0,0 +1,20 @@
+// Copyright 2020 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_POLICY_CORE_COMMON_CLOUD_POLICY_INVALIDATION_SCOPE_H_
+#define COMPONENTS_POLICY_CORE_COMMON_CLOUD_POLICY_INVALIDATION_SCOPE_H_
+
+namespace policy {
+
+// Specifies a scope of a policy or remote command which handler is
+// responsible for.
+enum class PolicyInvalidationScope {
+  kUser,
+  kDevice,
+  kDeviceLocalAccount,
+};
+
+}  // namespace policy
+
+#endif  // COMPONENTS_POLICY_CORE_COMMON_CLOUD_POLICY_INVALIDATION_SCOPE_H_
diff --git a/components/policy/core/common/policy_service_impl.cc b/components/policy/core/common/policy_service_impl.cc
index 08bfda7..cdaca0f 100644
--- a/components/policy/core/common/policy_service_impl.cc
+++ b/components/policy/core/common/policy_service_impl.cc
@@ -13,6 +13,7 @@
 #include "base/containers/flat_set.h"
 #include "base/feature_list.h"
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/components/renderer_context_menu/render_view_context_menu_base.cc b/components/renderer_context_menu/render_view_context_menu_base.cc
index ebd3cf0d..d764864 100644
--- a/components/renderer_context_menu/render_view_context_menu_base.cc
+++ b/components/renderer_context_menu/render_view_context_menu_base.cc
@@ -10,6 +10,7 @@
 
 #include "base/command_line.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_view_host.h"
diff --git a/components/safe_browsing/content/browser/browser_url_loader_throttle.cc b/components/safe_browsing/content/browser/browser_url_loader_throttle.cc
index 63a8bb0..1f7fd8dd 100644
--- a/components/safe_browsing/content/browser/browser_url_loader_throttle.cc
+++ b/components/safe_browsing/content/browser/browser_url_loader_throttle.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/trace_event/trace_event.h"
 #include "components/safe_browsing/core/browser/safe_browsing_url_checker_impl.h"
 #include "components/safe_browsing/core/browser/url_checker_delegate.h"
diff --git a/components/safe_browsing/content/browser/safe_browsing_url_checker_impl_content.cc b/components/safe_browsing/content/browser/safe_browsing_url_checker_impl_content.cc
index 988a6dc1..fd63ceec 100644
--- a/components/safe_browsing/content/browser/safe_browsing_url_checker_impl_content.cc
+++ b/components/safe_browsing/content/browser/safe_browsing_url_checker_impl_content.cc
@@ -47,7 +47,6 @@
 
   const GURL& url = urls_[next_index_].url;
 
-  // TODO(crbug.com/1050859): Add a metric to log is_rt_lookup_successful.
   if (!is_rt_lookup_successful) {
     PerformHashBasedCheck(url);
     return;
diff --git a/components/safe_browsing/content/browser/threat_details.cc b/components/safe_browsing/content/browser/threat_details.cc
index a671568..d07caa02 100644
--- a/components/safe_browsing/content/browser/threat_details.cc
+++ b/components/safe_browsing/content/browser/threat_details.cc
@@ -15,6 +15,7 @@
 #include "base/bind.h"
 #include "base/feature_list.h"
 #include "base/lazy_instance.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
 #include "base/strings/string_piece.h"
diff --git a/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc b/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc
index 7f091a2..04b3ef6 100644
--- a/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc
+++ b/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc
@@ -6,6 +6,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/components/safe_browsing/content/triggers/ad_popup_trigger.cc b/components/safe_browsing/content/triggers/ad_popup_trigger.cc
index 8e73b53..ce197ab 100644
--- a/components/safe_browsing/content/triggers/ad_popup_trigger.cc
+++ b/components/safe_browsing/content/triggers/ad_popup_trigger.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
diff --git a/components/safe_browsing/content/triggers/ad_redirect_trigger.cc b/components/safe_browsing/content/triggers/ad_redirect_trigger.cc
index bb12184..a281138 100644
--- a/components/safe_browsing/content/triggers/ad_redirect_trigger.cc
+++ b/components/safe_browsing/content/triggers/ad_redirect_trigger.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
diff --git a/components/safe_browsing/content/triggers/ad_sampler_trigger.cc b/components/safe_browsing/content/triggers/ad_sampler_trigger.cc
index 203ee58..afefe48b 100644
--- a/components/safe_browsing/content/triggers/ad_sampler_trigger.cc
+++ b/components/safe_browsing/content/triggers/ad_sampler_trigger.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
diff --git a/components/safe_browsing/content/triggers/suspicious_site_trigger.cc b/components/safe_browsing/content/triggers/suspicious_site_trigger.cc
index f778fafc..e531a18 100644
--- a/components/safe_browsing/content/triggers/suspicious_site_trigger.cc
+++ b/components/safe_browsing/content/triggers/suspicious_site_trigger.cc
@@ -5,6 +5,7 @@
 #include "components/safe_browsing/content/triggers/suspicious_site_trigger.h"
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/task/post_task.h"
diff --git a/components/safe_browsing/core/realtime/url_lookup_service.cc b/components/safe_browsing/core/realtime/url_lookup_service.cc
index 9373959..6fb47e2 100644
--- a/components/safe_browsing/core/realtime/url_lookup_service.cc
+++ b/components/safe_browsing/core/realtime/url_lookup_service.cc
@@ -102,7 +102,7 @@
         base::BindOnce(&RealTimeUrlLookupService::OnGetAccessToken,
                        weak_factory_.GetWeakPtr(), url,
                        std::move(request_callback),
-                       std::move(response_callback)));
+                       std::move(response_callback), base::TimeTicks::Now()));
   } else {
     std::unique_ptr<RTLookupRequest> request = FillRequestProto(url);
     SendRequest(url, /* access_token_info */ base::nullopt, std::move(request),
@@ -114,8 +114,13 @@
     const GURL& url,
     RTLookupRequestCallback request_callback,
     RTLookupResponseCallback response_callback,
+    base::TimeTicks get_token_start_time,
     base::Optional<signin::AccessTokenInfo> access_token_info) {
   std::unique_ptr<RTLookupRequest> request = FillRequestProto(url);
+  base::UmaHistogramTimes("SafeBrowsing.RT.GetToken.Time",
+                          base::TimeTicks::Now() - get_token_start_time);
+  base::UmaHistogramBoolean("SafeBrowsing.RT.HasTokenFromFetcher",
+                            access_token_info.has_value());
   SendRequest(url, access_token_info, std::move(request),
               std::move(request_callback), std::move(response_callback));
 }
@@ -173,6 +178,8 @@
         net::HttpRequestHeaders::kAuthorization,
         base::StrCat({kAuthHeaderBearer, access_token_info.value().token}));
   }
+  base::UmaHistogramBoolean("SafeBrowsing.RT.HasTokenInRequest",
+                            access_token_info.has_value());
 
   std::unique_ptr<network::SimpleURLLoader> owned_loader =
       network::SimpleURLLoader::Create(std::move(resource_request),
@@ -267,6 +274,8 @@
   bool is_rt_lookup_successful = (net_error == net::OK) &&
                                  (response_code == net::HTTP_OK) &&
                                  response->ParseFromString(*response_body);
+  base::UmaHistogramBoolean("SafeBrowsing.RT.IsLookupSuccessful",
+                            is_rt_lookup_successful);
   is_rt_lookup_successful ? HandleLookupSuccess() : HandleLookupError();
 
   MayBeCacheRealTimeUrlVerdict(url, *response);
diff --git a/components/safe_browsing/core/realtime/url_lookup_service.h b/components/safe_browsing/core/realtime/url_lookup_service.h
index 527435f..4513ff7 100644
--- a/components/safe_browsing/core/realtime/url_lookup_service.h
+++ b/components/safe_browsing/core/realtime/url_lookup_service.h
@@ -112,6 +112,7 @@
       const GURL& url,
       RTLookupRequestCallback request_callback,
       RTLookupResponseCallback response_callback,
+      base::TimeTicks get_token_start_time,
       base::Optional<signin::AccessTokenInfo> access_token_info);
 
   // Called to send the request to the Safe Browsing backend over the network.
diff --git a/components/safe_browsing/core/triggers/trigger_manager.cc b/components/safe_browsing/core/triggers/trigger_manager.cc
index c11699d4..5ea163b 100644
--- a/components/safe_browsing/core/triggers/trigger_manager.cc
+++ b/components/safe_browsing/core/triggers/trigger_manager.cc
@@ -5,6 +5,7 @@
 #include "components/safe_browsing/core/triggers/trigger_manager.h"
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/content/base_ui_manager.h"
diff --git a/components/security_interstitials/content/stateful_ssl_host_state_delegate.cc b/components/security_interstitials/content/stateful_ssl_host_state_delegate.cc
index 6611c69a..0ba33c54 100644
--- a/components/security_interstitials/content/stateful_ssl_host_state_delegate.cc
+++ b/components/security_interstitials/content/stateful_ssl_host_state_delegate.cc
@@ -13,6 +13,7 @@
 
 #include "base/base64.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/command_line.h"
 #include "base/feature_list.h"
diff --git a/components/services/storage/BUILD.gn b/components/services/storage/BUILD.gn
index 43dd34f..fc75d20 100644
--- a/components/services/storage/BUILD.gn
+++ b/components/services/storage/BUILD.gn
@@ -28,6 +28,8 @@
     "dom_storage/session_storage_namespace_impl.h",
     "dom_storage/storage_area_impl.cc",
     "dom_storage/storage_area_impl.h",
+    "filesystem_proxy_factory.cc",
+    "filesystem_proxy_factory.h",
     "indexed_db/leveldb/leveldb_factory.cc",
     "indexed_db/leveldb/leveldb_factory.h",
     "indexed_db/leveldb/leveldb_state.cc",
diff --git a/components/services/storage/dom_storage/dom_storage_database.cc b/components/services/storage/dom_storage/dom_storage_database.cc
index 43ee71d..8beb335 100644
--- a/components/services/storage/dom_storage/dom_storage_database.cc
+++ b/components/services/storage/dom_storage/dom_storage_database.cc
@@ -14,6 +14,7 @@
 #include "base/trace_event/memory_allocator_dump.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "base/trace_event/process_memory_dump.h"
+#include "components/services/storage/filesystem_proxy_factory.h"
 #include "third_party/leveldatabase/leveldb_chrome.h"
 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
 
@@ -27,7 +28,8 @@
 
 class DomStorageDatabaseEnv : public leveldb_env::ChromiumEnv {
  public:
-  DomStorageDatabaseEnv() : ChromiumEnv("ChromiumEnv.StorageService") {}
+  DomStorageDatabaseEnv()
+      : ChromiumEnv("ChromiumEnv.StorageService", CreateFilesystemProxy()) {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(DomStorageDatabaseEnv);
diff --git a/components/services/storage/dom_storage/local_storage_impl.cc b/components/services/storage/dom_storage/local_storage_impl.cc
index 7bee875..46b027e 100644
--- a/components/services/storage/dom_storage/local_storage_impl.cc
+++ b/components/services/storage/dom_storage/local_storage_impl.cc
@@ -14,6 +14,7 @@
 
 #include "base/barrier_closure.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
 #include "base/metrics/histogram_functions.h"
@@ -462,7 +463,8 @@
     : directory_(storage_root.empty() ? storage_root
                                       : storage_root.Append(kLocalStoragePath)),
       leveldb_task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
-          {base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN})),
+          {base::MayBlock(), base::WithBaseSyncPrimitives(),
+           base::TaskShutdownBehavior::BLOCK_SHUTDOWN})),
       memory_dump_id_(base::StringPrintf("LocalStorage/0x%" PRIXPTR,
                                          reinterpret_cast<uintptr_t>(this))),
       legacy_task_runner_(std::move(legacy_task_runner)),
diff --git a/components/services/storage/filesystem_proxy_factory.cc b/components/services/storage/filesystem_proxy_factory.cc
new file mode 100644
index 0000000..4bb00ec
--- /dev/null
+++ b/components/services/storage/filesystem_proxy_factory.cc
@@ -0,0 +1,37 @@
+// Copyright 2020 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/services/storage/filesystem_proxy_factory.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/no_destructor.h"
+
+namespace storage {
+
+namespace {
+
+std::unique_ptr<FilesystemProxy> CreateUnrestrictedFilesystemProxy() {
+  return std::make_unique<FilesystemProxy>(FilesystemProxy::UNRESTRICTED,
+                                           base::FilePath());
+}
+
+FilesystemProxyFactory& GetFactory() {
+  static base::NoDestructor<FilesystemProxyFactory> factory{
+      base::BindRepeating(&CreateUnrestrictedFilesystemProxy)};
+  return *factory;
+}
+
+}  // namespace
+
+void SetFilesystemProxyFactory(FilesystemProxyFactory factory) {
+  GetFactory() = std::move(factory);
+}
+
+std::unique_ptr<FilesystemProxy> CreateFilesystemProxy() {
+  return GetFactory().Run();
+}
+
+}  // namespace storage
diff --git a/components/services/storage/filesystem_proxy_factory.h b/components/services/storage/filesystem_proxy_factory.h
new file mode 100644
index 0000000..e900b95
--- /dev/null
+++ b/components/services/storage/filesystem_proxy_factory.h
@@ -0,0 +1,31 @@
+// Copyright 2020 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_SERVICES_STORAGE_FILESYSTEM_PROXY_FACTORY_H_
+#define COMPONENTS_SERVICES_STORAGE_FILESYSTEM_PROXY_FACTORY_H_
+
+#include <memory>
+
+#include "base/callback.h"
+#include "components/services/storage/public/cpp/filesystem/filesystem_proxy.h"
+
+namespace storage {
+
+// Replaces the default FilesystemProxy factory with a custom one. |factory|
+// must be safe to call from any thread.
+using FilesystemProxyFactory =
+    base::RepeatingCallback<std::unique_ptr<FilesystemProxy>()>;
+void SetFilesystemProxyFactory(FilesystemProxyFactory factory);
+
+// Produces a new FilesystemProxy suitable for use in the service's current
+// execution environment. If the service is unsandboxed (or running e.g. in a
+// browser process) this will produce an unrestricted FilesystemProxy which can
+// access any path. If the service is sandboxed, this will produce a restricted
+// FilesystemProxy which can only traverse a limited scope of filesystem, and
+// only through IPC to a more privileged process.
+std::unique_ptr<FilesystemProxy> CreateFilesystemProxy();
+
+}  // namespace storage
+
+#endif  // COMPONENTS_SERVICES_STORAGE_FILESYSTEM_PROXY_FACTORY_H_
diff --git a/components/services/storage/indexed_db/scopes/disjoint_range_lock_manager_unittest.cc b/components/services/storage/indexed_db/scopes/disjoint_range_lock_manager_unittest.cc
index cc526507..cf60a41 100644
--- a/components/services/storage/indexed_db/scopes/disjoint_range_lock_manager_unittest.cc
+++ b/components/services/storage/indexed_db/scopes/disjoint_range_lock_manager_unittest.cc
@@ -7,6 +7,7 @@
 #include "base/barrier_closure.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/bind_test_util.h"
diff --git a/components/services/storage/indexed_db/scopes/leveldb_scopes.cc b/components/services/storage/indexed_db/scopes/leveldb_scopes.cc
index d77ad2d..9cfaf41 100644
--- a/components/services/storage/indexed_db/scopes/leveldb_scopes.cc
+++ b/components/services/storage/indexed_db/scopes/leveldb_scopes.cc
@@ -10,6 +10,7 @@
 
 #include "base/barrier_closure.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/compiler_specific.h"
 #include "base/memory/ptr_util.h"
 #include "base/optional.h"
diff --git a/components/services/storage/indexed_db/transactional_leveldb/transactional_leveldb_factory.cc b/components/services/storage/indexed_db/transactional_leveldb/transactional_leveldb_factory.cc
index 682ff63..2f25051 100644
--- a/components/services/storage/indexed_db/transactional_leveldb/transactional_leveldb_factory.cc
+++ b/components/services/storage/indexed_db/transactional_leveldb/transactional_leveldb_factory.cc
@@ -4,6 +4,7 @@
 
 #include "components/services/storage/indexed_db/transactional_leveldb/transactional_leveldb_factory.h"
 
+#include "base/memory/ptr_util.h"
 #include "components/services/storage/indexed_db/scopes/leveldb_scope.h"
 #include "components/services/storage/indexed_db/scopes/leveldb_scopes.h"
 #include "components/services/storage/indexed_db/transactional_leveldb/transactional_leveldb_database.h"
diff --git a/components/services/storage/partition_impl.cc b/components/services/storage/partition_impl.cc
index bd074ac6..d390890 100644
--- a/components/services/storage/partition_impl.cc
+++ b/components/services/storage/partition_impl.cc
@@ -59,7 +59,8 @@
   session_storage_ = new SessionStorageImpl(
       path_.value_or(base::FilePath()),
       base::ThreadPool::CreateSequencedTaskRunner(
-          {base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN}),
+          {base::MayBlock(), base::WithBaseSyncPrimitives(),
+           base::TaskShutdownBehavior::BLOCK_SHUTDOWN}),
       base::SequencedTaskRunnerHandle::Get(),
 #if defined(OS_ANDROID)
       // On Android there is no support for session storage restoring, and since
diff --git a/components/services/storage/partition_impl_unittest.cc b/components/services/storage/partition_impl_unittest.cc
index 1cd6ad7..8536257 100644
--- a/components/services/storage/partition_impl_unittest.cc
+++ b/components/services/storage/partition_impl_unittest.cc
@@ -40,7 +40,8 @@
  private:
   base::test::TaskEnvironment task_environment_;
   mojo::Remote<mojom::StorageService> remote_service_;
-  StorageServiceImpl service_{remote_service_.BindNewPipeAndPassReceiver()};
+  StorageServiceImpl service_{remote_service_.BindNewPipeAndPassReceiver(),
+                              /*io_task_runner=*/nullptr};
   mojo::Remote<mojom::Partition> remote_test_partition_;
   PartitionImpl* test_partition_impl_ = nullptr;
 
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_impl.cc b/components/services/storage/public/cpp/filesystem/filesystem_impl.cc
index b499905..cd9b863f 100644
--- a/components/services/storage/public/cpp/filesystem/filesystem_impl.cc
+++ b/components/services/storage/public/cpp/filesystem/filesystem_impl.cc
@@ -95,6 +95,11 @@
 
 FilesystemImpl::~FilesystemImpl() = default;
 
+void FilesystemImpl::Clone(mojo::PendingReceiver<mojom::Directory> receiver) {
+  mojo::MakeSelfOwnedReceiver(std::make_unique<FilesystemImpl>(root_),
+                              std::move(receiver));
+}
+
 void FilesystemImpl::PathExists(const base::FilePath& path,
                                 PathExistsCallback callback) {
   std::move(callback).Run(base::PathExists(MakeAbsolute(path)));
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_impl.h b/components/services/storage/public/cpp/filesystem/filesystem_impl.h
index 552be203..60d7f2d 100644
--- a/components/services/storage/public/cpp/filesystem/filesystem_impl.h
+++ b/components/services/storage/public/cpp/filesystem/filesystem_impl.h
@@ -39,6 +39,7 @@
   ~FilesystemImpl() override;
 
   // mojom::Directory:
+  void Clone(mojo::PendingReceiver<mojom::Directory> receiver) override;
   void PathExists(const base::FilePath& path,
                   PathExistsCallback callback) override;
   void GetEntries(const base::FilePath& path,
diff --git a/components/services/storage/public/mojom/BUILD.gn b/components/services/storage/public/mojom/BUILD.gn
index f1943227..895cd20 100644
--- a/components/services/storage/public/mojom/BUILD.gn
+++ b/components/services/storage/public/mojom/BUILD.gn
@@ -26,6 +26,10 @@
 
   overridden_deps = [ "//third_party/blink/public/mojom:mojom_platform" ]
   component_deps = [ "//third_party/blink/public/common" ]
+
+  if (!is_android) {
+    enabled_features = [ "is_not_android" ]
+  }
 }
 
 mojom("test_api") {
diff --git a/components/services/storage/public/mojom/filesystem/directory.mojom b/components/services/storage/public/mojom/filesystem/directory.mojom
index f633020..c1b97c6a 100644
--- a/components/services/storage/public/mojom/filesystem/directory.mojom
+++ b/components/services/storage/public/mojom/filesystem/directory.mojom
@@ -88,6 +88,9 @@
 // filesystem, and all StrictRelatvePath references must be interpreted as
 // relative to that directory.
 interface Directory {
+  // Binds a new Directory receiver scoped to the same root as this Directory.
+  Clone(pending_receiver<Directory> receiver);
+
   // Indicates whether |path| exists.
   [Sync]
   PathExists(StrictRelativePath path) => (bool exists);
diff --git a/components/services/storage/public/mojom/storage_service.mojom b/components/services/storage/public/mojom/storage_service.mojom
index 56d6c743..5ccfe67 100644
--- a/components/services/storage/public/mojom/storage_service.mojom
+++ b/components/services/storage/public/mojom/storage_service.mojom
@@ -7,6 +7,9 @@
 import "components/services/storage/public/mojom/partition.mojom";
 import "mojo/public/mojom/base/file_path.mojom";
 
+[EnableIf=is_not_android]
+import "components/services/storage/public/mojom/filesystem/directory.mojom";
+
 // The main interface into the Storage Service. The browser maintains a single
 // global connection to this interface.
 interface StorageService {
@@ -14,6 +17,21 @@
   // minimize chance of data loss.
   EnableAggressiveDomStorageFlushing();
 
+  // Must be called early after launching the service (before binding any
+  // Partitions) if the service has been launched in a sandboxed environment.
+  // Failing to call this will result in the service attempting to perform
+  // direct filesystem operations that may be prohibited by the sandbox
+  // environment.
+  //
+  // |path| indicates the absolute filesystem path to which |directory| is
+  // scoped.
+  //
+  // Once called, the service will use begin using |directory| for all
+  // privileged filesystem operations.
+  [EnableIf=is_not_android]
+  SetDataDirectory(mojo_base.mojom.FilePath path,
+                   pending_remote<Directory> directory);
+
   // Binds a new Partition endpoint.
   //
   // |path| if non-null must be an absolute path, and it identifies a persistent
diff --git a/components/services/storage/storage_service_impl.cc b/components/services/storage/storage_service_impl.cc
index 75f147d..37336b3 100644
--- a/components/services/storage/storage_service_impl.cc
+++ b/components/services/storage/storage_service_impl.cc
@@ -4,15 +4,49 @@
 
 #include "components/services/storage/storage_service_impl.h"
 
+#include "base/bind.h"
+#include "base/task/post_task.h"
+#include "base/threading/sequenced_task_runner_handle.h"
+#include "build/build_config.h"
 #include "components/services/storage/dom_storage/storage_area_impl.h"
+#include "components/services/storage/filesystem_proxy_factory.h"
 #include "components/services/storage/partition_impl.h"
+#include "components/services/storage/public/cpp/filesystem/filesystem_proxy.h"
 #include "components/services/storage/test_api_stubs.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "third_party/leveldatabase/env_chromium.h"
 
 namespace storage {
 
+namespace {
+
+// We don't use out-of-process Storage Service on Android, so we can avoid
+// pulling all the related code (including Directory mojom) into the build.
+#if !defined(OS_ANDROID)
+using DirectoryBinder =
+    base::RepeatingCallback<void(mojo::PendingReceiver<mojom::Directory>)>;
+std::unique_ptr<FilesystemProxy> CreateRestrictedFilesystemProxy(
+    const base::FilePath& directory_path,
+    scoped_refptr<base::SequencedTaskRunner> io_task_runner,
+    DirectoryBinder binder,
+    scoped_refptr<base::SequencedTaskRunner> binder_task_runner) {
+  mojo::PendingRemote<mojom::Directory> directory;
+  binder_task_runner->PostTask(
+      FROM_HERE,
+      base::BindOnce(binder, directory.InitWithNewPipeAndPassReceiver()));
+  return std::make_unique<FilesystemProxy>(FilesystemProxy::RESTRICTED,
+                                           directory_path, std::move(directory),
+                                           std::move(io_task_runner));
+}
+#endif
+
+}  // namespace
+
 StorageServiceImpl::StorageServiceImpl(
-    mojo::PendingReceiver<mojom::StorageService> receiver)
-    : receiver_(this, std::move(receiver)) {}
+    mojo::PendingReceiver<mojom::StorageService> receiver,
+    scoped_refptr<base::SequencedTaskRunner> io_task_runner)
+    : receiver_(this, std::move(receiver)),
+      io_task_runner_(std::move(io_task_runner)) {}
 
 StorageServiceImpl::~StorageServiceImpl() = default;
 
@@ -20,6 +54,26 @@
   StorageAreaImpl::EnableAggressiveCommitDelay();
 }
 
+#if !defined(OS_ANDROID)
+void StorageServiceImpl::SetDataDirectory(
+    const base::FilePath& path,
+    mojo::PendingRemote<mojom::Directory> directory) {
+  remote_data_directory_path_ = path;
+  remote_data_directory_.Bind(std::move(directory));
+
+  // We can assume we must be sandboxed if we're getting a remote data
+  // directory handle. Override the default FilesystemProxy factory to produce
+  // instances restricted to operations within |path|, which can operate
+  // from within a sandbox.
+  SetFilesystemProxyFactory(base::BindRepeating(
+      &CreateRestrictedFilesystemProxy, remote_data_directory_path_,
+      io_task_runner_,
+      base::BindRepeating(&StorageServiceImpl::BindDataDirectoryReceiver,
+                          weak_ptr_factory_.GetWeakPtr()),
+      base::SequencedTaskRunnerHandle::Get()));
+}
+#endif  // !defined(OS_ANDROID)
+
 void StorageServiceImpl::BindPartition(
     const base::Optional<base::FilePath>& path,
     mojo::PendingReceiver<mojom::Partition> receiver) {
@@ -59,4 +113,12 @@
     partitions_.erase(iter);
 }
 
+#if !defined(OS_ANDROID)
+void StorageServiceImpl::BindDataDirectoryReceiver(
+    mojo::PendingReceiver<mojom::Directory> receiver) {
+  DCHECK(remote_data_directory_.is_bound());
+  remote_data_directory_->Clone(std::move(receiver));
+}
+#endif
+
 }  // namespace storage
diff --git a/components/services/storage/storage_service_impl.h b/components/services/storage/storage_service_impl.h
index 2f8af81..32d47b3 100644
--- a/components/services/storage/storage_service_impl.h
+++ b/components/services/storage/storage_service_impl.h
@@ -11,10 +11,15 @@
 #include "base/containers/unique_ptr_adapters.h"
 #include "base/files/file_path.h"
 #include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/sequenced_task_runner.h"
+#include "build/build_config.h"
 #include "components/services/storage/partition_impl.h"
+#include "components/services/storage/public/mojom/filesystem/directory.mojom.h"
 #include "components/services/storage/public/mojom/storage_service.mojom.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 
 namespace storage {
 
@@ -25,14 +30,23 @@
 // persistent and in-memory partitions.
 class StorageServiceImpl : public mojom::StorageService {
  public:
-  explicit StorageServiceImpl(
-      mojo::PendingReceiver<mojom::StorageService> receiver);
+  // NOTE: |io_task_runner| is only used in sandboxed environments and can be
+  // null otherwise. If non-null, it should specify a task runner that will
+  // never block and is thus capable of reliably facilitating IPC to the
+  // browser.
+  StorageServiceImpl(mojo::PendingReceiver<mojom::StorageService> receiver,
+                     scoped_refptr<base::SequencedTaskRunner> io_task_runner);
   ~StorageServiceImpl() override;
 
   const auto& partitions() const { return partitions_; }
 
   // mojom::StorageService implementation:
   void EnableAggressiveDomStorageFlushing() override;
+#if !defined(OS_ANDROID)
+  void SetDataDirectory(
+      const base::FilePath& path,
+      mojo::PendingRemote<mojom::Directory> directory) override;
+#endif
   void BindPartition(const base::Optional<base::FilePath>& path,
                      mojo::PendingReceiver<mojom::Partition> receiver) override;
   void BindTestApi(mojo::ScopedMessagePipeHandle test_api_receiver) override;
@@ -43,7 +57,23 @@
   // Removes a partition from the set of tracked partitions.
   void RemovePartition(PartitionImpl* partition);
 
+#if !defined(OS_ANDROID)
+  // Binds a Directory receiver to the same remote implementation to which
+  // |remote_data_directory_| is bound. It is invalid to call this when
+  // |remote_data_directory_| is unbound.
+  void BindDataDirectoryReceiver(
+      mojo::PendingReceiver<mojom::Directory> receiver);
+#endif
+
   const mojo::Receiver<mojom::StorageService> receiver_;
+  const scoped_refptr<base::SequencedTaskRunner> io_task_runner_;
+
+#if !defined(OS_ANDROID)
+  // If bound, the service will assume it should not perform certain filesystem
+  // operations directly and will instead go through this interface.
+  base::FilePath remote_data_directory_path_;
+  mojo::Remote<mojom::Directory> remote_data_directory_;
+#endif
 
   // The set of all isolated partitions owned by the service. This includes both
   // persistent and in-memory partitions.
@@ -56,6 +86,8 @@
   // entries in this map.
   std::map<base::FilePath, PartitionImpl*> persistent_partition_map_;
 
+  base::WeakPtrFactory<StorageServiceImpl> weak_ptr_factory_{this};
+
   DISALLOW_COPY_AND_ASSIGN(StorageServiceImpl);
 };
 
diff --git a/components/services/storage/storage_service_impl_unittest.cc b/components/services/storage/storage_service_impl_unittest.cc
index 0533bf3..87a8af2 100644
--- a/components/services/storage/storage_service_impl_unittest.cc
+++ b/components/services/storage/storage_service_impl_unittest.cc
@@ -28,7 +28,8 @@
  private:
   base::test::TaskEnvironment task_environment_;
   mojo::Remote<mojom::StorageService> remote_service_;
-  StorageServiceImpl service_{remote_service_.BindNewPipeAndPassReceiver()};
+  StorageServiceImpl service_{remote_service_.BindNewPipeAndPassReceiver(),
+                              /*io_task_runner=*/nullptr};
 
   DISALLOW_COPY_AND_ASSIGN(StorageServiceImplTest);
 };
diff --git a/components/sessions/content/session_tab_helper.cc b/components/sessions/content/session_tab_helper.cc
index a6cde49..7cd858bb 100644
--- a/components/sessions/content/session_tab_helper.cc
+++ b/components/sessions/content/session_tab_helper.cc
@@ -4,6 +4,7 @@
 
 #include "components/sessions/content/session_tab_helper.h"
 
+#include "base/memory/ptr_util.h"
 #include "components/sessions/content/content_serialized_navigation_builder.h"
 #include "components/sessions/content/session_tab_helper_delegate.h"
 #include "components/sessions/core/serialized_navigation_entry.h"
diff --git a/components/signin/internal/identity_manager/gaia_cookie_manager_service_unittest.cc b/components/signin/internal/identity_manager/gaia_cookie_manager_service_unittest.cc
index ede9d34..f85707ab 100644
--- a/components/signin/internal/identity_manager/gaia_cookie_manager_service_unittest.cc
+++ b/components/signin/internal/identity_manager/gaia_cookie_manager_service_unittest.cc
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
diff --git a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc
index 00328775..00471573 100644
--- a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc
+++ b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
diff --git a/components/suggestions/suggestions_service_impl_unittest.cc b/components/suggestions/suggestions_service_impl_unittest.cc
index e40bdbde..c851f928 100644
--- a/components/suggestions/suggestions_service_impl_unittest.cc
+++ b/components/suggestions/suggestions_service_impl_unittest.cc
@@ -12,6 +12,7 @@
 
 #include "base/bind.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
diff --git a/components/sync/base/report_unrecoverable_error.cc b/components/sync/base/report_unrecoverable_error.cc
index b6e619ee..0f1cb0d0 100644
--- a/components/sync/base/report_unrecoverable_error.cc
+++ b/components/sync/base/report_unrecoverable_error.cc
@@ -20,10 +20,7 @@
   // Note: crash reporting is disabled, and should only be enabled when
   // investigating a specific datatype error. In that event, a specific bug
   // should be referenced here.
-  // Crash reporting is enabled to debug crbug.com/1044365
-  // TODO(crbug.com/1044365): Disable crash reporting once the underlying issue
-  // is identified.
-  const double kErrorUploadRatio = 0.01;
+  const double kErrorUploadRatio = 0.00;
   if (kErrorUploadRatio <= 0.0)
     return;  // We are not allowed to upload errors.
   double random_number = base::RandDouble();
diff --git a/components/sync/base/sync_base_switches.cc b/components/sync/base/sync_base_switches.cc
index a906a6c..b525652 100644
--- a/components/sync/base/sync_base_switches.cc
+++ b/components/sync/base/sync_base_switches.cc
@@ -23,7 +23,4 @@
     &kSyncCustomSharingMessageNudgeDelay,
     "SyncSharingMessageNudgeDelayMilliseconds", 50};
 
-const base::Feature kDoNotSyncFaviconDataTypes{
-    "DoNotSyncFaviconDataTypes", base::FEATURE_ENABLED_BY_DEFAULT};
-
 }  // namespace switches
diff --git a/components/sync/base/sync_base_switches.h b/components/sync/base/sync_base_switches.h
index 8580e49..c7624dfe 100644
--- a/components/sync/base/sync_base_switches.h
+++ b/components/sync/base/sync_base_switches.h
@@ -14,7 +14,6 @@
 extern const base::Feature kSyncE2ELatencyMeasurement;
 extern const base::Feature kSyncCustomSharingMessageNudgeDelay;
 extern const base::FeatureParam<int> kSyncSharingMessageNudgeDelayMilliseconds;
-extern const base::Feature kDoNotSyncFaviconDataTypes;
 
 }  // namespace switches
 
diff --git a/components/sync/driver/glue/sync_engine_backend.cc b/components/sync/driver/glue/sync_engine_backend.cc
index 4258b655..0e598b2f 100644
--- a/components/sync/driver/glue/sync_engine_backend.cc
+++ b/components/sync/driver/glue/sync_engine_backend.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/files/file_util.h"
 #include "base/location.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc
index ad41ba7..9a9f6263 100644
--- a/components/sync/driver/profile_sync_service.cc
+++ b/components/sync/driver/profile_sync_service.cc
@@ -9,6 +9,7 @@
 
 #include "base/base64.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/command_line.h"
 #include "base/feature_list.h"
diff --git a/components/sync/model/model_type_sync_bridge.h b/components/sync/model/model_type_sync_bridge.h
index 345b93e..9c16529 100644
--- a/components/sync/model/model_type_sync_bridge.h
+++ b/components/sync/model/model_type_sync_bridge.h
@@ -119,6 +119,11 @@
   // on the same or different clients, but to keep things simple, it probably
   // should be. Storage keys are kept in memory at steady state, so each model
   // type should strive to keep these keys as small as possible.
+  // Returning an empty string means the remote creation should be ignored (i.e.
+  // it contains invalid data).
+  // TODO(crbug.com/1057947): introduce a dedicated method to validate data from
+  // the server to solve the inconsistency with bridges that don't support
+  // GetStorageKey() and with remote updates which are not creations.
   virtual std::string GetStorageKey(const EntityData& entity_data) = 0;
 
   // Whether or not the bridge is capable of producing a client tag from
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor.cc b/components/sync/model_impl/client_tag_based_model_type_processor.cc
index 9847a85..df489f6d 100644
--- a/components/sync/model_impl/client_tag_based_model_type_processor.cc
+++ b/components/sync/model_impl/client_tag_based_model_type_processor.cc
@@ -26,28 +26,6 @@
 
 namespace syncer {
 
-namespace {
-
-// These errors are used to investigate user reports (see crbug.com/1045641).
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-enum class ClientTagBasedModelTypeProcessorErrors {
-  kLoadMetadataError = 0,
-  kFullUpdateError = 1,
-  kDuplicateRecordAddedError = 2,
-  kEmptyStorageKeyError = 3,
-  kStorageKeyNotFoundError = 4,
-  kMaxValue = kStorageKeyNotFoundError,
-};
-
-void LogModelTypeProcessorError(ClientTagBasedModelTypeProcessorErrors error) {
-  // TODO(crbug.com/1045641): Remove once investigation is over.
-  base::UmaHistogramEnumeration("Sync.WalletDataModelTypeProcessorErrors",
-                                error);
-}
-
-}  // namespace
-
 ClientTagBasedModelTypeProcessor::ClientTagBasedModelTypeProcessor(
     ModelType type,
     const base::RepeatingClosure& dump_stack)
@@ -115,12 +93,6 @@
     EntityMetadataMap metadata_map(batch->TakeAllMetadata());
     entity_tracker_ = std::make_unique<ProcessorEntityTracker>(
         std::move(metadata_map), batch->GetModelTypeState());
-    // TODO(crbug.com/1045641): Remove once investigation is over.
-    if (type_ == ModelType::AUTOFILL_WALLET_DATA &&
-        !entity_tracker_->AllStorageKeysPopulated()) {
-      LogModelTypeProcessorError(
-          ClientTagBasedModelTypeProcessorErrors::kLoadMetadataError);
-    }
   } else {
     // In older versions of the binary, commit-only types did not persist
     // initial_sync_done(). So this branch can be exercised for commit-only
@@ -679,12 +651,6 @@
       !entity_tracker_->model_type_state().initial_sync_done();
   if (is_initial_sync || HasClearAllDirective(model_type_state)) {
     error = OnFullUpdateReceived(model_type_state, std::move(updates));
-    // TODO(crbug.com/1045641): Remove once investigation is over.
-    if (type_ == ModelType::AUTOFILL_WALLET_DATA &&
-        !entity_tracker_->AllStorageKeysPopulated()) {
-      LogModelTypeProcessorError(
-          ClientTagBasedModelTypeProcessorErrors::kFullUpdateError);
-    }
   } else {
     error = OnIncrementalUpdateReceived(model_type_state, std::move(updates));
   }
@@ -814,6 +780,11 @@
     }
 #endif  // DCHECK_IS_ON()
     ProcessorEntity* entity = CreateEntity(update.entity);
+    if (!entity) {
+      DLOG(WARNING) << "Received entity with invalid update for "
+                    << ModelTypeToString(type_);
+      continue;
+    }
     entity->RecordAcceptedUpdate(update);
     const std::string& storage_key = entity->storage_key();
     entity_data.push_back(
@@ -965,17 +936,12 @@
   std::string storage_key;
   if (bridge_->SupportsGetStorageKey()) {
     storage_key = bridge_->GetStorageKey(data);
-    // TODO(crbug.com/1045641): Remove once investigation is over.
-    if (type_ == ModelType::AUTOFILL_WALLET_DATA) {
-      if (storage_key.empty()) {
-        LogModelTypeProcessorError(
-            ClientTagBasedModelTypeProcessorErrors::kEmptyStorageKeyError);
-      } else if (entity_tracker_->GetEntityForStorageKey(storage_key)) {
-        LogModelTypeProcessorError(
-            ClientTagBasedModelTypeProcessorErrors::kDuplicateRecordAddedError);
-      }
+    if (storage_key.empty()) {
+      // Ignore the creation of entity due to invalid data.
+      return nullptr;
     }
   }
+
   return CreateEntity(storage_key, data);
 }
 
@@ -1015,12 +981,6 @@
   }
 
   for (const std::string& key : storage_key_to_be_deleted) {
-    // TODO(crbug.com/1045641): replace with DCHECK after fixing.
-    if (type_ == ModelType::AUTOFILL_WALLET_DATA &&
-        entity_tracker_->GetEntityForStorageKey(key) == nullptr) {
-      LogModelTypeProcessorError(
-          ClientTagBasedModelTypeProcessorErrors::kStorageKeyNotFoundError);
-    }
     RemoveEntity(key, metadata_changes);
   }
 }
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor.h b/components/sync/model_impl/client_tag_based_model_type_processor.h
index 3dde6ae7..99a423a 100644
--- a/components/sync/model_impl/client_tag_based_model_type_processor.h
+++ b/components/sync/model_impl/client_tag_based_model_type_processor.h
@@ -175,14 +175,16 @@
   ClientTagHash GetClientTagHash(const std::string& storage_key,
                                  const EntityData& data) const;
 
-
   // Create an entity in the entity map for |storage_key| and return a pointer
   // to it.
   // Requires that no entity for |storage_key| already exists in the map.
+  // Never returns nullptr.
   ProcessorEntity* CreateEntity(const std::string& storage_key,
                                 const EntityData& data);
 
   // Version of the above that generates a tag for |data|.
+  // Returns created entity or nullptr if generated storage key from the bridge
+  // is empty (i.e. the remote update is invalid and should be ignored).
   ProcessorEntity* CreateEntity(const EntityData& data);
 
   // Removes metadata for all entries unless they are unsynced.
diff --git a/components/sync/model_impl/model_type_store_service_impl.cc b/components/sync/model_impl/model_type_store_service_impl.cc
index b7cb838..ab2d65f 100644
--- a/components/sync/model_impl/model_type_store_service_impl.cc
+++ b/components/sync/model_impl/model_type_store_service_impl.cc
@@ -32,7 +32,6 @@
 
 // Initialized ModelTypeStoreBackend, on the backend sequence.
 void InitOnBackendSequence(const base::FilePath& level_db_path,
-                           bool do_not_sync_favicon_data_types,
                            scoped_refptr<ModelTypeStoreBackend> store_backend) {
   base::Optional<ModelError> error = store_backend->Init(level_db_path);
   if (error) {
@@ -41,12 +40,10 @@
     return;
   }
 
+  // TODO(crbug.com/978775): Remove the cleanup logic after a year.
   // Clean up local data from deprecated datatypes.
-  if (do_not_sync_favicon_data_types) {
-    for (ModelType type : {FAVICON_IMAGES, FAVICON_TRACKING}) {
-      BlockingModelTypeStoreImpl(type, store_backend)
-          .DeleteAllDataAndMetadata();
-    }
+  for (ModelType type : {FAVICON_IMAGES, FAVICON_TRACKING}) {
+    BlockingModelTypeStoreImpl(type, store_backend).DeleteAllDataAndMetadata();
   }
 }
 
@@ -111,14 +108,8 @@
           {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})),
       store_backend_(ModelTypeStoreBackend::CreateUninitialized()) {
   DCHECK(backend_task_runner_);
-  // switches::kDoNotSyncFaviconDataTypes is evaluated here to avoid TSAN issues
-  // in tests.
-  // TODO(crbug.com/978775): Remove the feature as well as the cleanup logic
-  // after a few milestones, e.g. after M83.
   backend_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&InitOnBackendSequence, leveldb_path_,
-                                base::FeatureList::IsEnabled(
-                                    switches::kDoNotSyncFaviconDataTypes),
                                 store_backend_));
 }
 
diff --git a/components/sync/nigori/nigori_state.cc b/components/sync/nigori/nigori_state.cc
index 67faffc..49ad544d 100644
--- a/components/sync/nigori/nigori_state.cc
+++ b/components/sync/nigori/nigori_state.cc
@@ -152,6 +152,12 @@
     state.pending_keystore_decryptor_token =
         proto.pending_keystore_decryptor_token();
   }
+
+  if (proto.has_last_default_trusted_vault_key_name()) {
+    state.last_default_trusted_vault_key_name =
+        proto.last_default_trusted_vault_key_name();
+  }
+
   return state;
 }
 
@@ -210,6 +216,10 @@
     *proto.mutable_pending_keystore_decryptor_token() =
         *pending_keystore_decryptor_token;
   }
+  if (last_default_trusted_vault_key_name.has_value()) {
+    proto.set_last_default_trusted_vault_key_name(
+        *last_default_trusted_vault_key_name);
+  }
   return proto;
 }
 
@@ -236,6 +246,8 @@
     UpdateSpecificsFromKeyDerivationParams(
         *custom_passphrase_key_derivation_params, &specifics);
   }
+  // TODO(crbug.com/1020084): populate |keystore_decryptor_token| for trusted
+  // vault passphrase to allow rollbacks.
   if (passphrase_type == sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE) {
     // TODO(crbug.com/922900): it seems possible to have corrupted
     // |pending_keystore_decryptor_token| and an ability to recover it in case
@@ -277,6 +289,8 @@
   result.encrypt_everything = encrypt_everything;
   result.keystore_keys_cryptographer = keystore_keys_cryptographer->Clone();
   result.pending_keystore_decryptor_token = pending_keystore_decryptor_token;
+  result.last_default_trusted_vault_key_name =
+      last_default_trusted_vault_key_name;
   return result;
 }
 
diff --git a/components/sync/nigori/nigori_state.h b/components/sync/nigori/nigori_state.h
index 75b772d5..85dc5bc8c 100644
--- a/components/sync/nigori/nigori_state.h
+++ b/components/sync/nigori/nigori_state.h
@@ -82,6 +82,10 @@
   // can't be decrypted right after remote update arrival due to lack of
   // keystore keys. May be set only for keystore Nigori.
   base::Optional<sync_pb::EncryptedData> pending_keystore_decryptor_token;
+
+  // The name of the latest available trusted vault key that was used as the
+  // default encryption key.
+  base::Optional<std::string> last_default_trusted_vault_key_name;
 };
 
 }  // namespace syncer
diff --git a/components/sync/nigori/nigori_sync_bridge_impl.cc b/components/sync/nigori/nigori_sync_bridge_impl.cc
index 673750a4..9afac4f 100644
--- a/components/sync/nigori/nigori_sync_bridge_impl.cc
+++ b/components/sync/nigori/nigori_sync_bridge_impl.cc
@@ -198,13 +198,8 @@
     case NigoriSpecifics::CUSTOM_PASSPHRASE:
       return false;
     case NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE:
-      // TODO(crbug.com/984940): The below should be allowed for
-      // CUSTOM_PASSPHRASE and KEYSTORE_PASSPHRASE but it requires carefully
-      // verifying that the client triggering the transition already had access
-      // to the trusted vault passphrase (e.g. the new keybag must be a
-      // superset of the old and the default key must have changed).
-      NOTIMPLEMENTED();
-      return false;
+      return new_passphrase_type == NigoriSpecifics::CUSTOM_PASSPHRASE ||
+             new_passphrase_type == NigoriSpecifics::KEYSTORE_PASSPHRASE;
   }
   NOTREACHED();
   return false;
@@ -653,6 +648,9 @@
     return;
   }
 
+  state_.last_default_trusted_vault_key_name =
+      state_.cryptographer->GetDefaultEncryptionKeyName();
+
   storage_->StoreData(SerializeAsNigoriLocalData());
   broadcasting_observer_->OnCryptographerStateChanged(
       state_.cryptographer.get(), state_.pending_keys.has_value());
@@ -995,6 +993,17 @@
                       "Received keybag is missing the new default key.");
   }
 
+  if (state_.last_default_trusted_vault_key_name.has_value() &&
+      !new_key_bag.HasKey(*state_.last_default_trusted_vault_key_name)) {
+    // Protocol violation.
+    return ModelError(FROM_HERE,
+                      "Received keybag is missing the last trusted vault key.");
+  }
+
+  // Reset |last_default_trusted_vault_key_name| as |state_| might go out of
+  // TRUSTED_VAULT passphrase type. The callers are responsible to set it again
+  // if needed.
+  state_.last_default_trusted_vault_key_name = base::nullopt;
   state_.cryptographer->EmplaceKeysFrom(new_key_bag);
   state_.cryptographer->SelectDefaultEncryptionKey(new_default_key_name);
   state_.pending_keys.reset();
@@ -1054,6 +1063,7 @@
   state_.custom_passphrase_time = base::Time();
   state_.keystore_migration_time = base::Time();
   state_.custom_passphrase_key_derivation_params = base::nullopt;
+  state_.last_default_trusted_vault_key_name = base::nullopt;
   broadcasting_observer_->OnCryptographerStateChanged(
       state_.cryptographer.get(),
       /*has_pending_keys=*/false);
diff --git a/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc b/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc
index 2522949..23b1b1d 100644
--- a/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc
+++ b/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc
@@ -1141,9 +1141,7 @@
   auto storage1 = std::make_unique<testing::NiceMock<MockNigoriStorage>>();
   sync_pb::NigoriLocalData nigori_local_data;
   ON_CALL(*storage1, StoreData(_))
-      .WillByDefault([&](const sync_pb::NigoriLocalData& data) {
-        nigori_local_data = data;
-      });
+      .WillByDefault(testing::SaveArg<0>(&nigori_local_data));
 
   // Provide some metadata to verify that we store it.
   auto processor1 =
@@ -1428,6 +1426,260 @@
   EXPECT_THAT(bridge()->GetData(), HasCustomPassphraseNigori());
 }
 
+// Tests processing of remote incremental update that transits from trusted
+// vault to keystore passphrase.
+TEST_F(NigoriSyncBridgeImplTest,
+       ShouldProcessRemoteTransitionFromTrustedVaultToKeystore) {
+  const KeyParams kTrustedVaultKeyParams =
+      TrustedVaultKeyParams(kTrustedVaultKey);
+  EntityData entity_data;
+  *entity_data.specifics.mutable_nigori() =
+      BuildTrustedVaultNigoriSpecifics({kTrustedVaultKeyParams});
+
+  ASSERT_TRUE(bridge()->SetKeystoreKeys({kRawKeystoreKey}));
+  ASSERT_THAT(bridge()->MergeSyncData(std::move(entity_data)),
+              Eq(base::nullopt));
+  ASSERT_TRUE(bridge()->Init());
+  ASSERT_TRUE(bridge()->HasPendingKeysForTesting());
+  bridge()->AddTrustedVaultDecryptionKeys({kTrustedVaultKey});
+  ASSERT_FALSE(bridge()->HasPendingKeysForTesting());
+  ASSERT_THAT(bridge()->GetPassphraseTypeForTesting(),
+              Eq(sync_pb::NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE));
+  ASSERT_THAT(bridge()->GetData(), Not(HasCustomPassphraseNigori()));
+
+  const KeyParams kKeystoreKeyParams = KeystoreKeyParams(kRawKeystoreKey);
+  EntityData new_entity_data;
+  *new_entity_data.specifics.mutable_nigori() = BuildKeystoreNigoriSpecifics(
+      /*keybag_keys_params=*/{kTrustedVaultKeyParams, kKeystoreKeyParams},
+      /*keystore_decryptor_params=*/kKeystoreKeyParams,
+      /*keystore_key_params=*/kKeystoreKeyParams);
+
+  EXPECT_CALL(*observer(), OnEncryptedTypesChanged(_, _)).Times(0);
+  EXPECT_CALL(*observer(), OnBootstrapTokenUpdated(_, _)).Times(0);
+  EXPECT_CALL(*observer(), OnCryptographerStateChanged(
+                               NotNull(), /*has_pending_keys=*/false));
+  EXPECT_CALL(
+      *observer(),
+      OnPassphraseTypeChanged(PassphraseType::kKeystorePassphrase, NullTime()));
+
+  EXPECT_THAT(bridge()->ApplySyncChanges(std::move(new_entity_data)),
+              Eq(base::nullopt));
+  EXPECT_THAT(bridge()->GetPassphraseTypeForTesting(),
+              Eq(sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE));
+  EXPECT_THAT(bridge()->GetEncryptedTypesForTesting(),
+              Eq(AlwaysEncryptedUserTypes()));
+  EXPECT_FALSE(bridge()->HasPendingKeysForTesting());
+
+  const Cryptographer& cryptographer = bridge()->GetCryptographerForTesting();
+  EXPECT_THAT(cryptographer, CanDecryptWith(kTrustedVaultKeyParams));
+  EXPECT_THAT(cryptographer, CanDecryptWith(kKeystoreKeyParams));
+  EXPECT_THAT(cryptographer, HasDefaultKeyDerivedFrom(kKeystoreKeyParams));
+}
+
+// Tests processing of remote incremental update that transits from trusted
+// vault to custom passphrase.
+TEST_F(NigoriSyncBridgeImplTest,
+       ShouldProcessRemoteTransitionFromTrustedVaultToCustomPassphrase) {
+  const KeyParams kTrustedVaultKeyParams =
+      TrustedVaultKeyParams(kTrustedVaultKey);
+  EntityData entity_data;
+  *entity_data.specifics.mutable_nigori() =
+      BuildTrustedVaultNigoriSpecifics({kTrustedVaultKeyParams});
+
+  ASSERT_TRUE(bridge()->SetKeystoreKeys({kRawKeystoreKey}));
+  ASSERT_THAT(bridge()->MergeSyncData(std::move(entity_data)),
+              Eq(base::nullopt));
+  ASSERT_TRUE(bridge()->Init());
+  ASSERT_TRUE(bridge()->HasPendingKeysForTesting());
+  bridge()->AddTrustedVaultDecryptionKeys({kTrustedVaultKey});
+  ASSERT_FALSE(bridge()->HasPendingKeysForTesting());
+  ASSERT_THAT(bridge()->GetPassphraseTypeForTesting(),
+              Eq(sync_pb::NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE));
+  ASSERT_THAT(bridge()->GetData(), Not(HasCustomPassphraseNigori()));
+
+  const KeyParams kCustomPassphraseKeyParams =
+      Pbkdf2KeyParams("custom_passphrase");
+  EntityData new_entity_data;
+  *new_entity_data.specifics.mutable_nigori() =
+      BuildCustomPassphraseNigoriSpecifics(
+          kCustomPassphraseKeyParams,
+          /*old_key_params=*/kTrustedVaultKeyParams);
+
+  EXPECT_CALL(*observer(), OnEncryptedTypesChanged(
+                               /*encrypted_types=*/EncryptableUserTypes(),
+                               /*encrypt_everything=*/true));
+  EXPECT_CALL(*observer(), OnCryptographerStateChanged(
+                               NotNull(), /*has_pending_keys=*/true));
+  EXPECT_CALL(*observer(),
+              OnPassphraseTypeChanged(PassphraseType::kCustomPassphrase,
+                                      Not(NullTime())));
+  EXPECT_THAT(bridge()->ApplySyncChanges(std::move(new_entity_data)),
+              Eq(base::nullopt));
+  EXPECT_TRUE(bridge()->HasPendingKeysForTesting());
+
+  EXPECT_CALL(*observer(), OnPassphraseAccepted());
+  EXPECT_CALL(*observer(), OnCryptographerStateChanged(
+                               NotNull(), /*has_pending_keys=*/false));
+  EXPECT_CALL(*observer(), OnBootstrapTokenUpdated(Ne(std::string()),
+                                                   PASSPHRASE_BOOTSTRAP_TOKEN));
+  bridge()->SetDecryptionPassphrase(kCustomPassphraseKeyParams.password);
+
+  const Cryptographer& cryptographer = bridge()->GetCryptographerForTesting();
+  EXPECT_THAT(cryptographer, CanDecryptWith(kTrustedVaultKeyParams));
+  EXPECT_THAT(cryptographer, CanDecryptWith(kCustomPassphraseKeyParams));
+  EXPECT_THAT(cryptographer,
+              HasDefaultKeyDerivedFrom(kCustomPassphraseKeyParams));
+}
+
+// Tests processing of remote incremental update that transits from trusted
+// vault to keystore passphrase, which doesn't contain trusted vault key. The
+// bridge should report model error.
+TEST_F(NigoriSyncBridgeImplTest,
+       ShouldFailOnInvalidRemoteTransitionFromTrustedVaultToKeystore) {
+  EntityData entity_data;
+  *entity_data.specifics.mutable_nigori() = BuildTrustedVaultNigoriSpecifics(
+      {TrustedVaultKeyParams(kTrustedVaultKey)});
+
+  ASSERT_TRUE(bridge()->SetKeystoreKeys({kRawKeystoreKey}));
+  ASSERT_THAT(bridge()->MergeSyncData(std::move(entity_data)),
+              Eq(base::nullopt));
+  ASSERT_TRUE(bridge()->Init());
+  ASSERT_TRUE(bridge()->HasPendingKeysForTesting());
+  bridge()->AddTrustedVaultDecryptionKeys({kTrustedVaultKey});
+  ASSERT_FALSE(bridge()->HasPendingKeysForTesting());
+  ASSERT_THAT(bridge()->GetPassphraseTypeForTesting(),
+              Eq(sync_pb::NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE));
+  ASSERT_THAT(bridge()->GetData(), Not(HasCustomPassphraseNigori()));
+
+  const KeyParams kKeystoreKeyParams = KeystoreKeyParams(kRawKeystoreKey);
+  // Don't populate kTrustedVaultKey into |new_entity_data|.
+  EntityData new_entity_data;
+  *new_entity_data.specifics.mutable_nigori() = BuildKeystoreNigoriSpecifics(
+      /*keybag_keys_params=*/{kKeystoreKeyParams},
+      /*keystore_decryptor_params=*/kKeystoreKeyParams,
+      /*keystore_key_params=*/kKeystoreKeyParams);
+
+  EXPECT_THAT(bridge()->ApplySyncChanges(std::move(new_entity_data)),
+              Ne(base::nullopt));
+}
+
+// Tests processing of remote incremental update that transits from trusted
+// vault to custom passphrase, which doesn't contain trusted vault key. The
+// bridge should report model error.
+TEST_F(NigoriSyncBridgeImplTest,
+       ShouldFailOnInvalidRemoteTransitionFromTrustedVaultToCustomPassphrase) {
+  EntityData entity_data;
+  *entity_data.specifics.mutable_nigori() = BuildTrustedVaultNigoriSpecifics(
+      {TrustedVaultKeyParams(kTrustedVaultKey)});
+
+  ASSERT_TRUE(bridge()->SetKeystoreKeys({kRawKeystoreKey}));
+  ASSERT_THAT(bridge()->MergeSyncData(std::move(entity_data)),
+              Eq(base::nullopt));
+  ASSERT_TRUE(bridge()->Init());
+  ASSERT_TRUE(bridge()->HasPendingKeysForTesting());
+  bridge()->AddTrustedVaultDecryptionKeys({kTrustedVaultKey});
+  ASSERT_FALSE(bridge()->HasPendingKeysForTesting());
+  ASSERT_THAT(bridge()->GetPassphraseTypeForTesting(),
+              Eq(sync_pb::NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE));
+  ASSERT_THAT(bridge()->GetData(), Not(HasCustomPassphraseNigori()));
+
+  const KeyParams kCustomPassphraseKeyParams =
+      Pbkdf2KeyParams("custom_passphrase");
+  // Don't populate kTrustedVaultKey into |new_entity_data|.
+  EntityData new_entity_data;
+  *new_entity_data.specifics.mutable_nigori() =
+      BuildCustomPassphraseNigoriSpecifics(kCustomPassphraseKeyParams);
+
+  // The bridge doesn't know whether update is valid until decryption, expect
+  // processing as a normal update.
+  EXPECT_CALL(*observer(), OnEncryptedTypesChanged(
+                               /*encrypted_types=*/EncryptableUserTypes(),
+                               /*encrypt_everything=*/true));
+  EXPECT_CALL(*observer(), OnCryptographerStateChanged(
+                               NotNull(), /*has_pending_keys=*/true));
+  EXPECT_CALL(*observer(),
+              OnPassphraseTypeChanged(PassphraseType::kCustomPassphrase,
+                                      Not(NullTime())));
+  EXPECT_THAT(bridge()->ApplySyncChanges(std::move(new_entity_data)),
+              Eq(base::nullopt));
+  EXPECT_TRUE(bridge()->HasPendingKeysForTesting());
+
+  // Once decryption passphrase is provided, bridge should ReportError().
+  EXPECT_CALL(*processor(), ReportError(_));
+  bridge()->SetDecryptionPassphrase(kCustomPassphraseKeyParams.password);
+}
+
+// Tests processing of remote incremental update that transits from trusted
+// vault to custom passphrase, which doesn't contain trusted vault key. Mimics
+// browser restart in between of receiving the remote update and providing
+// custom passphrase. The bridge should report model error.
+TEST(NigoriSyncBridgeImplPersistenceTest,
+     ShouldFailOnInvalidRemoteTransitionFromTrustedVaultAfterRestart) {
+  // Emulate storing on disc.
+  auto storage1 = std::make_unique<testing::NiceMock<MockNigoriStorage>>();
+  sync_pb::NigoriLocalData nigori_local_data;
+  ON_CALL(*storage1, StoreData(_))
+      .WillByDefault(testing::SaveArg<0>(&nigori_local_data));
+
+  const FakeEncryptor kEncryptor;
+  auto bridge1 = std::make_unique<NigoriSyncBridgeImpl>(
+      std::make_unique<testing::NiceMock<MockNigoriLocalChangeProcessor>>(),
+      std::move(storage1), &kEncryptor,
+      base::BindRepeating(&Nigori::GenerateScryptSalt),
+      /*packed_explicit_passphrase_key=*/std::string(),
+      /*packed_keystore_keys=*/std::string());
+
+  // Perform initial sync with trusted vault passphrase.
+  const std::vector<uint8_t> kTrustedVaultKey = {2, 3, 4, 5, 6};
+  EntityData entity_data;
+  *entity_data.specifics.mutable_nigori() = BuildTrustedVaultNigoriSpecifics(
+      {TrustedVaultKeyParams(kTrustedVaultKey)});
+
+  const std::vector<uint8_t> kRawKeystoreKey = {0, 1, 2, 3, 4};
+  ASSERT_TRUE(bridge1->SetKeystoreKeys({kRawKeystoreKey}));
+  ASSERT_THAT(bridge1->MergeSyncData(std::move(entity_data)),
+              Eq(base::nullopt));
+  ASSERT_TRUE(bridge1->Init());
+  ASSERT_TRUE(bridge1->HasPendingKeysForTesting());
+  bridge1->AddTrustedVaultDecryptionKeys({kTrustedVaultKey});
+  ASSERT_FALSE(bridge1->HasPendingKeysForTesting());
+  ASSERT_THAT(bridge1->GetPassphraseTypeForTesting(),
+              Eq(sync_pb::NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE));
+  ASSERT_THAT(bridge1->GetData(), Not(HasCustomPassphraseNigori()));
+
+  // Mimic invalid remote update with custom passphrase.
+  const KeyParams kCustomPassphraseKeyParams =
+      Pbkdf2KeyParams("custom_passphrase");
+  // Don't populate kTrustedVaultKeyParams into |new_entity_data|.
+  EntityData new_entity_data;
+  *new_entity_data.specifics.mutable_nigori() =
+      BuildCustomPassphraseNigoriSpecifics(kCustomPassphraseKeyParams);
+
+  // The bridge doesn't know whether update is valid until decryption, expect
+  // processing as a normal update.
+  ASSERT_THAT(bridge1->ApplySyncChanges(std::move(new_entity_data)),
+              Eq(base::nullopt));
+
+  // Create secondary storage which will return |nigori_local_data| on
+  // RestoreData() call.
+  auto storage2 = std::make_unique<testing::NiceMock<MockNigoriStorage>>();
+  ON_CALL(*storage2, RestoreData()).WillByDefault(Return(nigori_local_data));
+
+  // Create secondary processor.
+  auto processor2 =
+      std::make_unique<testing::NiceMock<MockNigoriLocalChangeProcessor>>();
+  // Once decryption passphrase is provided, bridge should ReportError().
+  EXPECT_CALL(*processor2, ReportError(_));
+
+  auto bridge2 = std::make_unique<NigoriSyncBridgeImpl>(
+      std::move(processor2), std::move(storage2), &kEncryptor,
+      base::BindRepeating(&Nigori::GenerateScryptSalt),
+      /*packed_explicit_passphrase_key=*/std::string(),
+      /*packed_keystore_keys=*/std::string());
+
+  bridge2->SetDecryptionPassphrase(kCustomPassphraseKeyParams.password);
+}
+
 TEST_F(NigoriSyncBridgeImplTest,
        ShouldNotAddDecryptionKeysToTrustedVaultCryptographer) {
   const std::vector<uint8_t> kTrustedVaultKey1{kTrustedVaultKey};
diff --git a/components/sync/protocol/nigori_local_data.proto b/components/sync/protocol/nigori_local_data.proto
index 561f1d7..ebf7a34f 100644
--- a/components/sync/protocol/nigori_local_data.proto
+++ b/components/sync/protocol/nigori_local_data.proto
@@ -90,6 +90,11 @@
   // Encryptor keystore decryptor token. Used for decryption of keystore Nigori
   // in case keystore keys arrived after NigoriSpecifics.
   optional EncryptedData pending_keystore_decryptor_token = 11;
+
+  // Contains the name of the latest available trusted vault key that was used
+  // as the default encryption key. Resets when the client go out of pending
+  // decryption state and transits to other passphrase types.
+  optional string last_default_trusted_vault_key_name = 12;
 }
 
 // Sync proto to store Nigori data in storage. Proto should be encrypted with
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h
index a31c124..55adec8 100644
--- a/components/sync/protocol/proto_visitors.h
+++ b/components/sync/protocol/proto_visitors.h
@@ -606,6 +606,7 @@
   VISIT_REP(encrypted_types_specifics_field_number);
   VISIT_REP(keystore_key);
   VISIT(pending_keystore_decryptor_token);
+  VISIT(last_default_trusted_vault_key_name);
 }
 
 VISIT_PROTO_FIELDS(const sync_pb::NigoriLocalData& proto) {
diff --git a/components/sync_bookmarks/bookmark_remote_updates_handler.cc b/components/sync_bookmarks/bookmark_remote_updates_handler.cc
index 02c72a3..aca5375 100644
--- a/components/sync_bookmarks/bookmark_remote_updates_handler.cc
+++ b/components/sync_bookmarks/bookmark_remote_updates_handler.cc
@@ -495,14 +495,7 @@
           ComputeChildNodeIndex(parent_node, update_entity.unique_position,
                                 bookmark_tracker_),
           update_entity.is_folder, bookmark_model_, favicon_service_);
-  if (!bookmark_node) {
-    // We ignore bookmarks we can't add.
-    DLOG(ERROR) << "Failed to create bookmark node with title "
-                << update_entity.specifics.bookmark().title() << " and url "
-                << update_entity.specifics.bookmark().url();
-    LogProblematicBookmark(RemoteBookmarkUpdateError::kCreationFailure);
-    return false;
-  }
+  DCHECK(bookmark_node);
   bookmark_tracker_->Add(update_entity.id, bookmark_node,
                          update.response_version, update_entity.creation_time,
                          update_entity.unique_position,
diff --git a/components/ui_devtools/devtools_server.cc b/components/ui_devtools/devtools_server.cc
index 2ded5e4..6545f64 100644
--- a/components/ui_devtools/devtools_server.cc
+++ b/components/ui_devtools/devtools_server.cc
@@ -10,6 +10,7 @@
 #include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/format_macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/components/ukm/content/source_url_recorder.cc b/components/ukm/content/source_url_recorder.cc
index a114e07..910d630 100644
--- a/components/ukm/content/source_url_recorder.cc
+++ b/components/ukm/content/source_url_recorder.cc
@@ -8,6 +8,7 @@
 
 #include "base/containers/flat_map.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial_params.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
diff --git a/components/upload_list/text_log_upload_list.cc b/components/upload_list/text_log_upload_list.cc
index a4b0446..6ccf151b 100644
--- a/components/upload_list/text_log_upload_list.cc
+++ b/components/upload_list/text_log_upload_list.cc
@@ -8,6 +8,8 @@
 #include <sstream>
 
 #include "base/files/file_util.h"
+#include "base/json/json_reader.h"
+#include "base/optional.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
@@ -17,6 +19,13 @@
 constexpr size_t kUploadTimeIndex = 0;
 constexpr size_t kCaptureTimeIndex = 3;
 
+constexpr char kJsonLogKeyUploadId[] = "upload_id";
+constexpr char kJsonLogKeyUploadTime[] = "upload_time";
+constexpr char kJsonLogKeyLocalId[] = "local_id";
+constexpr char kJsonLogKeyCaptureTime[] = "capture_time";
+constexpr char kJsonLogKeyState[] = "state";
+constexpr char kJsonLogKeySource[] = "source";
+
 std::vector<std::string> SplitIntoLines(const std::string& file_contents) {
   return base::SplitString(file_contents, base::kWhitespaceASCII,
                            base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
@@ -53,25 +62,52 @@
   return true;
 }
 
+bool CheckFieldOutOfRange(const std::string* time_string,
+                          const base::Time& begin,
+                          const base::Time& end) {
+  if (time_string) {
+    double upload_time_double = 0.0;
+    if (base::StringToDouble(*time_string, &upload_time_double)) {
+      base::Time upload_time = base::Time::FromDoubleT(upload_time_double);
+      if (begin <= upload_time && upload_time <= end)
+        return false;
+    }
+  }
+  return true;
+}
+
+bool CheckJsonUploadListOutOfRange(const base::Value& dict,
+                                   const base::Time& begin,
+                                   const base::Time& end) {
+  const std::string* upload_time_string =
+      dict.FindStringKey(kJsonLogKeyUploadTime);
+
+  const std::string* capture_time_string =
+      dict.FindStringKey(kJsonLogKeyCaptureTime);
+
+  return CheckFieldOutOfRange(upload_time_string, begin, end) &&
+         CheckFieldOutOfRange(capture_time_string, begin, end);
+}
+
 // Tries to parse one upload log line based on CSV format, then converts it to
-// a UploadInfo entry. If the conversion succeeds, it returns true and a valid
-// |info|. Otherwise, it returns false.
-bool TryParseCsvLogEntry(const std::string& log_line,
-                         std::unique_ptr<TextLogUploadList::UploadInfo>& info) {
+// a UploadInfo entry. If the conversion succeeds, it returns a valid UploadInfo
+// instance. Otherwise, it returns nullptr.
+std::unique_ptr<TextLogUploadList::UploadInfo> TryParseCsvLogEntry(
+    const std::string& log_line) {
   std::vector<std::string> components = SplitIntoComponents(log_line);
   // Skip any blank (or corrupted) lines.
   if (components.size() < 2 || components.size() > 5)
-    return false;
+    return nullptr;
   base::Time upload_time;
   double seconds_since_epoch;
   if (!components[kUploadTimeIndex].empty()) {
     if (!base::StringToDouble(components[kUploadTimeIndex],
                               &seconds_since_epoch))
-      return false;
+      return nullptr;
     upload_time = base::Time::FromDoubleT(seconds_since_epoch);
   }
-  info = std::make_unique<TextLogUploadList::UploadInfo>(components[1],
-                                                         upload_time);
+  auto info = std::make_unique<TextLogUploadList::UploadInfo>(components[1],
+                                                              upload_time);
 
   // Add local ID if present.
   if (components.size() > 2)
@@ -91,7 +127,57 @@
     info->state = static_cast<TextLogUploadList::UploadInfo::State>(state);
   }
 
-  return true;
+  return info;
+}
+
+// Tries to parse one upload log dictionary based on line-based JSON format (no
+// internal additional newline is permitted), then converts it to a UploadInfo
+// entry. If the conversion succeeds, it returns a valid UploadInfo instance.
+// Otherwise, it returns nullptr.
+std::unique_ptr<TextLogUploadList::UploadInfo> TryParseJsonLogEntry(
+    const base::Value& dict) {
+  // Parse upload_id.
+  const base::Value* upload_id_value = dict.FindKey(kJsonLogKeyUploadId);
+  std::string upload_id;
+  if (upload_id_value && !upload_id_value->GetAsString(&upload_id))
+    return nullptr;
+
+  // Parse upload_time.
+  const std::string* upload_time_string =
+      dict.FindStringKey(kJsonLogKeyUploadTime);
+  double upload_time_double = 0.0;
+  if (upload_time_string &&
+      !base::StringToDouble(*upload_time_string, &upload_time_double))
+    return nullptr;
+
+  auto info = std::make_unique<TextLogUploadList::UploadInfo>(
+      upload_id, base::Time::FromDoubleT(upload_time_double));
+
+  // Parse local_id.
+  const std::string* local_id = dict.FindStringKey(kJsonLogKeyLocalId);
+  if (local_id)
+    info->local_id = *local_id;
+
+  // Parse capture_time.
+  const std::string* capture_time_string =
+      dict.FindStringKey(kJsonLogKeyCaptureTime);
+  double capture_time_double = 0.0;
+  if (capture_time_string &&
+      base::StringToDouble(*capture_time_string, &capture_time_double))
+    info->capture_time = base::Time::FromDoubleT(capture_time_double);
+
+  // Parse state.
+  base::Optional<int> state = dict.FindIntKey(kJsonLogKeyState);
+  if (state.has_value())
+    info->state =
+        static_cast<TextLogUploadList::UploadInfo::State>(state.value());
+
+  // Parse source.
+  const std::string* source = dict.FindStringKey(kJsonLogKeySource);
+  if (source)
+    info->source = *source;
+
+  return info;
 }
 
 }  // namespace
@@ -124,7 +210,15 @@
 
   std::ostringstream new_contents_stream;
   for (const std::string& line : log_entries) {
-    if (CheckCsvUploadListOutOfRange(line, begin, end))
+    base::Optional<base::Value> json = base::JSONReader::Read(line);
+    bool should_copy = false;
+
+    if (json.has_value())
+      should_copy = CheckJsonUploadListOutOfRange(json.value(), begin, end);
+    else
+      should_copy = CheckCsvUploadListOutOfRange(line, begin, end);
+
+    if (should_copy)
       new_contents_stream << line << std::endl;
   }
 
@@ -144,8 +238,14 @@
   for (i = log_entries.rbegin(); i != log_entries.rend(); ++i) {
     const std::string& line = *i;
     std::unique_ptr<UploadInfo> info = nullptr;
+    base::Optional<base::Value> json = base::JSONReader::Read(line);
 
-    if (TryParseCsvLogEntry(line, info))
+    if (json.has_value())
+      info = TryParseJsonLogEntry(json.value());
+    else
+      info = TryParseCsvLogEntry(line);
+
+    if (info)
       uploads->push_back(*info);
   }
 }
diff --git a/components/upload_list/text_log_upload_list.h b/components/upload_list/text_log_upload_list.h
index 98ac183..78d635e 100644
--- a/components/upload_list/text_log_upload_list.h
+++ b/components/upload_list/text_log_upload_list.h
@@ -12,13 +12,19 @@
 #include "base/macros.h"
 #include "components/upload_list/upload_list.h"
 
-// Loads and parses an upload list text file of the format
+// Loads and parses an upload list text file of the line-based JSON format:
+// {"upload_time":<value>[,"upload_id":<value>[,"local_id":<value>
+// [,"capture_time":<value>[,"state":<value>[,"source":<value>]]]]]}
+// {"upload_time":<value>[,"upload_id":<value>[,"local_id":<value>
+// [,"capture_time":<value>[,"state":<value>[,"source":<value>]]]]]}
+// ...
+// or the CSV format:
 // upload_time,upload_id[,local_id[,capture_time[,state]]]
 // upload_time,upload_id[,local_id[,capture_time[,state]]]
-// etc.
+// ...
 // where each line represents an upload. |upload_time| and |capture_time| are in
 // Unix time. |state| is an int in the range of UploadInfo::State. A line may
-// or may not contain |local_id|, |capture_time|, and |state|.
+// or may not contain |local_id|, |capture_time|, |state| and |source|.
 class TextLogUploadList : public UploadList {
  public:
   // Creates a new upload list that parses the log at |upload_log_path|.
diff --git a/components/upload_list/text_log_upload_list_unittest.cc b/components/upload_list/text_log_upload_list_unittest.cc
index ba2f874..29434b4 100644
--- a/components/upload_list/text_log_upload_list_unittest.cc
+++ b/components/upload_list/text_log_upload_list_unittest.cc
@@ -23,6 +23,7 @@
 const char kTestUploadId[] = "0123456789abcdef";
 const char kTestLocalID[] = "fedcba9876543210";
 const char kTestCaptureTime[] = "2345678901";
+const char kTestSource[] = "test_source";
 
 class TextLogUploadListTest : public testing::Test {
  public:
@@ -83,6 +84,33 @@
   EXPECT_STREQ("0", base::NumberToString(time_double).c_str());
 }
 
+TEST_F(TextLogUploadListTest, ParseUploadTimeUploadId_JSON) {
+  std::stringstream stream;
+  stream << "{";
+  stream << "\"upload_time\":\"" << kTestUploadTime << "\",";
+  stream << "\"upload_id\":\"" << kTestUploadId << "\"";
+  stream << "}" << std::endl;
+  WriteUploadLog(stream.str());
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
+
+  std::vector<UploadList::UploadInfo> uploads;
+  upload_list->GetUploads(999, &uploads);
+
+  EXPECT_EQ(1u, uploads.size());
+  double time_double = uploads[0].upload_time.ToDoubleT();
+  EXPECT_STREQ(kTestUploadTime, base::NumberToString(time_double).c_str());
+  EXPECT_STREQ(kTestUploadId, uploads[0].upload_id.c_str());
+  EXPECT_STREQ("", uploads[0].local_id.c_str());
+  time_double = uploads[0].capture_time.ToDoubleT();
+  EXPECT_STREQ("0", base::NumberToString(time_double).c_str());
+}
+
 // Test log entry string with upload time, upload ID and local ID.
 // This is the old format that WebRTC logs were stored in.
 TEST_F(TextLogUploadListTest, ParseUploadTimeUploadIdLocalId) {
@@ -112,6 +140,34 @@
   EXPECT_STREQ("0", base::NumberToString(time_double).c_str());
 }
 
+TEST_F(TextLogUploadListTest, ParseUploadTimeUploadIdLocalId_JSON) {
+  std::stringstream stream;
+  stream << "{";
+  stream << "\"upload_time\":\"" << kTestUploadTime << "\",";
+  stream << "\"upload_id\":\"" << kTestUploadId << "\",";
+  stream << "\"local_id\":\"" << kTestLocalID << "\"";
+  stream << "}" << std::endl;
+  WriteUploadLog(stream.str());
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
+
+  std::vector<UploadList::UploadInfo> uploads;
+  upload_list->GetUploads(999, &uploads);
+
+  EXPECT_EQ(1u, uploads.size());
+  double time_double = uploads[0].upload_time.ToDoubleT();
+  EXPECT_STREQ(kTestUploadTime, base::NumberToString(time_double).c_str());
+  EXPECT_STREQ(kTestUploadId, uploads[0].upload_id.c_str());
+  EXPECT_STREQ(kTestLocalID, uploads[0].local_id.c_str());
+  time_double = uploads[0].capture_time.ToDoubleT();
+  EXPECT_STREQ("0", base::NumberToString(time_double).c_str());
+}
+
 // Test log entry string with upload time, upload ID and capture time.
 // This is the format that WebRTC logs that only have been uploaded only are
 // stored in.
@@ -142,6 +198,34 @@
   EXPECT_STREQ(kTestCaptureTime, base::NumberToString(time_double).c_str());
 }
 
+TEST_F(TextLogUploadListTest, ParseUploadTimeUploadIdCaptureTime_JSON) {
+  std::stringstream stream;
+  stream << "{";
+  stream << "\"upload_time\":\"" << kTestUploadTime << "\",";
+  stream << "\"upload_id\":\"" << kTestUploadId << "\",";
+  stream << "\"capture_time\":\"" << kTestCaptureTime << "\"";
+  stream << "}" << std::endl;
+  WriteUploadLog(stream.str());
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
+
+  std::vector<UploadList::UploadInfo> uploads;
+  upload_list->GetUploads(999, &uploads);
+
+  EXPECT_EQ(1u, uploads.size());
+  double time_double = uploads[0].upload_time.ToDoubleT();
+  EXPECT_STREQ(kTestUploadTime, base::NumberToString(time_double).c_str());
+  EXPECT_STREQ(kTestUploadId, uploads[0].upload_id.c_str());
+  EXPECT_STREQ("", uploads[0].local_id.c_str());
+  time_double = uploads[0].capture_time.ToDoubleT();
+  EXPECT_STREQ(kTestCaptureTime, base::NumberToString(time_double).c_str());
+}
+
 // Test log entry string with local ID and capture time.
 // This is the format that WebRTC logs that only are stored locally are stored
 // in.
@@ -171,6 +255,33 @@
   EXPECT_STREQ(kTestCaptureTime, base::NumberToString(time_double).c_str());
 }
 
+TEST_F(TextLogUploadListTest, ParseLocalIdCaptureTime_JSON) {
+  std::stringstream stream;
+  stream << "{";
+  stream << "\"local_id\":\"" << kTestLocalID << "\",";
+  stream << "\"capture_time\":\"" << kTestCaptureTime << "\"";
+  stream << "}" << std::endl;
+  WriteUploadLog(stream.str());
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
+
+  std::vector<UploadList::UploadInfo> uploads;
+  upload_list->GetUploads(999, &uploads);
+
+  EXPECT_EQ(1u, uploads.size());
+  double time_double = uploads[0].upload_time.ToDoubleT();
+  EXPECT_STREQ("0", base::NumberToString(time_double).c_str());
+  EXPECT_STREQ("", uploads[0].upload_id.c_str());
+  EXPECT_STREQ(kTestLocalID, uploads[0].local_id.c_str());
+  time_double = uploads[0].capture_time.ToDoubleT();
+  EXPECT_STREQ(kTestCaptureTime, base::NumberToString(time_double).c_str());
+}
+
 // Test log entry string with upload time, upload ID, local ID and capture
 // time.
 // This is the format that WebRTC logs that are stored locally and have been
@@ -204,6 +315,35 @@
   EXPECT_STREQ(kTestCaptureTime, base::NumberToString(time_double).c_str());
 }
 
+TEST_F(TextLogUploadListTest, ParseUploadTimeUploadIdLocalIdCaptureTime_JSON) {
+  std::stringstream stream;
+  stream << "{";
+  stream << "\"upload_time\":\"" << kTestUploadTime << "\",";
+  stream << "\"upload_id\":\"" << kTestUploadId << "\",";
+  stream << "\"local_id\":\"" << kTestLocalID << "\",";
+  stream << "\"capture_time\":\"" << kTestCaptureTime << "\"";
+  stream << "}" << std::endl;
+  WriteUploadLog(stream.str());
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
+
+  std::vector<UploadList::UploadInfo> uploads;
+  upload_list->GetUploads(999, &uploads);
+
+  EXPECT_EQ(1u, uploads.size());
+  double time_double = uploads[0].upload_time.ToDoubleT();
+  EXPECT_STREQ(kTestUploadTime, base::NumberToString(time_double).c_str());
+  EXPECT_STREQ(kTestUploadId, uploads[0].upload_id.c_str());
+  EXPECT_STREQ(kTestLocalID, uploads[0].local_id.c_str());
+  time_double = uploads[0].capture_time.ToDoubleT();
+  EXPECT_STREQ(kTestCaptureTime, base::NumberToString(time_double).c_str());
+}
+
 TEST_F(TextLogUploadListTest, ParseMultipleEntries) {
   std::string test_entry;
   for (int i = 1; i <= 4; ++i) {
@@ -240,6 +380,40 @@
   }
 }
 
+TEST_F(TextLogUploadListTest, ParseMultipleEntries_JSON) {
+  std::stringstream stream;
+  for (int i = 1; i <= 4; ++i) {
+    stream << "{";
+    stream << "\"upload_time\":\"" << kTestUploadTime << "\",";
+    stream << "\"upload_id\":\"" << kTestUploadId << "\",";
+    stream << "\"local_id\":\"" << i << "\",";
+    stream << "\"capture_time\":\"" << kTestCaptureTime << "\"";
+    stream << "}" << std::endl;
+  }
+  WriteUploadLog(stream.str());
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
+
+  std::vector<UploadList::UploadInfo> uploads;
+  upload_list->GetUploads(999, &uploads);
+
+  EXPECT_EQ(4u, uploads.size());
+  // The entries order should be reversed during the parsing.
+  for (size_t i = 0; i < uploads.size(); ++i) {
+    double time_double = uploads[i].upload_time.ToDoubleT();
+    EXPECT_STREQ(kTestUploadTime, base::NumberToString(time_double).c_str());
+    EXPECT_STREQ(kTestUploadId, uploads[i].upload_id.c_str());
+    EXPECT_EQ(base::NumberToString(uploads.size() - i), uploads[i].local_id);
+    time_double = uploads[i].capture_time.ToDoubleT();
+    EXPECT_STREQ(kTestCaptureTime, base::NumberToString(time_double).c_str());
+  }
+}
+
 TEST_F(TextLogUploadListTest, ParseWithState) {
   std::string test_entry;
   for (int i = 1; i <= 4; ++i) {
@@ -279,6 +453,149 @@
   }
 }
 
+TEST_F(TextLogUploadListTest, ParseWithState_JSON) {
+  std::stringstream stream;
+  for (int i = 1; i <= 4; ++i) {
+    stream << "{";
+    stream << "\"upload_time\":\"" << kTestUploadTime << "\",";
+    stream << "\"upload_id\":\"" << kTestUploadId << "\",";
+    stream << "\"local_id\":\"" << kTestLocalID << "\",";
+    stream << "\"capture_time\":\"" << kTestCaptureTime << "\",";
+    stream << "\"state\":"
+           << static_cast<int>(UploadList::UploadInfo::State::Uploaded);
+    stream << "}" << std::endl;
+  }
+  WriteUploadLog(stream.str());
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
+
+  std::vector<UploadList::UploadInfo> uploads;
+  upload_list->GetUploads(999, &uploads);
+
+  EXPECT_EQ(4u, uploads.size());
+  for (const UploadList::UploadInfo& upload : uploads) {
+    double time_double = upload.upload_time.ToDoubleT();
+    EXPECT_STREQ(kTestUploadTime, base::NumberToString(time_double).c_str());
+    EXPECT_STREQ(kTestUploadId, upload.upload_id.c_str());
+    EXPECT_STREQ(kTestLocalID, upload.local_id.c_str());
+    time_double = upload.capture_time.ToDoubleT();
+    EXPECT_STREQ(kTestCaptureTime, base::NumberToString(time_double).c_str());
+    EXPECT_EQ(UploadList::UploadInfo::State::Uploaded, upload.state);
+  }
+}
+
+TEST_F(TextLogUploadListTest, ParseWithSource_JSON) {
+  std::stringstream stream;
+  for (int i = 1; i <= 4; ++i) {
+    stream << "{";
+    stream << "\"upload_time\":\"" << kTestUploadTime << "\",";
+    stream << "\"upload_id\":\"" << kTestUploadId << "\",";
+    stream << "\"local_id\":\"" << kTestLocalID << "\",";
+    stream << "\"capture_time\":\"" << kTestCaptureTime << "\",";
+    stream << "\"state\":"
+           << static_cast<int>(UploadList::UploadInfo::State::Uploaded) << ",";
+    stream << "\"source\":\"" << kTestSource << "\"";
+    stream << "}" << std::endl;
+  }
+  WriteUploadLog(stream.str());
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
+
+  std::vector<UploadList::UploadInfo> uploads;
+  upload_list->GetUploads(999, &uploads);
+
+  EXPECT_EQ(4u, uploads.size());
+  for (const UploadList::UploadInfo& upload : uploads) {
+    double time_double = upload.upload_time.ToDoubleT();
+    EXPECT_STREQ(kTestUploadTime, base::NumberToString(time_double).c_str());
+    EXPECT_STREQ(kTestUploadId, upload.upload_id.c_str());
+    EXPECT_STREQ(kTestLocalID, upload.local_id.c_str());
+    time_double = upload.capture_time.ToDoubleT();
+    EXPECT_STREQ(kTestCaptureTime, base::NumberToString(time_double).c_str());
+    EXPECT_EQ(UploadList::UploadInfo::State::Uploaded, upload.state);
+    EXPECT_STREQ(kTestSource, upload.source.c_str());
+  }
+}
+
+TEST_F(TextLogUploadListTest, ParseHybridFormat) {
+  std::stringstream stream;
+  for (int i = 1; i <= 4; ++i) {
+    stream << kTestUploadTime << ",";
+    stream << kTestUploadId << ",";
+    stream << kTestLocalID << ",";
+    stream << kTestCaptureTime << std::endl;
+  }
+
+  for (int i = 1; i <= 4; ++i) {
+    stream << "{";
+    stream << "\"upload_time\":\"" << kTestUploadTime << "\",";
+    stream << "\"upload_id\":\"" << kTestUploadId << "\",";
+    stream << "\"local_id\":\"" << kTestLocalID << "\",";
+    stream << "\"capture_time\":\"" << kTestCaptureTime << "\"";
+    stream << "}" << std::endl;
+  }
+  WriteUploadLog(stream.str());
+  std::cout << stream.str() << std::endl;
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
+
+  std::vector<UploadList::UploadInfo> uploads;
+  upload_list->GetUploads(999, &uploads);
+
+  EXPECT_EQ(8u, uploads.size());
+  for (const UploadList::UploadInfo& upload : uploads) {
+    double time_double = upload.upload_time.ToDoubleT();
+    EXPECT_STREQ(kTestUploadTime, base::NumberToString(time_double).c_str());
+    EXPECT_STREQ(kTestUploadId, upload.upload_id.c_str());
+    EXPECT_STREQ(kTestLocalID, upload.local_id.c_str());
+    time_double = upload.capture_time.ToDoubleT();
+    EXPECT_STREQ(kTestCaptureTime, base::NumberToString(time_double).c_str());
+  }
+}
+
+TEST_F(TextLogUploadListTest, SkipInvalidEntry_JSON) {
+  std::stringstream stream;
+  // the first JSON entry contains the invalid |upload_id|.
+  stream << "{";
+  stream << "\"upload_time\":\"" << kTestCaptureTime << "\",";
+  stream << "\"upload_id\":0.1234";
+  stream << "}" << std::endl;
+  // the second JSON entry is valid.
+  stream << "{";
+  stream << "\"upload_time\":\"" << kTestCaptureTime << "\",";
+  stream << "\"upload_id\":\"" << kTestLocalID << "\"";
+  stream << "}" << std::endl;
+  WriteUploadLog(stream.str());
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
+
+  std::vector<UploadList::UploadInfo> uploads;
+  upload_list->GetUploads(999, &uploads);
+
+  // The invalid JSON entry should be skipped.
+  EXPECT_EQ(1u, uploads.size());
+}
+
 TEST_F(TextLogUploadListTest, ClearUsingUploadTime) {
   constexpr time_t kTestTime = 1234u;
   constexpr char kOtherEntry[] = "4567,def\n";
@@ -301,6 +618,38 @@
   EXPECT_EQ(kOtherEntry, contents);
 }
 
+TEST_F(TextLogUploadListTest, ClearUsingUploadTime_JSON) {
+  constexpr time_t kTestTime = 1234u;
+
+  std::stringstream stream_other_entry;
+  stream_other_entry << "{";
+  stream_other_entry << "\"upload_time\":\"4567\",";
+  stream_other_entry << "\"upload_id\":\"def\"";
+  stream_other_entry << "}" << std::endl;
+  std::string other_entry = stream_other_entry.str();
+
+  std::stringstream stream;
+  stream << "{";
+  stream << "\"upload_time\":\"" << kTestTime << "\",";
+  stream << "\"upload_id\":\"abc\"";
+  stream << "}" << std::endl;
+  stream << other_entry;
+  WriteUploadLog(stream.str());
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  base::RunLoop run_loop;
+  upload_list->Clear(base::Time::FromTimeT(kTestTime),
+                     base::Time::FromTimeT(kTestTime + 1),
+                     run_loop.QuitClosure());
+  run_loop.Run();
+
+  std::string contents;
+  base::ReadFileToString(log_path(), &contents);
+  EXPECT_EQ(other_entry, contents);
+}
+
 TEST_F(TextLogUploadListTest, ClearUsingCaptureTime) {
   constexpr time_t kTestTime = 1234u;
   constexpr char kOtherEntry[] = "4567,def,def,7890\n";
@@ -324,6 +673,42 @@
   EXPECT_EQ(kOtherEntry, contents);
 }
 
+TEST_F(TextLogUploadListTest, ClearUsingCaptureTime_JSON) {
+  constexpr time_t kTestTime = 1234u;
+
+  std::stringstream stream_other_entry;
+  stream_other_entry << "{";
+  stream_other_entry << "\"upload_time\":\"4567\",";
+  stream_other_entry << "\"upload_id\":\"def\",";
+  stream_other_entry << "\"local_id\":\"def\",";
+  stream_other_entry << "\"capture_time\":\"7890\"";
+  stream_other_entry << "}" << std::endl;
+  std::string other_entry = stream_other_entry.str();
+
+  std::stringstream stream;
+  stream << "{";
+  stream << "\"upload_time\":\"4567\",";
+  stream << "\"upload_id\":\"abc\",";
+  stream << "\"local_id\":\"abc\",";
+  stream << "\"capture_time\":\"" << kTestTime << "\"";
+  stream << "}" << std::endl;
+  stream << other_entry;
+  WriteUploadLog(stream.str());
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  base::RunLoop run_loop;
+  upload_list->Clear(base::Time::FromTimeT(kTestTime),
+                     base::Time::FromTimeT(kTestTime + 1),
+                     run_loop.QuitClosure());
+  run_loop.Run();
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(log_path(), &contents));
+  EXPECT_EQ(other_entry, contents);
+}
+
 TEST_F(TextLogUploadListTest, ClearingAllDataDeletesFile) {
   constexpr time_t kTestTime = 1234u;
   std::string test_entry = base::NumberToString(kTestTime);
@@ -342,6 +727,28 @@
   EXPECT_FALSE(base::PathExists(log_path()));
 }
 
+TEST_F(TextLogUploadListTest, ClearingAllDataDeletesFile_JSON) {
+  constexpr time_t kTestTime = 1234u;
+
+  std::stringstream stream;
+  stream << "{";
+  stream << "\"upload_time\":\"" << kTestTime << "\",";
+  stream << "\"upload_id\":\"abc\"";
+  stream << "}" << std::endl;
+  WriteUploadLog(stream.str());
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  base::RunLoop run_loop;
+  upload_list->Clear(base::Time::FromTimeT(kTestTime),
+                     base::Time::FromTimeT(kTestTime + 1),
+                     run_loop.QuitClosure());
+  run_loop.Run();
+
+  EXPECT_FALSE(base::PathExists(log_path()));
+}
+
 // https://crbug.com/597384
 TEST_F(TextLogUploadListTest, SimultaneousAccess) {
   std::string test_entry = kTestUploadTime;
@@ -383,4 +790,44 @@
   task_environment_.RunUntilIdle();
 }
 
+TEST_F(TextLogUploadListTest, SimultaneousAccess_JSON) {
+  std::stringstream stream;
+  stream << "{";
+  stream << "\"upload_time\":\"" << kTestUploadTime << "\",";
+  stream << "\"upload_id\":\"" << kTestUploadId << "\",";
+  stream << "\"local_id\":\"" << kTestLocalID << "\",";
+  stream << "\"capture_time\":\"" << kTestCaptureTime << "\"";
+  stream << "}" << std::endl;
+  WriteUploadLog(stream.str());
+
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
+
+  // Queue up a bunch of loads, waiting only for the first one to complete.
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
+
+  for (int i = 1; i <= 20; ++i) {
+    upload_list->Load(base::OnceClosure());
+  }
+
+  // Read the list a few times to try and race one of the loads above.
+  for (int i = 1; i <= 4; ++i) {
+    std::vector<UploadList::UploadInfo> uploads;
+    upload_list->GetUploads(999, &uploads);
+
+    EXPECT_EQ(1u, uploads.size());
+    double time_double = uploads[0].upload_time.ToDoubleT();
+    EXPECT_STREQ(kTestUploadTime, base::NumberToString(time_double).c_str());
+    EXPECT_STREQ(kTestUploadId, uploads[0].upload_id.c_str());
+    EXPECT_STREQ(kTestLocalID, uploads[0].local_id.c_str());
+    time_double = uploads[0].capture_time.ToDoubleT();
+    EXPECT_STREQ(kTestCaptureTime, base::NumberToString(time_double).c_str());
+  }
+
+  // Allow the remaining loads to complete.
+  task_environment_.RunUntilIdle();
+}
+
 }  // namespace
diff --git a/components/upload_list/upload_list.cc b/components/upload_list/upload_list.cc
index b5323cf8..ea718a40 100644
--- a/components/upload_list/upload_list.cc
+++ b/components/upload_list/upload_list.cc
@@ -52,6 +52,7 @@
       local_id(upload_info.local_id),
       capture_time(upload_info.capture_time),
       state(upload_info.state),
+      source(upload_info.source),
       file_size(upload_info.file_size) {}
 
 UploadList::UploadInfo::~UploadInfo() = default;
diff --git a/components/upload_list/upload_list.h b/components/upload_list/upload_list.h
index 7a1a7ea..20358339 100644
--- a/components/upload_list/upload_list.h
+++ b/components/upload_list/upload_list.h
@@ -59,6 +59,9 @@
 
     State state;
 
+    // Identifies where the crash comes from.
+    std::string source;
+
     // Formatted file size for locally stored data.
     base::string16 file_size;
   };
diff --git a/components/viz/service/compositor_frame_fuzzer/fuzzer_browser_process.cc b/components/viz/service/compositor_frame_fuzzer/fuzzer_browser_process.cc
index 5e01104..d41bc4d 100644
--- a/components/viz/service/compositor_frame_fuzzer/fuzzer_browser_process.cc
+++ b/components/viz/service/compositor_frame_fuzzer/fuzzer_browser_process.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "components/viz/common/quads/solid_color_draw_quad.h"
 #include "components/viz/common/quads/surface_draw_quad.h"
diff --git a/components/viz/service/display/frame_rate_decider_unittest.cc b/components/viz/service/display/frame_rate_decider_unittest.cc
index 207901f..58d7c1a 100644
--- a/components/viz/service/display/frame_rate_decider_unittest.cc
+++ b/components/viz/service/display/frame_rate_decider_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "components/viz/service/display/frame_rate_decider.h"
 
+#include "base/callback_helpers.h"
 #include "components/viz/common/frame_sinks/begin_frame_source.h"
 #include "components/viz/common/surfaces/surface_info.h"
 #include "components/viz/service/surfaces/surface.h"
diff --git a/components/viz/service/display/overlay_processor_interface.cc b/components/viz/service/display/overlay_processor_interface.cc
index 2762495..4ca18ae 100644
--- a/components/viz/service/display/overlay_processor_interface.cc
+++ b/components/viz/service/display/overlay_processor_interface.cc
@@ -4,6 +4,7 @@
 
 #include "components/viz/service/display/overlay_processor_interface.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "components/viz/common/display/renderer_settings.h"
 #include "components/viz/common/features.h"
diff --git a/components/viz/service/display_embedder/skia_output_surface_dependency_impl.cc b/components/viz/service/display_embedder/skia_output_surface_dependency_impl.cc
index 5e41caf..2e0c8dc 100644
--- a/components/viz/service/display_embedder/skia_output_surface_dependency_impl.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_dependency_impl.cc
@@ -4,6 +4,7 @@
 
 #include "components/viz/service/display_embedder/skia_output_surface_dependency_impl.h"
 
+#include "base/callback_helpers.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "components/viz/service/gl/gpu_service_impl.h"
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
index 7c7d53c..b0809e3 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
@@ -51,6 +51,7 @@
 #include "gpu/config/gpu_preferences.h"
 #include "gpu/ipc/common/command_buffer_id.h"
 #include "gpu/ipc/common/gpu_client_ids.h"
+#include "gpu/ipc/common/gpu_peak_memory.h"
 #include "gpu/ipc/common/gpu_surface_lookup.h"
 #include "gpu/vulkan/buildflags.h"
 #include "skia/buildflags.h"
@@ -147,7 +148,9 @@
     uint64_t old_size = size_;
     size_ += delta;
     DCHECK(observer_);
-    observer_->OnMemoryAllocatedChange(command_buffer_id_, old_size, size_);
+    observer_->OnMemoryAllocatedChange(
+        command_buffer_id_, old_size, size_,
+        gpu::GpuPeakMemoryAllocationSource::SKIA);
   }
   uint64_t GetSize() const override { return size_; }
   uint64_t ClientTracingId() const override { return client_tracing_id_; }
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.h b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
index ccdc58c..14af688 100644
--- a/components/viz/service/frame_sinks/frame_sink_manager_impl.h
+++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
@@ -11,6 +11,7 @@
 #include <string>
 #include <vector>
 
+#include "base/callback_helpers.h"
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
 #include "base/containers/unique_ptr_adapters.h"
diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
index 149855e..75d3922 100644
--- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
+++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/compiler_specific.h"
+#include "base/memory/ptr_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "components/viz/common/frame_sinks/begin_frame_source.h"
diff --git a/components/viz/service/gl/gpu_service_impl.cc b/components/viz/service/gl/gpu_service_impl.cc
index b8ae21ea..73ac7f9d 100644
--- a/components/viz/service/gl/gpu_service_impl.cc
+++ b/components/viz/service/gl/gpu_service_impl.cc
@@ -34,6 +34,7 @@
 #include "gpu/config/skia_limits.h"
 #include "gpu/ipc/common/gpu_client_ids.h"
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
+#include "gpu/ipc/common/gpu_peak_memory.h"
 #include "gpu/ipc/common/memory_stats.h"
 #include "gpu/ipc/in_process_command_buffer.h"
 #include "gpu/ipc/service/gpu_channel.h"
@@ -994,9 +995,12 @@
 void GpuServiceImpl::GetPeakMemoryUsageOnMainThread(
     uint32_t sequence_num,
     GetPeakMemoryUsageCallback callback) {
-  uint64_t peak_memory = gpu_channel_manager_->GetPeakMemoryUsage(sequence_num);
+  uint64_t peak_memory = 0u;
+  auto allocation_per_source =
+      gpu_channel_manager_->GetPeakMemoryUsage(sequence_num, &peak_memory);
   io_runner_->PostTask(FROM_HERE,
-                       base::BindOnce(std::move(callback), peak_memory));
+                       base::BindOnce(std::move(callback), peak_memory,
+                                      std::move(allocation_per_source)));
 }
 
 void GpuServiceImpl::MaybeExit(bool for_context_loss) {
diff --git a/content/browser/accessibility/accessibility_browsertest.cc b/content/browser/accessibility/accessibility_browsertest.cc
index f44236f..697b4c2a 100644
--- a/content/browser/accessibility/accessibility_browsertest.cc
+++ b/content/browser/accessibility/accessibility_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "content/browser/accessibility/accessibility_browsertest.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "content/browser/accessibility/browser_accessibility.h"
 #include "content/browser/renderer_host/render_widget_host_view_aura.h"
diff --git a/content/browser/android/javascript_injector.cc b/content/browser/android/javascript_injector.cc
index 807e917ce..58b6d44 100644
--- a/content/browser/android/javascript_injector.cc
+++ b/content/browser/android/javascript_injector.cc
@@ -5,6 +5,7 @@
 #include "content/browser/android/javascript_injector.h"
 
 #include "base/android/jni_string.h"
+#include "base/memory/ptr_util.h"
 #include "content/browser/android/java/gin_java_bridge_dispatcher_host.h"
 #include "content/public/android/content_jni_headers/JavascriptInjectorImpl_jni.h"
 
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc
index 3ababa1..d600228f 100644
--- a/content/browser/back_forward_cache_browsertest.cc
+++ b/content/browser/back_forward_cache_browsertest.cc
@@ -5,6 +5,7 @@
 #include <memory>
 #include <unordered_map>
 
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/hash/hash.h"
 #include "base/location.h"
diff --git a/content/browser/background_sync/background_sync_manager.cc b/content/browser/background_sync/background_sync_manager.cc
index 3b18a02..8259e4a 100644
--- a/content/browser/background_sync/background_sync_manager.cc
+++ b/content/browser/background_sync/background_sync_manager.cc
@@ -10,7 +10,9 @@
 #include "base/barrier_closure.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/content/browser/background_sync/background_sync_scheduler_unittest.cc b/content/browser/background_sync/background_sync_scheduler_unittest.cc
index 9d9bcc3..d57492cdd 100644
--- a/content/browser/background_sync/background_sync_scheduler_unittest.cc
+++ b/content/browser/background_sync/background_sync_scheduler_unittest.cc
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback_forward.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/content/browser/background_sync/background_sync_service_impl_test_harness.cc b/content/browser/background_sync/background_sync_service_impl_test_harness.cc
index 451c147..20e01f4 100644
--- a/content/browser/background_sync/background_sync_service_impl_test_harness.cc
+++ b/content/browser/background_sync/background_sync_service_impl_test_harness.cc
@@ -9,6 +9,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/run_loop.h"
 #include "content/browser/background_sync/background_sync_manager.h"
 #include "content/browser/background_sync/background_sync_network_observer.h"
diff --git a/content/browser/battery_monitor_browsertest.cc b/content/browser/battery_monitor_browsertest.cc
index a450aad..12d9493a 100644
--- a/content/browser/battery_monitor_browsertest.cc
+++ b/content/browser/battery_monitor_browsertest.cc
@@ -5,6 +5,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
 #include "content/public/browser/web_contents.h"
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl.cc b/content/browser/bluetooth/web_bluetooth_service_impl.cc
index b9941e3..0bdcae4b 100644
--- a/content/browser/bluetooth/web_bluetooth_service_impl.cc
+++ b/content/browser/bluetooth/web_bluetooth_service_impl.cc
@@ -15,6 +15,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc
index 25d9df5..bfbfe9b3 100644
--- a/content/browser/browser_plugin/browser_plugin_guest.cc
+++ b/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -13,6 +13,7 @@
 
 #include "base/bind.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/user_metrics.h"
 #include "base/pickle.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/content/browser/cache_storage/cache_storage_cache_entry_handler.cc b/content/browser/cache_storage/cache_storage_cache_entry_handler.cc
index 999def2..0df6653 100644
--- a/content/browser/cache_storage/cache_storage_cache_entry_handler.cc
+++ b/content/browser/cache_storage/cache_storage_cache_entry_handler.cc
@@ -4,6 +4,7 @@
 
 #include "content/browser/cache_storage/cache_storage_cache_entry_handler.h"
 
+#include "base/callback_helpers.h"
 #include "base/guid.h"
 #include "base/optional.h"
 #include "content/browser/background_fetch/storage/cache_entry_handler_impl.h"
diff --git a/content/browser/cache_storage/cache_storage_cache_unittest.cc b/content/browser/cache_storage/cache_storage_cache_unittest.cc
index a5c3677..f94877a 100644
--- a/content/browser/cache_storage/cache_storage_cache_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_cache_unittest.cc
@@ -11,6 +11,8 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/files/file_path.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/logging.h"
diff --git a/content/browser/cache_storage/cross_sequence/cross_sequence_cache_storage_manager.cc b/content/browser/cache_storage/cross_sequence/cross_sequence_cache_storage_manager.cc
index c40c5cd4..d42e7d7 100644
--- a/content/browser/cache_storage/cross_sequence/cross_sequence_cache_storage_manager.cc
+++ b/content/browser/cache_storage/cross_sequence/cross_sequence_cache_storage_manager.cc
@@ -4,6 +4,7 @@
 
 #include "content/browser/cache_storage/cross_sequence/cross_sequence_cache_storage_manager.h"
 
+#include "base/bind_helpers.h"
 #include "content/browser/cache_storage/cache_storage.h"
 #include "content/browser/cache_storage/cache_storage_context_impl.h"
 #include "content/browser/cache_storage/cross_sequence/cross_sequence_cache_storage.h"
diff --git a/content/browser/client_hints/client_hints.cc b/content/browser/client_hints/client_hints.cc
index d4a05ac..c15f6ec 100644
--- a/content/browser/client_hints/client_hints.cc
+++ b/content/browser/client_hints/client_hints.cc
@@ -362,6 +362,17 @@
   SetHeaderToString(headers, type, value);
 }
 
+std::string AddQuotes(std::string str) {
+  return base::StringPrintf("\"%s\"", str.c_str());
+}
+
+std::string AddBrandVersionQuotes(std::string brand, std::string version) {
+  if (version.empty()) {
+    return AddQuotes(brand);
+  }
+  return base::StringPrintf("\"%s\"; v=\"%s\"", brand.c_str(), version.c_str());
+}
+
 bool IsFeaturePolicyForClientHintsEnabled() {
   return base::FeatureList::IsEnabled(features::kFeaturePolicyForClientHints);
 }
@@ -491,9 +502,7 @@
             ? ua.full_version
             : ua.major_version;
     AddUAHeader(headers, blink::mojom::WebClientHintsType::kUA,
-                version.empty() ? ua.brand
-                                : base::StringPrintf("%s %s", ua.brand.c_str(),
-                                                     version.c_str()));
+                AddBrandVersionQuotes(ua.brand, version));
     // The `Sec-CH-UA-Mobile client hint was also deemed "low entropy" and can
     // safely be sent with every request.
     AddUAHeader(headers, blink::mojom::WebClientHintsType::kUAMobile,
@@ -504,7 +513,7 @@
             blink::mojom::WebClientHintsType::kUAArch,
             blink::mojom::FeaturePolicyFeature::kClientHintUAArch)) {
       AddUAHeader(headers, blink::mojom::WebClientHintsType::kUAArch,
-                  ua.architecture);
+                  AddQuotes(ua.architecture));
     }
 
     if (ShouldAddClientHint(
@@ -512,7 +521,7 @@
             blink::mojom::WebClientHintsType::kUAPlatform,
             blink::mojom::FeaturePolicyFeature::kClientHintUAPlatform)) {
       AddUAHeader(headers, blink::mojom::WebClientHintsType::kUAPlatform,
-                  ua.platform);
+                  AddBrandVersionQuotes(ua.platform, ua.platform_version));
     }
 
     if (ShouldAddClientHint(
@@ -520,7 +529,7 @@
             blink::mojom::WebClientHintsType::kUAModel,
             blink::mojom::FeaturePolicyFeature::kClientHintUAModel)) {
       AddUAHeader(headers, blink::mojom::WebClientHintsType::kUAModel,
-                  ua.model);
+                  AddQuotes(ua.model));
     }
   }
 
diff --git a/content/browser/content_index/content_index_database.cc b/content/browser/content_index/content_index_database.cc
index f3aaaa4..60bd3ae 100644
--- a/content/browser/content_index/content_index_database.cc
+++ b/content/browser/content_index/content_index_database.cc
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "base/barrier_closure.h"
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/stl_util.h"
 #include "base/task/post_task.h"
diff --git a/content/browser/device_sensors/device_sensor_browsertest.cc b/content/browser/device_sensors/device_sensor_browsertest.cc
index 5755f4ce..58e4edf 100644
--- a/content/browser/device_sensors/device_sensor_browsertest.cc
+++ b/content/browser/device_sensors/device_sensor_browsertest.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
diff --git a/content/browser/devtools/devtools_renderer_channel.h b/content/browser/devtools/devtools_renderer_channel.h
index e4c4f62..44da276 100644
--- a/content/browser/devtools/devtools_renderer_channel.h
+++ b/content/browser/devtools/devtools_renderer_channel.h
@@ -5,6 +5,7 @@
 #ifndef CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_RENDERER_CHANNEL_H_
 #define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_RENDERER_CHANNEL_H_
 
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/containers/flat_set.h"
 #include "base/macros.h"
diff --git a/content/browser/devtools/protocol/devtools_protocol_test_support.cc b/content/browser/devtools/protocol/devtools_protocol_test_support.cc
index f473299d..e26ec36 100644
--- a/content/browser/devtools/protocol/devtools_protocol_test_support.cc
+++ b/content/browser/devtools/protocol/devtools_protocol_test_support.cc
@@ -5,6 +5,7 @@
 #include "content/browser/devtools/protocol/devtools_protocol_test_support.h"
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "content/public/browser/security_style_explanations.h"
diff --git a/content/browser/devtools/service_worker_devtools_agent_host.cc b/content/browser/devtools/service_worker_devtools_agent_host.cc
index 9f3b9a4..111f2afa 100644
--- a/content/browser/devtools/service_worker_devtools_agent_host.cc
+++ b/content/browser/devtools/service_worker_devtools_agent_host.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/post_task.h"
 #include "content/browser/devtools/devtools_renderer_channel.h"
diff --git a/content/browser/download/data_url_blob_reader.cc b/content/browser/download/data_url_blob_reader.cc
index 072e541c..6f8beb1b 100644
--- a/content/browser/download/data_url_blob_reader.cc
+++ b/content/browser/download/data_url_blob_reader.cc
@@ -4,6 +4,7 @@
 
 #include "content/browser/download/data_url_blob_reader.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
 
 namespace content {
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index 8cb6963..877d440 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/debug/alias.h"
 #include "base/files/file_util.h"
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc
index b51bc57..0c3c0bf 100644
--- a/content/browser/download/download_manager_impl_unittest.cc
+++ b/content/browser/download/download_manager_impl_unittest.cc
@@ -15,6 +15,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/guid.h"
 #include "base/macros.h"
diff --git a/content/browser/file_system/file_system_url_loader_factory.cc b/content/browser/file_system/file_system_url_loader_factory.cc
index fdc1870..b96900d8 100644
--- a/content/browser/file_system/file_system_url_loader_factory.cc
+++ b/content/browser/file_system/file_system_url_loader_factory.cc
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
diff --git a/content/browser/frame_host/navigation_controller_android.cc b/content/browser/frame_host/navigation_controller_android.cc
index 5bd698ff..075eb31 100644
--- a/content/browser/frame_host/navigation_controller_android.cc
+++ b/content/browser/frame_host/navigation_controller_android.cc
@@ -8,6 +8,7 @@
 
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/containers/flat_map.h"
 #include "base/strings/string16.h"
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
index 574829f..2bc94cd 100644
--- a/content/browser/frame_host/navigation_request.cc
+++ b/content/browser/frame_host/navigation_request.cc
@@ -11,6 +11,7 @@
 #include "base/debug/alias.h"
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/content/browser/frame_host/origin_policy_throttle.cc b/content/browser/frame_host/origin_policy_throttle.cc
index fa15284..e6c64b0 100644
--- a/content/browser/frame_host/origin_policy_throttle.cc
+++ b/content/browser/frame_host/origin_policy_throttle.cc
@@ -11,6 +11,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "content/browser/frame_host/navigation_request.h"
 #include "content/browser/storage_partition_impl.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/content/browser/frame_host/render_frame_host_delegate.cc b/content/browser/frame_host/render_frame_host_delegate.cc
index 82cfa03..2295b4b 100644
--- a/content/browser/frame_host/render_frame_host_delegate.cc
+++ b/content/browser/frame_host/render_frame_host_delegate.cc
@@ -6,6 +6,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/strings/string16.h"
 #include "build/build_config.h"
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index dfaaaa1..19d966d 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1742,9 +1742,9 @@
 
 void RenderFrameHostImpl::AccessibilityPerformAction(
     const ui::AXActionData& action_data) {
-  if (!is_active())
+  if (!is_active() || !render_accessibility_)
     return;
-  Send(new AccessibilityMsg_PerformAction(routing_id_, action_data));
+  render_accessibility_->PerformAction(action_data);
 }
 
 bool RenderFrameHostImpl::AccessibilityViewHasFocus() const {
@@ -1787,8 +1787,11 @@
 }
 
 void RenderFrameHostImpl::AccessibilityReset() {
+  if (!render_accessibility_)
+    return;
+
   accessibility_reset_token_ = g_next_accessibility_reset_token++;
-  Send(new AccessibilityMsg_Reset(routing_id_, accessibility_reset_token_));
+  render_accessibility_->Reset(accessibility_reset_token_);
 }
 
 void RenderFrameHostImpl::AccessibilityFatalError() {
@@ -1800,8 +1803,7 @@
   if (accessibility_reset_count_ >= kMaxAccessibilityResets) {
     render_accessibility_->FatalError();
   } else {
-    accessibility_reset_token_ = g_next_accessibility_reset_token++;
-    Send(new AccessibilityMsg_Reset(routing_id_, accessibility_reset_token_));
+    AccessibilityReset();
   }
 }
 
diff --git a/content/browser/frame_host/render_frame_host_impl_browsertest.cc b/content/browser/frame_host/render_frame_host_impl_browsertest.cc
index bcc1456..eb25461e 100644
--- a/content/browser/frame_host/render_frame_host_impl_browsertest.cc
+++ b/content/browser/frame_host/render_frame_host_impl_browsertest.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/files/file_path.h"
+#include "base/memory/ptr_util.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/strings/strcat.h"
diff --git a/content/browser/generic_sensor/generic_sensor_browsertest.cc b/content/browser/generic_sensor/generic_sensor_browsertest.cc
index 915ac68..06a6689 100644
--- a/content/browser/generic_sensor/generic_sensor_browsertest.cc
+++ b/content/browser/generic_sensor/generic_sensor_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/threading/platform_thread.h"
diff --git a/content/browser/gpu/peak_gpu_memory_tracker_impl.cc b/content/browser/gpu/peak_gpu_memory_tracker_impl.cc
index e0e8791f..7bcff9db 100644
--- a/content/browser/gpu/peak_gpu_memory_tracker_impl.cc
+++ b/content/browser/gpu/peak_gpu_memory_tracker_impl.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/containers/flat_map.h"
 #include "base/location.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/task/post_task.h"
@@ -25,7 +26,9 @@
 // order to sync tests with the work done here on the IO thread.
 void PeakMemoryCallback(PeakGpuMemoryTracker::Usage usage,
                         base::OnceClosure testing_callback,
-                        const uint64_t peak_memory) {
+                        const uint64_t peak_memory,
+                        const base::flat_map<gpu::GpuPeakMemoryAllocationSource,
+                                             uint64_t>& allocation_per_source) {
   uint64_t memory_in_kb = peak_memory / 1024u;
   switch (usage) {
     case PeakGpuMemoryTracker::Usage::CHANGE_TAB:
@@ -41,6 +44,9 @@
                               memory_in_kb);
       break;
   }
+
+  // TODO(jonross): Report |allocation_per_source| to UMA is a follow up change.
+
   std::move(testing_callback).Run();
 }
 
diff --git a/content/browser/gpu/peak_gpu_memory_tracker_impl_browsertest.cc b/content/browser/gpu/peak_gpu_memory_tracker_impl_browsertest.cc
index 0549a952..06c40cb 100644
--- a/content/browser/gpu/peak_gpu_memory_tracker_impl_browsertest.cc
+++ b/content/browser/gpu/peak_gpu_memory_tracker_impl_browsertest.cc
@@ -44,7 +44,9 @@
 
   void GetPeakMemoryUsage(uint32_t sequence_num,
                           GetPeakMemoryUsageCallback callback) override {
-    std::move(callback).Run(kPeakMemory);
+    base::flat_map<gpu::GpuPeakMemoryAllocationSource, uint64_t>
+        allocation_per_source;
+    std::move(callback).Run(kPeakMemory, allocation_per_source);
   }
 
   bool peak_memory_monitor_started() const {
diff --git a/content/browser/histogram_synchronizer.cc b/content/browser/histogram_synchronizer.cc
index f9bc5b650..1cda0da 100644
--- a/content/browser/histogram_synchronizer.cc
+++ b/content/browser/histogram_synchronizer.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/lazy_instance.h"
 #include "base/location.h"
 #include "base/logging.h"
diff --git a/content/browser/idle/idle_manager_unittest.cc b/content/browser/idle/idle_manager_unittest.cc
index 09e32704..dc96de1 100644
--- a/content/browser/idle/idle_manager_unittest.cc
+++ b/content/browser/idle/idle_manager_unittest.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/test/bind_test_util.h"
 #include "base/time/time.h"
diff --git a/content/browser/indexed_db/indexed_db_context_impl.cc b/content/browser/indexed_db/indexed_db_context_impl.cc
index 8a5c42d..17dcd2e6 100644
--- a/content/browser/indexed_db/indexed_db_context_impl.cc
+++ b/content/browser/indexed_db/indexed_db_context_impl.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
diff --git a/content/browser/indexed_db/indexed_db_transaction_unittest.cc b/content/browser/indexed_db/indexed_db_transaction_unittest.cc
index a4d0b3e..3de8f6a9 100644
--- a/content/browser/indexed_db/indexed_db_transaction_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_transaction_unittest.cc
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/debug/stack_trace.h"
 #include "base/logging.h"
 #include "base/macros.h"
diff --git a/content/browser/isolated_origin_browsertest.cc b/content/browser/isolated_origin_browsertest.cc
index a97b163a..9bfb8fc7 100644
--- a/content/browser/isolated_origin_browsertest.cc
+++ b/content/browser/isolated_origin_browsertest.cc
@@ -191,7 +191,7 @@
 // In this test the sub-origin is isolated because the origin policy requests
 // "isolation". It will have a different site instance than the main frame.
 IN_PROC_BROWSER_TEST_F(OriginIsolationOptInTest, SimpleSubOriginIsolationTest) {
-  SetOriginPolicyManifest(R"({ "isolation": true })");
+  SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })");
   // Start off with an a(a) page, then navigate the subframe to an isolated sub
   // origin.
   GURL test_url(https_server()->GetURL("foo.com",
@@ -224,7 +224,7 @@
 // request "isolation". It will have the same site instance as the main frame.
 IN_PROC_BROWSER_TEST_F(OriginIsolationOptInTest,
                        SimpleSubOriginNonIsolationTest) {
-  SetOriginPolicyManifest(R"({ })");
+  SetOriginPolicyManifest(R"({ "ids": ["my-policy"] })");
   // Start off with an a(a) page, then navigate the subframe to an isolated sub
   // origin.
   GURL test_url(https_server()->GetURL("foo.com",
@@ -245,7 +245,7 @@
 // This test verifies that renderer-initiated navigations to/from isolated
 // sub-origins works as expected.
 IN_PROC_BROWSER_TEST_F(OriginIsolationOptInTest, RendererInitiatedNavigations) {
-  SetOriginPolicyManifest(R"({ "isolation": true })");
+  SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })");
   GURL test_url(https_server()->GetURL("foo.com",
                                        "/cross_site_iframe_factory.html?"
                                        "foo.com(foo.com)"));
@@ -287,7 +287,7 @@
 // Note: this test is essentially identical to
 // IsolatedOriginTest.MainFrameNavigation.
 IN_PROC_BROWSER_TEST_F(OriginIsolationOptInTest, MainFrameNavigation) {
-  SetOriginPolicyManifest(R"({ "isolation": true })");
+  SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })");
   GURL unisolated_url(https_server()->GetURL("www.foo.com", "/title1.html"));
   GURL isolated_url(https_server()->GetURL("isolated.foo.com", "/isolate_me"));
 
@@ -361,7 +361,7 @@
 // if a new policy is received that removes the opt-in request.
 IN_PROC_BROWSER_TEST_F(OriginIsolationOptInTest,
                        OriginIsolationStateRetainedForBrowsingInstance) {
-  SetOriginPolicyManifest(R"({ "isolation": true })");
+  SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })");
   // Start off with an a(a,a) page, then navigate the subframe to an isolated
   // sub origin.
   GURL test_url(https_server()->GetURL("foo.com",
@@ -406,7 +406,7 @@
 IN_PROC_BROWSER_TEST_F(
     OriginIsolationOptInTest,
     DISABLED_OriginNonIsolationStateRetainedForBrowsingInstance) {
-  SetOriginPolicyManifest(R"({ })");
+  SetOriginPolicyManifest(R"({ "ids": ["my-policy"] })");
   // Start off with an a(a,a) page, then navigate the subframe to an isolated
   // sub origin.
   GURL test_url(https_server()->GetURL("foo.com",
@@ -427,7 +427,7 @@
 
   // Change OriginPolicy manifest to start isolating the sub-origin. It should
   // still be isolated, to remain consistent with the other frame.
-  SetOriginPolicyManifest(R"({ "isolation": true })");
+  SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })");
   NavigateFrameToURL(child_frame_node1, isolated_sub_origin);
   EXPECT_EQ(root->current_frame_host()->GetSiteInstance(),
             child_frame_node1->current_frame_host()->GetSiteInstance());
@@ -446,7 +446,7 @@
 // site-keyed SiteInstance corresponding to the base-origin, and not the
 // origin-keyed SiteInstance the base origin is assigned to.
 IN_PROC_BROWSER_TEST_F(OriginIsolationOptInTest, IsolatedBaseOrigin) {
-  SetOriginPolicyManifest(R"({ "isolation": true })");
+  SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })");
   // Start off with an isolated base-origin in an a(a) configuration, then
   // navigate the subframe to a sub-origin no requesting isolation.
   GURL test_url(https_server()->GetURL(
diff --git a/content/browser/media/midi_host.cc b/content/browser/media/midi_host.cc
index 94b363f..52fe35ac 100644
--- a/content/browser/media/midi_host.cc
+++ b/content/browser/media/midi_host.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "base/process/process.h"
 #include "base/stl_util.h"
 #include "base/trace_event/trace_event.h"
diff --git a/content/browser/media/session/media_session_impl_unittest.cc b/content/browser/media/session/media_session_impl_unittest.cc
index f2c7dc76..5dc9993b 100644
--- a/content/browser/media/session/media_session_impl_unittest.cc
+++ b/content/browser/media/session/media_session_impl_unittest.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/command_line.h"
+#include "base/memory/ptr_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "content/browser/media/session/media_session_player_observer.h"
diff --git a/content/browser/native_file_system/native_file_system_manager_impl_unittest.cc b/content/browser/native_file_system/native_file_system_manager_impl_unittest.cc
index c15ab9c28..a8e0a1f5 100644
--- a/content/browser/native_file_system/native_file_system_manager_impl_unittest.cc
+++ b/content/browser/native_file_system/native_file_system_manager_impl_unittest.cc
@@ -8,6 +8,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/run_loop.h"
diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc
index c56e5af..82ebca1 100644
--- a/content/browser/navigation_browsertest.cc
+++ b/content/browser/navigation_browsertest.cc
@@ -9,6 +9,7 @@
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
diff --git a/content/browser/net/cookie_store_factory.cc b/content/browser/net/cookie_store_factory.cc
index 9335459..1f23008c 100644
--- a/content/browser/net/cookie_store_factory.cc
+++ b/content/browser/net/cookie_store_factory.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/bind_helpers.h"
 #include "base/files/file_path.h"
 #include "base/memory/ref_counted.h"
 #include "base/sequenced_task_runner.h"
diff --git a/content/browser/notifications/platform_notification_context_unittest.cc b/content/browser/notifications/platform_notification_context_unittest.cc
index f7cc7c04..4de31bb3 100644
--- a/content/browser/notifications/platform_notification_context_unittest.cc
+++ b/content/browser/notifications/platform_notification_context_unittest.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind_test_util.h"
diff --git a/content/browser/permissions/permission_controller_impl_unittest.cc b/content/browser/permissions/permission_controller_impl_unittest.cc
index 571e4d8..7e4909e6 100644
--- a/content/browser/permissions/permission_controller_impl_unittest.cc
+++ b/content/browser/permissions/permission_controller_impl_unittest.cc
@@ -7,6 +7,7 @@
 #include <cstdlib>
 #include <memory>
 
+#include "base/memory/ptr_util.h"
 #include "base/test/mock_callback.h"
 #include "content/public/browser/permission_controller_delegate.h"
 #include "content/public/browser/permission_type.h"
diff --git a/content/browser/picture_in_picture/picture_in_picture_session.cc b/content/browser/picture_in_picture/picture_in_picture_session.cc
index 0fab46b..ad0a41e 100644
--- a/content/browser/picture_in_picture/picture_in_picture_session.cc
+++ b/content/browser/picture_in_picture/picture_in_picture_session.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "content/browser/picture_in_picture/picture_in_picture_service_impl.h"
 #include "content/browser/picture_in_picture/picture_in_picture_window_controller_impl.h"
 #include "content/browser/web_contents/web_contents_impl.h"
diff --git a/content/browser/portal/portal_browsertest.cc b/content/browser/portal/portal_browsertest.cc
index e79e245..5759b9d 100644
--- a/content/browser/portal/portal_browsertest.cc
+++ b/content/browser/portal/portal_browsertest.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/callback.h"
+#include "base/memory/ptr_util.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
diff --git a/content/browser/power_monitor_browsertest.cc b/content/browser/power_monitor_browsertest.cc
index 039ee45b..81b68e13 100644
--- a/content/browser/power_monitor_browsertest.cc
+++ b/content/browser/power_monitor_browsertest.cc
@@ -5,6 +5,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/content/browser/presentation/presentation_service_impl.cc b/content/browser/presentation/presentation_service_impl.cc
index b72b1039..3d4f1aecc 100644
--- a/content/browser/presentation/presentation_service_impl.cc
+++ b/content/browser/presentation/presentation_service_impl.cc
@@ -12,6 +12,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/browser/navigation_handle.h"
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index c703965..b294ff6 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -17,6 +17,7 @@
 #include "base/compiler_specific.h"
 #include "base/lazy_instance.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/power_monitor/power_monitor.h"
 #include "base/rand_util.h"
 #include "base/stl_util.h"
diff --git a/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc b/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc
index a489102..655de78 100644
--- a/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/run_loop.h"
 #include "base/task/post_task.h"
 #include "base/test/gmock_move_support.h"
diff --git a/content/browser/renderer_host/media/service_video_capture_provider.cc b/content/browser/renderer_host/media/service_video_capture_provider.cc
index 68e59b6..e3f8cea 100644
--- a/content/browser/renderer_host/media/service_video_capture_provider.cc
+++ b/content/browser/renderer_host/media/service_video_capture_provider.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "content/browser/renderer_host/media/service_video_capture_device_launcher.h"
diff --git a/content/browser/renderer_host/media/video_capture_browsertest.cc b/content/browser/renderer_host/media/video_capture_browsertest.cc
index e7fa78b4..767a0dd 100644
--- a/content/browser/renderer_host/media/video_capture_browsertest.cc
+++ b/content/browser/renderer_host/media/video_capture_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/run_loop.h"
 #include "base/task/post_task.h"
diff --git a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
index 5489e84..26b8a94 100644
--- a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
+++ b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
index 117be24..4e31d0a88 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
@@ -14,6 +14,7 @@
 #include "base/mac/mac_util.h"
 #include "base/mac/scoped_nsautorelease_pool.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
diff --git a/content/browser/scheduler/browser_task_queues.h b/content/browser/scheduler/browser_task_queues.h
index 511f91f9..39c11dda 100644
--- a/content/browser/scheduler/browser_task_queues.h
+++ b/content/browser/scheduler/browser_task_queues.h
@@ -7,6 +7,7 @@
 
 #include <array>
 
+#include "base/callback_helpers.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/task/sequence_manager/task_queue.h"
 #include "content/common/content_export.h"
diff --git a/content/browser/scheduler/responsiveness/jank_monitor_unittest.cc b/content/browser/scheduler/responsiveness/jank_monitor_unittest.cc
index b86b1899..d6f7803 100644
--- a/content/browser/scheduler/responsiveness/jank_monitor_unittest.cc
+++ b/content/browser/scheduler/responsiveness/jank_monitor_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "content/browser/scheduler/responsiveness/jank_monitor.h"
 
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/test/bind_test_util.h"
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index 964f0fc5..b0a27fc 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -9,6 +9,7 @@
 #include "base/feature_list.h"
 #include "base/files/file_util.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
diff --git a/content/browser/service_worker/service_worker_client_utils.cc b/content/browser/service_worker/service_worker_client_utils.cc
index d65f0d5..2ec241b 100644
--- a/content/browser/service_worker/service_worker_client_utils.cc
+++ b/content/browser/service_worker/service_worker_client_utils.cc
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
diff --git a/content/browser/service_worker/service_worker_container_host.cc b/content/browser/service_worker/service_worker_container_host.cc
index 2f38606..bcc2528 100644
--- a/content/browser/service_worker/service_worker_container_host.cc
+++ b/content/browser/service_worker/service_worker_container_host.cc
@@ -4,6 +4,8 @@
 
 #include "content/browser/service_worker/service_worker_container_host.h"
 
+#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/guid.h"
 #include "content/browser/child_process_security_policy_impl.h"
 #include "content/browser/service_worker/service_worker_consts.h"
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc
index 9190e514..3fe11b3 100644
--- a/content/browser/service_worker/service_worker_context_core.cc
+++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -11,6 +11,7 @@
 #include "base/barrier_closure.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/files/file_path.h"
 #include "base/location.h"
 #include "base/macros.h"
diff --git a/content/browser/service_worker/service_worker_internals_ui.cc b/content/browser/service_worker/service_worker_internals_ui.cc
index 2b7a825..f573d27 100644
--- a/content/browser/service_worker/service_worker_internals_ui.cc
+++ b/content/browser/service_worker/service_worker_internals_ui.cc
@@ -12,6 +12,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task/post_task.h"
 #include "base/values.h"
diff --git a/content/browser/service_worker/service_worker_new_script_loader.cc b/content/browser/service_worker/service_worker_new_script_loader.cc
index 8accaa06..55c8fb0 100644
--- a/content/browser/service_worker/service_worker_new_script_loader.cc
+++ b/content/browser/service_worker/service_worker_new_script_loader.cc
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/numerics/safe_conversions.h"
 #include "content/browser/appcache/appcache_disk_cache_ops.h"
 #include "content/browser/service_worker/service_worker_cache_writer.h"
diff --git a/content/browser/service_worker/service_worker_offline_capability_checker.cc b/content/browser/service_worker/service_worker_offline_capability_checker.cc
index b42c765..4a216827 100644
--- a/content/browser/service_worker/service_worker_offline_capability_checker.cc
+++ b/content/browser/service_worker/service_worker_offline_capability_checker.cc
@@ -5,6 +5,7 @@
 #include "content/browser/service_worker/service_worker_offline_capability_checker.h"
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/guid.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
 #include "content/browser/service_worker/service_worker_registration.h"
diff --git a/content/browser/service_worker/service_worker_registration_object_host.cc b/content/browser/service_worker/service_worker_registration_object_host.cc
index 724cfdf..2b84b8b5 100644
--- a/content/browser/service_worker/service_worker_registration_object_host.cc
+++ b/content/browser/service_worker/service_worker_registration_object_host.cc
@@ -5,6 +5,7 @@
 #include "content/browser/service_worker/service_worker_registration_object_host.h"
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "content/browser/service_worker/service_worker_consts.h"
diff --git a/content/browser/service_worker/service_worker_updated_script_loader.cc b/content/browser/service_worker/service_worker_updated_script_loader.cc
index 068cc62..5c4a1c5ab 100644
--- a/content/browser/service_worker/service_worker_updated_script_loader.cc
+++ b/content/browser/service_worker/service_worker_updated_script_loader.cc
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/task/post_task.h"
 #include "content/browser/appcache/appcache_disk_cache_ops.h"
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index 5fe3884..6526b96 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -739,9 +739,13 @@
   // TODO(crbug.com/1021718): Change to DCHECK once we figure out the cause of
   // crash.
   CHECK(!base::Contains(controllee_map_, uuid));
-  // TODO(crbug.com/951571): Change to DCHECK once we figured out the cause of
-  // invalid controller status.
-  CHECK(status_ == ACTIVATING || status_ == ACTIVATED);
+
+  // TODO(yuzus, crbug.com/951571): Remove these CHECKs once we figure out the
+  // cause of crash.
+  CHECK_NE(status_, NEW);
+  CHECK_NE(status_, INSTALLING);
+  CHECK_NE(status_, INSTALLED);
+  CHECK_NE(status_, REDUNDANT);
 
   if (base::FeatureList::IsEnabled(
           features::kServiceWorkerTerminationOnNoControllee) &&
diff --git a/content/browser/service_worker/service_worker_version_browsertest.cc b/content/browser/service_worker/service_worker_version_browsertest.cc
index 787149e..f37afd4 100644
--- a/content/browser/service_worker/service_worker_version_browsertest.cc
+++ b/content/browser/service_worker/service_worker_version_browsertest.cc
@@ -12,6 +12,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/callback.h"
+#include "base/callback_helpers.h"
 #include "base/memory/ref_counted.h"
 #include "base/metrics/statistics_recorder.h"
 #include "base/run_loop.h"
diff --git a/content/browser/sms/sms_fetcher_impl_unittest.cc b/content/browser/sms/sms_fetcher_impl_unittest.cc
index b58643a..3a26043 100644
--- a/content/browser/sms/sms_fetcher_impl_unittest.cc
+++ b/content/browser/sms/sms_fetcher_impl_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "content/browser/sms/sms_fetcher_impl.h"
 
+#include "base/memory/ptr_util.h"
 #include "content/browser/sms/test/mock_sms_provider.h"
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/common/content_client.h"
diff --git a/content/browser/speech/tts_ssml_browsertest.cc b/content/browser/speech/tts_ssml_browsertest.cc
index 08981b64..b5987cf00 100644
--- a/content/browser/speech/tts_ssml_browsertest.cc
+++ b/content/browser/speech/tts_ssml_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 #include "content/browser/speech/tts_controller_impl.h"
 
+#include "base/callback_helpers.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/content_browser_test.h"
 
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index 91447ff5..91374f9 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -18,6 +18,7 @@
 #include "base/command_line.h"
 #include "base/feature_list.h"
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
@@ -30,6 +31,8 @@
 #include "base/time/default_clock.h"
 #include "build/build_config.h"
 #include "components/leveldb_proto/public/proto_database_provider.h"
+#include "components/services/storage/public/cpp/filesystem/filesystem_impl.h"
+#include "components/services/storage/public/mojom/filesystem/directory.mojom.h"
 #include "components/services/storage/public/mojom/indexed_db_control.mojom.h"
 #include "components/services/storage/public/mojom/storage_service.mojom.h"
 #include "components/services/storage/storage_service_impl.h"
@@ -134,21 +137,69 @@
       std::unique_ptr<storage::StorageServiceImpl>>>
       service_storage_slot;
   service_storage_slot->GetOrCreateValue() =
-      std::make_unique<storage::StorageServiceImpl>(std::move(receiver));
+      std::make_unique<storage::StorageServiceImpl>(std::move(receiver),
+                                                    /*io_task_runner=*/nullptr);
 }
 
+#if !defined(OS_ANDROID)
+void BindStorageServiceFilesystemImpl(
+    const base::FilePath& directory_path,
+    mojo::PendingReceiver<storage::mojom::Directory> receiver) {
+  mojo::MakeSelfOwnedReceiver(
+      std::make_unique<storage::FilesystemImpl>(directory_path),
+      std::move(receiver));
+}
+#endif
+
 mojo::Remote<storage::mojom::StorageService>& GetStorageServiceRemote() {
   mojo::Remote<storage::mojom::StorageService>& remote =
       GetStorageServiceRemoteStorage();
   if (!remote) {
+#if !defined(OS_ANDROID)
     if (base::FeatureList::IsEnabled(features::kStorageServiceOutOfProcess)) {
+      const bool should_sandbox =
+          base::FeatureList::IsEnabled(features::kStorageServiceSandbox);
+      const base::FilePath sandboxed_data_dir =
+          GetContentClient()
+              ->browser()
+              ->GetSandboxedStorageServiceDataDirectory();
+      const bool is_sandboxed = should_sandbox && !sandboxed_data_dir.empty();
+      if (should_sandbox && !is_sandboxed) {
+        DLOG(ERROR) << "Running unsandboxed Storage Service instance,because "
+                    << "the current ContentBrowserClient does not specify a "
+                    << "sandboxed data directory.";
+      }
       remote = ServiceProcessHost::Launch<storage::mojom::StorageService>(
           ServiceProcessHost::Options()
-              .WithSandboxType(SandboxType::kNoSandbox)
+              .WithSandboxType(is_sandboxed ? SandboxType::kUtility
+                                            : SandboxType::kNoSandbox)
               .WithDisplayName("Storage Service")
               .Pass());
       remote.reset_on_disconnect();
-    } else {
+
+      if (is_sandboxed) {
+        // In sandboxed mode, provide the service with an API it can use to
+        // access filesystem contents *only* within the embedder's specified
+        // data directory.
+        const base::FilePath data_dir =
+            GetContentClient()
+                ->browser()
+                ->GetSandboxedStorageServiceDataDirectory();
+        DCHECK(!data_dir.empty())
+            << "Storage Service sandboxing requires a root data directory.";
+        mojo::PendingRemote<storage::mojom::Directory> directory;
+        base::CreateSequencedTaskRunner({base::MayBlock(),
+                                         base::TaskPriority::USER_VISIBLE,
+                                         base::ThreadPool()})
+            ->PostTask(
+                FROM_HERE,
+                base::BindOnce(&BindStorageServiceFilesystemImpl, data_dir,
+                               directory.InitWithNewPipeAndPassReceiver()));
+        remote->SetDataDirectory(data_dir, std::move(directory));
+      }
+    } else
+#endif  // !defined(OS_ANDROID)
+    {
       base::PostTask(FROM_HERE, {BrowserThread::IO},
                      base::BindOnce(&RunInProcessStorageService,
                                     remote.BindNewPipeAndPassReceiver()));
diff --git a/content/browser/storage_service_restart_browsertest.cc b/content/browser/storage_service_restart_browsertest.cc
index ceab14db..a40c36a8 100644
--- a/content/browser/storage_service_restart_browsertest.cc
+++ b/content/browser/storage_service_restart_browsertest.cc
@@ -21,11 +21,6 @@
 namespace content {
 namespace {
 
-// TODO(https://crbug.com/1052045): Enable this on Android once we have
-// sandboxing for Storage Service. We do not support unsandboxed service
-// processes on Android.
-#if !defined(OS_ANDROID)
-
 class StorageServiceRestartBrowserTest : public ContentBrowserTest {
  public:
   StorageServiceRestartBrowserTest() {
@@ -44,9 +39,6 @@
     dom_storage()->GetLocalStorageControl()->GetUsage(base::BindOnce(
         [](StorageServiceRestartBrowserTest* test, base::OnceClosure callback,
            std::vector<storage::mojom::LocalStorageUsageInfoPtr> usage) {
-          for (auto& entry : usage)
-            LOG(ERROR) << "ORIGIN " << entry->origin.Serialize() << " using "
-                       << entry->size_in_bytes;
           if (!usage.empty()) {
             std::move(callback).Run();
             return;
@@ -148,7 +140,5 @@
             EvalJs(shell()->web_contents(), R"(getLocalStorageValue("foo"))"));
 }
 
-#endif  // !defined(OS_ANDROID)
-
 }  // namespace
 }  // namespace content
diff --git a/content/browser/storage_service_sandbox_browsertest.cc b/content/browser/storage_service_sandbox_browsertest.cc
new file mode 100644
index 0000000..ec05955
--- /dev/null
+++ b/content/browser/storage_service_sandbox_browsertest.cc
@@ -0,0 +1,110 @@
+// Copyright 2020 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/run_loop.h"
+#include "base/test/bind_test_util.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/threading/sequenced_task_runner_handle.h"
+#include "build/build_config.h"
+#include "components/services/storage/public/mojom/storage_service.mojom.h"
+#include "components/services/storage/public/mojom/test_api.test-mojom.h"
+#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
+#include "content/browser/storage_partition_impl.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/content_features.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/content_browser_test.h"
+#include "content/public/test/content_browser_test_utils.h"
+#include "content/shell/browser/shell.h"
+
+namespace content {
+namespace {
+
+class StorageServiceSandboxBrowserTest : public ContentBrowserTest {
+ public:
+  StorageServiceSandboxBrowserTest() {
+    // These tests only make sense when the service is running out-of-process
+    // with sandboxing enabled.
+    feature_list_.InitWithFeatures({features::kStorageServiceOutOfProcess,
+                                    features::kStorageServiceSandbox},
+                                   {});
+  }
+
+  DOMStorageContextWrapper* dom_storage() {
+    auto* partition = static_cast<StoragePartitionImpl*>(
+        BrowserContext::GetDefaultStoragePartition(
+            shell()->web_contents()->GetBrowserContext()));
+    return partition->GetDOMStorageContext();
+  }
+
+  void WaitForAnyLocalStorageDataAsync(base::OnceClosure callback) {
+    dom_storage()->GetLocalStorageControl()->GetUsage(base::BindOnce(
+        [](StorageServiceSandboxBrowserTest* test, base::OnceClosure callback,
+           std::vector<storage::mojom::LocalStorageUsageInfoPtr> usage) {
+          if (!usage.empty()) {
+            std::move(callback).Run();
+            return;
+          }
+
+          base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
+              FROM_HERE,
+              base::BindOnce(&StorageServiceSandboxBrowserTest::
+                                 WaitForAnyLocalStorageDataAsync,
+                             base::Unretained(test), std::move(callback)),
+              base::TimeDelta::FromMilliseconds(50));
+        },
+        this, std::move(callback)));
+  }
+
+  void WaitForAnyLocalStorageData() {
+    base::RunLoop loop;
+    WaitForAnyLocalStorageDataAsync(loop.QuitClosure());
+    loop.Run();
+  }
+
+  void FlushLocalStorage() {
+    base::RunLoop loop;
+    dom_storage()->GetLocalStorageControl()->Flush(loop.QuitClosure());
+    loop.Run();
+  }
+
+  mojo::Remote<storage::mojom::TestApi>& GetTestApi() {
+    if (!test_api_) {
+      StoragePartitionImpl::GetStorageServiceForTesting()->BindTestApi(
+          test_api_.BindNewPipeAndPassReceiver().PassPipe());
+    }
+    return test_api_;
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+  mojo::Remote<storage::mojom::TestApi> test_api_;
+};
+
+IN_PROC_BROWSER_TEST_F(StorageServiceSandboxBrowserTest, BasicLaunch) {
+  // Basic smoke test to ensure that we can launch the Storage Service in a
+  // sandboxed and it won't crash immediately.
+  GetTestApi().FlushForTesting();
+  EXPECT_TRUE(GetTestApi().is_connected());
+}
+
+IN_PROC_BROWSER_TEST_F(StorageServiceSandboxBrowserTest, PRE_DomStorage) {
+  EXPECT_TRUE(NavigateToURL(shell(), GetTestUrl(nullptr, "empty.html")));
+  ignore_result(
+      EvalJs(shell()->web_contents(), R"(window.localStorage.yeet = 42)"));
+  WaitForAnyLocalStorageData();
+  FlushLocalStorage();
+}
+
+IN_PROC_BROWSER_TEST_F(StorageServiceSandboxBrowserTest, DomStorage) {
+  // Tests that Local Storage data persists from the PRE test setup above,
+  // providing basic assurance that the sandboxed process is able to manipulate
+  // filesystem contents as needed.
+  EXPECT_TRUE(NavigateToURL(shell(), GetTestUrl(nullptr, "empty.html")));
+  EXPECT_EQ("42",
+            EvalJs(shell()->web_contents(), R"(window.localStorage.yeet)"));
+}
+
+}  // namespace
+}  // namespace content
diff --git a/content/browser/tracing/background_tracing_active_scenario.cc b/content/browser/tracing/background_tracing_active_scenario.cc
index c45aa44..cf16f75 100644
--- a/content/browser/tracing/background_tracing_active_scenario.cc
+++ b/content/browser/tracing/background_tracing_active_scenario.cc
@@ -7,6 +7,8 @@
 #include <set>
 #include <utility>
 
+#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
diff --git a/content/browser/tracing/background_tracing_manager_browsertest.cc b/content/browser/tracing/background_tracing_manager_browsertest.cc
index 2fece112..6dbd6d83 100644
--- a/content/browser/tracing/background_tracing_manager_browsertest.cc
+++ b/content/browser/tracing/background_tracing_manager_browsertest.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/json/json_reader.h"
 #include "base/macros.h"
diff --git a/content/browser/tracing/memory_tracing_browsertest.cc b/content/browser/tracing/memory_tracing_browsertest.cc
index fe78f4d1..c39fb7ae 100644
--- a/content/browser/tracing/memory_tracing_browsertest.cc
+++ b/content/browser/tracing/memory_tracing_browsertest.cc
@@ -5,6 +5,7 @@
 #include <stdint.h>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback_forward.h"
 #include "base/command_line.h"
 #include "base/run_loop.h"
diff --git a/content/browser/vibration_browsertest.cc b/content/browser/vibration_browsertest.cc
index b6c674b..698c215 100644
--- a/content/browser/vibration_browsertest.cc
+++ b/content/browser/vibration_browsertest.cc
@@ -5,6 +5,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc
index 2fb0d9b3..d3aec06 100644
--- a/content/browser/web_contents/web_contents_impl_unittest.cc
+++ b/content/browser/web_contents/web_contents_impl_unittest.cc
@@ -8,9 +8,11 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
diff --git a/content/browser/web_package/signed_exchange_validity_pinger.cc b/content/browser/web_package/signed_exchange_validity_pinger.cc
index 2f80859e..3306ee70 100644
--- a/content/browser/web_package/signed_exchange_validity_pinger.cc
+++ b/content/browser/web_package/signed_exchange_validity_pinger.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "content/browser/web_package/signed_exchange_consts.h"
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index f48f6cc..35eb5cde 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -500,6 +500,7 @@
     "//skia/public/mojom",
     "//third_party/blink/public/mojom:mojom_core",
     "//third_party/blink/public/mojom:web_feature_mojo_bindings",
+    "//ui/accessibility/mojom",
     "//ui/base/ime/mojom",
     "//ui/base/mojom",
     "//ui/events/mojom",
diff --git a/content/common/accessibility_messages.h b/content/common/accessibility_messages.h
index dd70f7a..dff353c 100644
--- a/content/common/accessibility_messages.h
+++ b/content/common/accessibility_messages.h
@@ -125,27 +125,12 @@
 
 // Messages sent from the browser to the renderer.
 
-// Relay a request from assistive technology to perform an action,
-// such as focusing or clicking on a node.
-IPC_MESSAGE_ROUTED1(AccessibilityMsg_PerformAction,
-                    ui::AXActionData  /* action parameters */)
-
 // Tells the render view that a AccessibilityHostMsg_EventBundle
 // message was processed and it can send additional updates. The argument
 // must be the same as the ack_token passed to
 // AccessibilityHostMsg_EventBundle.
 IPC_MESSAGE_ROUTED1(AccessibilityMsg_EventBundle_ACK, int /* ack_token */)
 
-// Tell the renderer to reset and send a new accessibility tree from
-// scratch because the browser is out of sync. It passes a sequential
-// reset token. This should be rare, and if we need reset the same renderer
-// too many times we just kill it. After sending a reset, the browser ignores
-// incoming accessibility IPCs until it receives one with the matching reset
-// token. Conversely, it ignores IPCs with a reset token if it was not
-// expecting a reset.
-IPC_MESSAGE_ROUTED1(AccessibilityMsg_Reset,
-                    int /* reset token */)
-
 // Request a one-time snapshot of the accessibility tree without
 // enabling accessibility if it wasn't already enabled. The passed id
 // will be returned in the AccessibilityHostMsg_SnapshotResponse message.
diff --git a/content/common/child_process_host_impl.cc b/content/common/child_process_host_impl.cc
index a72710b..5543ebf 100644
--- a/content/common/child_process_host_impl.cc
+++ b/content/common/child_process_host_impl.cc
@@ -13,6 +13,7 @@
 #include "base/files/file_path.h"
 #include "base/hash/hash.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/numerics/safe_math.h"
 #include "base/path_service.h"
diff --git a/content/common/render_accessibility.mojom b/content/common/render_accessibility.mojom
index 8ff041e..0d48a174 100644
--- a/content/common/render_accessibility.mojom
+++ b/content/common/render_accessibility.mojom
@@ -4,6 +4,8 @@
 
 module content.mojom;
 
+import "ui/accessibility/mojom/ax_action_data.mojom";
+
 // Interface for accessibility messages sent from RenderFrameHostImpl in the
 // browser process, implemented by the RenderAccessibilityManager object in the
 // renderer process. This RenderAccessibilityManager object will be owned by the
@@ -22,4 +24,17 @@
   // Kills the renderer. Sent when there is a fatal error in the accessibility
   // tree and the maximum number of resets has been hit.
   FatalError();
+
+  // Relay a request from assistive technology to perform an action, such as
+  // focusing or clicking on a node.
+  PerformAction(ax.mojom.AXActionData action_data);
+
+  // Tell the renderer to reset and send a new accessibility tree from scratch
+  // because the browser is out of sync. It passes a sequential reset token.
+  // This should be rare, and if we need to reset the same renderer too many
+  // times we just kill it. After sending a reset, the browser ignores incoming
+  // accessibility IPCs until it receives one with the matching reset token.
+  // Conversely, it ignores IPCs with a reset token if it was not expecting a
+  // reset.
+  Reset(int32 reset_token);
 };
diff --git a/content/common/user_agent.cc b/content/common/user_agent.cc
index e7d9a7c..4bdae24 100644
--- a/content/common/user_agent.cc
+++ b/content/common/user_agent.cc
@@ -94,12 +94,9 @@
   return cpuinfo;
 }
 
-std::string BuildOSCpuInfo(bool include_android_build_number) {
-  std::string cputype = BuildCpuInfo();
-  std::string os_cpu;
-
-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS) || \
-    defined(OS_ANDROID)
+std::string GetOSVersion(bool include_android_build_number) {
+  std::string os_version;
+#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
   int32_t os_major_version = 0;
   int32_t os_minor_version = 0;
   int32_t os_bugfix_version = 0;
@@ -110,7 +107,34 @@
 #if defined(OS_ANDROID)
   std::string android_version_str = base::SysInfo::OperatingSystemVersion();
   std::string android_info_str = GetAndroidOSInfo(include_android_build_number);
-#elif defined(OS_POSIX) && !defined(OS_MACOSX)
+#endif
+
+  base::StringAppendF(&os_version,
+#if defined(OS_WIN)
+                      "%d.%d; ", os_major_version, os_minor_version
+#elif defined(OS_MACOSX)
+                      "%d_%d_%d", os_major_version, os_minor_version,
+                      os_bugfix_version
+#elif defined(OS_CHROMEOS)
+                      "CrOS "
+                      "%d.%d.%d",
+                      os_major_version, os_minor_version, os_bugfix_version
+#elif defined(OS_ANDROID)
+                      "%s%s", android_version_str.c_str(),
+                      android_info_str.c_str()
+#else
+                      ""
+#endif
+  );
+  return os_version;
+}
+
+std::string BuildOSCpuInfo(bool include_android_build_number) {
+  std::string cputype = BuildCpuInfo();
+  std::string os_version = GetOSVersion(include_android_build_number);
+  std::string os_cpu;
+
+#if !defined(OS_ANDROID) && defined(OS_POSIX) && !defined(OS_MACOSX)
   // Should work on any Posix system.
   struct utsname unixinfo;
   uname(&unixinfo);
@@ -118,19 +142,16 @@
 
   base::StringAppendF(&os_cpu,
 #if defined(OS_WIN)
-                      "Windows NT %d.%d; %s", os_major_version,
-                      os_minor_version, cputype.c_str()
+                      "Windows NT %s%s", os_version.c_str(), cputype.c_str()
 #elif defined(OS_MACOSX)
-                      "%s Mac OS X %d_%d_%d", cputype.c_str(), os_major_version,
-                      os_minor_version, os_bugfix_version
+                      "%s Mac OS X %s", cputype.c_str(), os_version.c_str()
 #elif defined(OS_CHROMEOS)
                       "CrOS "
-                      "%s %d.%d.%d",
+                      "%s %s",
                       cputype.c_str(),  // e.g. i686
-                      os_major_version, os_minor_version, os_bugfix_version
+                      os_version.c_str()
 #elif defined(OS_ANDROID)
-                      "Android %s%s", android_version_str.c_str(),
-                      android_info_str.c_str()
+                      "Android %s", os_version.c_str()
 #elif defined(OS_FUCHSIA)
                       "Fuchsia"
 #elif defined(OS_POSIX)
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java
index 9349b75ae..9eb03dd 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java
@@ -802,18 +802,26 @@
         final int textNodeVirtualViewId = waitForNodeWithText(provider, "Text");
 
         // Now call the API we want to test - addExtraDataToAccessibilityNodeInfo.
-        AccessibilityNodeInfo textNode =
+        final AccessibilityNodeInfo initialTextNode =
                 provider.createAccessibilityNodeInfo(textNodeVirtualViewId);
-        Assert.assertNotEquals(textNode, null);
+        Assert.assertNotEquals(initialTextNode, null);
         final Bundle arguments = new Bundle();
         arguments.putInt(EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX, 0);
         arguments.putInt(EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH, 4);
-        provider.addExtraDataToAccessibilityNodeInfo(
-                textNodeVirtualViewId, textNode, EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY, arguments);
+
+        // addExtraDataToAccessibilityNodeInfo() will end up calling RenderFrameHostImpl's method
+        // AccessibilityPerformAction() in the C++ code, which needs to be run from the UI thread.
+        TestThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                provider.addExtraDataToAccessibilityNodeInfo(textNodeVirtualViewId, initialTextNode,
+                        EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY, arguments);
+            }
+        });
 
         // It should return a result, but all of the rects will be the same because it hasn't
         // loaded inline text boxes yet.
-        Bundle extras = textNode.getExtras();
+        Bundle extras = initialTextNode.getExtras();
         RectF[] result =
                 (RectF[]) extras.getParcelableArray(EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY);
         Assert.assertNotEquals(result, null);
@@ -843,10 +851,16 @@
         });
 
         // The final result should be the separate bounding box of all four characters.
-        textNode = provider.createAccessibilityNodeInfo(textNodeVirtualViewId);
-        provider.addExtraDataToAccessibilityNodeInfo(
-                textNodeVirtualViewId, textNode, EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY, arguments);
-        extras = textNode.getExtras();
+        final AccessibilityNodeInfo finalTextNode =
+                provider.createAccessibilityNodeInfo(textNodeVirtualViewId);
+        TestThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                provider.addExtraDataToAccessibilityNodeInfo(textNodeVirtualViewId, finalTextNode,
+                        EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY, arguments);
+            }
+        });
+        extras = finalTextNode.getExtras();
         result = (RectF[]) extras.getParcelableArray(EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY);
         Assert.assertNotEquals(result[0], result[1]);
         Assert.assertNotEquals(result[0], result[2]);
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 53db803..95ce11e 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -948,6 +948,10 @@
     int64_t recv_bytes,
     int64_t sent_bytes) {}
 
+base::FilePath ContentBrowserClient::GetSandboxedStorageServiceDataDirectory() {
+  return base::FilePath();
+}
+
 content::PreviewsState ContentBrowserClient::DetermineAllowedPreviews(
     content::PreviewsState initial_state,
     content::NavigationHandle* navigation_handle,
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index a996e9d..5e2f30e5 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -1657,6 +1657,11 @@
       int64_t recv_bytes,
       int64_t sent_bytes);
 
+  // Returns the path to a root directory to which sandboxed out-of-process
+  // Storage Service instances should be confined. By default this is empty,
+  // and the browser cannot create sandboxed Storage Service instances.
+  virtual base::FilePath GetSandboxedStorageServiceDataDirectory();
+
   // Asks the embedder for the PreviewsState which says which previews should
   // be enabled for the given navigation. The PreviewsState is a bitmask of
   // potentially several Previews optimizations. |initial_state| is used to
diff --git a/content/public/browser/download_manager_delegate.cc b/content/public/browser/download_manager_delegate.cc
index d45c4f3..c83cd5a 100644
--- a/content/public/browser/download_manager_delegate.cc
+++ b/content/public/browser/download_manager_delegate.cc
@@ -5,6 +5,7 @@
 #include "content/public/browser/download_manager_delegate.h"
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/download/public/common/download_item.h"
 
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 9d18975..e9d30430 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -606,6 +606,11 @@
 const base::Feature kStorageServiceOutOfProcess{
     "StorageServiceOutOfProcess", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables the Storage Service sandbox whenever out-of-process Storage Service
+// is enabled.
+const base::Feature kStorageServiceSandbox{"StorageServiceSandbox",
+                                           base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Controls whether site isolation should use origins instead of scheme and
 // eTLD+1.
 const base::Feature kStrictOriginIsolation{"StrictOriginIsolation",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 713b4e00..6926bcf 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -136,6 +136,7 @@
 CONTENT_EXPORT extern const base::Feature kSpareRendererForSitePerProcess;
 CONTENT_EXPORT extern const base::Feature kStoragePressureUI;
 CONTENT_EXPORT extern const base::Feature kStorageServiceOutOfProcess;
+CONTENT_EXPORT extern const base::Feature kStorageServiceSandbox;
 CONTENT_EXPORT extern const base::Feature kStrictOriginIsolation;
 CONTENT_EXPORT extern const base::Feature kSyntheticPointerActions;
 CONTENT_EXPORT extern const base::Feature kTimerThrottlingForHiddenFrames;
diff --git a/content/public/common/user_agent.h b/content/public/common/user_agent.h
index 8a057bb0..4768587d 100644
--- a/content/public/common/user_agent.h
+++ b/content/public/common/user_agent.h
@@ -44,6 +44,10 @@
 // as an argument.
 CONTENT_EXPORT std::string BuildOSCpuInfo(bool include_android_build_number);
 
+// Returns the OS version. On Android, the string will only include the build
+// number if true is passed as an argument.
+CONTENT_EXPORT std::string GetOSVersion(bool include_android_build_number);
+
 // Returns the frozen User-agent string for
 // https://github.com/WICG/ua-client-hints.
 CONTENT_EXPORT base::StringPiece GetFrozenUserAgent(bool mobile);
diff --git a/content/public/test/android/render_frame_host_test_ext.cc b/content/public/test/android/render_frame_host_test_ext.cc
index 000d42f..55ea8a48 100644
--- a/content/public/test/android/render_frame_host_test_ext.cc
+++ b/content/public/test/android/render_frame_host_test_ext.cc
@@ -8,6 +8,7 @@
 #include "base/android/jni_string.h"
 #include "base/bind.h"
 #include "base/json/json_string_value_serializer.h"
+#include "base/memory/ptr_util.h"
 #include "content/browser/frame_host/render_frame_host_android.h"
 #include "content/browser/frame_host/render_frame_host_impl.h"
 #include "content/public/browser/web_contents.h"
diff --git a/content/public/test/audio_service_test_helper.cc b/content/public/test/audio_service_test_helper.cc
index 5d9bffd..6f445e3 100644
--- a/content/public/test/audio_service_test_helper.cc
+++ b/content/public/test/audio_service_test_helper.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/process/process.h"
diff --git a/content/public/test/service_worker_test_helpers.cc b/content/public/test/service_worker_test_helpers.cc
index 18ba691..79ca442d 100644
--- a/content/public/test/service_worker_test_helpers.cc
+++ b/content/public/test/service_worker_test_helpers.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "base/task/post_task.h"
 #include "content/browser/service_worker/service_worker_context_core_observer.h"
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc
index 86bfa4e..fee479db 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -294,15 +294,146 @@
 bool RenderAccessibilityImpl::OnMessageReceived(const IPC::Message& message) {
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(RenderAccessibilityImpl, message)
-
-    IPC_MESSAGE_HANDLER(AccessibilityMsg_PerformAction, OnPerformAction)
     IPC_MESSAGE_HANDLER(AccessibilityMsg_EventBundle_ACK, OnEventsAck)
-    IPC_MESSAGE_HANDLER(AccessibilityMsg_Reset, OnReset)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
 }
 
+void RenderAccessibilityImpl::PerformAction(const ui::AXActionData& data) {
+  const WebDocument& document = GetMainDocument();
+  if (document.IsNull())
+    return;
+
+  auto root = WebAXObject::FromWebDocument(document);
+  if (!root.UpdateLayoutAndCheckValidity())
+    return;
+
+  std::unique_ptr<ui::AXActionTarget> target =
+      AXActionTargetFactory::CreateFromNodeId(document, plugin_tree_source_,
+                                              data.target_node_id);
+  std::unique_ptr<ui::AXActionTarget> anchor =
+      AXActionTargetFactory::CreateFromNodeId(document, plugin_tree_source_,
+                                              data.anchor_node_id);
+  std::unique_ptr<ui::AXActionTarget> focus =
+      AXActionTargetFactory::CreateFromNodeId(document, plugin_tree_source_,
+                                              data.focus_node_id);
+
+  switch (data.action) {
+    case ax::mojom::Action::kBlur:
+      root.Focus();
+      break;
+    case ax::mojom::Action::kClearAccessibilityFocus:
+      target->ClearAccessibilityFocus();
+      break;
+    case ax::mojom::Action::kDecrement:
+      target->Decrement();
+      break;
+    case ax::mojom::Action::kDoDefault:
+      target->Click();
+      break;
+    case ax::mojom::Action::kGetImageData:
+      OnGetImageData(target.get(), data.target_rect.size());
+      break;
+    case ax::mojom::Action::kHitTest:
+      DCHECK(data.hit_test_event_to_fire != ax::mojom::Event::kNone);
+      OnHitTest(data.target_point, data.hit_test_event_to_fire,
+                data.request_id);
+      break;
+    case ax::mojom::Action::kIncrement:
+      target->Increment();
+      break;
+    case ax::mojom::Action::kScrollToMakeVisible:
+      target->ScrollToMakeVisibleWithSubFocus(
+          data.target_rect, data.horizontal_scroll_alignment,
+          data.vertical_scroll_alignment, data.scroll_behavior);
+      break;
+    case ax::mojom::Action::kScrollToPoint:
+      target->ScrollToGlobalPoint(data.target_point);
+      break;
+    case ax::mojom::Action::kLoadInlineTextBoxes:
+      OnLoadInlineTextBoxes(target.get());
+      break;
+    case ax::mojom::Action::kFocus:
+      target->Focus();
+      break;
+    case ax::mojom::Action::kSetAccessibilityFocus:
+      target->SetAccessibilityFocus();
+      break;
+    case ax::mojom::Action::kSetScrollOffset:
+      target->SetScrollOffset(data.target_point);
+      break;
+    case ax::mojom::Action::kSetSelection:
+      anchor->SetSelection(anchor.get(), data.anchor_offset, focus.get(),
+                           data.focus_offset);
+      HandleAXEvent(root, ax::mojom::Event::kLayoutComplete);
+      break;
+    case ax::mojom::Action::kSetSequentialFocusNavigationStartingPoint:
+      target->SetSequentialFocusNavigationStartingPoint();
+      break;
+    case ax::mojom::Action::kSetValue:
+      target->SetValue(data.value);
+      break;
+    case ax::mojom::Action::kShowContextMenu:
+      target->ShowContextMenu();
+      break;
+    case ax::mojom::Action::kScrollBackward:
+    case ax::mojom::Action::kScrollForward:
+    case ax::mojom::Action::kScrollUp:
+    case ax::mojom::Action::kScrollDown:
+    case ax::mojom::Action::kScrollLeft:
+    case ax::mojom::Action::kScrollRight:
+      Scroll(target.get(), data.action);
+      break;
+    case ax::mojom::Action::kCustomAction:
+    case ax::mojom::Action::kCollapse:
+    case ax::mojom::Action::kExpand:
+    case ax::mojom::Action::kReplaceSelectedText:
+    case ax::mojom::Action::kNone:
+      NOTREACHED();
+      break;
+    case ax::mojom::Action::kGetTextLocation:
+      break;
+    case ax::mojom::Action::kAnnotatePageImages:
+      // Ensure we aren't already labeling images, in which case this should
+      // not change.
+      if (!ax_image_annotator_) {
+        CreateAXImageAnnotator();
+        // Walk the tree to discover images, and mark them dirty so that
+        // they get added to the annotator.
+        MarkAllAXObjectsDirty(ax::mojom::Role::kImage);
+      }
+      break;
+    case ax::mojom::Action::kSignalEndOfTest:
+      // Wait for 100ms to allow pending events to come in
+      base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100));
+
+      HandleAXEvent(root, ax::mojom::Event::kEndOfTest);
+      break;
+    case ax::mojom::Action::kShowTooltip:
+    case ax::mojom::Action::kHideTooltip:
+    case ax::mojom::Action::kInternalInvalidateTree:
+      break;
+  }
+}
+
+void RenderAccessibilityImpl::Reset(int32_t reset_token) {
+  reset_token_ = reset_token;
+  serializer_.Reset();
+  pending_events_.clear();
+
+  const WebDocument& document = GetMainDocument();
+  if (!document.IsNull()) {
+    // Tree-only mode gets used by the automation extension API which requires a
+    // load complete event to invoke listener callbacks.
+    auto webax_object = WebAXObject::FromWebDocument(document);
+    ax::mojom::Event evt = webax_object.IsLoaded()
+                               ? ax::mojom::Event::kLoadComplete
+                               : ax::mojom::Event::kLayoutComplete;
+    HandleAXEvent(webax_object, evt);
+  }
+}
+
 void RenderAccessibilityImpl::NotifyUpdate(
     blink::mojom::RendererPreferencesPtr new_prefs) {
   if (ax_image_annotator_)
@@ -736,124 +867,6 @@
   Send(new AccessibilityHostMsg_LocationChanges(routing_id(), messages));
 }
 
-void RenderAccessibilityImpl::OnPerformAction(
-    const ui::AXActionData& data) {
-  const WebDocument& document = GetMainDocument();
-  if (document.IsNull())
-    return;
-
-  auto root = WebAXObject::FromWebDocument(document);
-  if (!root.UpdateLayoutAndCheckValidity())
-    return;
-
-  std::unique_ptr<ui::AXActionTarget> target =
-      AXActionTargetFactory::CreateFromNodeId(document, plugin_tree_source_,
-                                              data.target_node_id);
-  std::unique_ptr<ui::AXActionTarget> anchor =
-      AXActionTargetFactory::CreateFromNodeId(document, plugin_tree_source_,
-                                              data.anchor_node_id);
-  std::unique_ptr<ui::AXActionTarget> focus =
-      AXActionTargetFactory::CreateFromNodeId(document, plugin_tree_source_,
-                                              data.focus_node_id);
-
-  switch (data.action) {
-    case ax::mojom::Action::kBlur:
-      root.Focus();
-      break;
-    case ax::mojom::Action::kClearAccessibilityFocus:
-      target->ClearAccessibilityFocus();
-      break;
-    case ax::mojom::Action::kDecrement:
-      target->Decrement();
-      break;
-    case ax::mojom::Action::kDoDefault:
-      target->Click();
-      break;
-    case ax::mojom::Action::kGetImageData:
-      OnGetImageData(target.get(), data.target_rect.size());
-      break;
-    case ax::mojom::Action::kHitTest:
-      DCHECK(data.hit_test_event_to_fire != ax::mojom::Event::kNone);
-      OnHitTest(data.target_point, data.hit_test_event_to_fire,
-                data.request_id);
-      break;
-    case ax::mojom::Action::kIncrement:
-      target->Increment();
-      break;
-    case ax::mojom::Action::kScrollToMakeVisible:
-      target->ScrollToMakeVisibleWithSubFocus(
-          data.target_rect, data.horizontal_scroll_alignment,
-          data.vertical_scroll_alignment, data.scroll_behavior);
-      break;
-    case ax::mojom::Action::kScrollToPoint:
-      target->ScrollToGlobalPoint(data.target_point);
-      break;
-    case ax::mojom::Action::kLoadInlineTextBoxes:
-      OnLoadInlineTextBoxes(target.get());
-      break;
-    case ax::mojom::Action::kFocus:
-      target->Focus();
-      break;
-    case ax::mojom::Action::kSetAccessibilityFocus:
-      target->SetAccessibilityFocus();
-      break;
-    case ax::mojom::Action::kSetScrollOffset:
-      target->SetScrollOffset(data.target_point);
-      break;
-    case ax::mojom::Action::kSetSelection:
-      anchor->SetSelection(anchor.get(), data.anchor_offset, focus.get(),
-                           data.focus_offset);
-      HandleAXEvent(root, ax::mojom::Event::kLayoutComplete);
-      break;
-    case ax::mojom::Action::kSetSequentialFocusNavigationStartingPoint:
-      target->SetSequentialFocusNavigationStartingPoint();
-      break;
-    case ax::mojom::Action::kSetValue:
-      target->SetValue(data.value);
-      break;
-    case ax::mojom::Action::kShowContextMenu:
-      target->ShowContextMenu();
-      break;
-    case ax::mojom::Action::kScrollBackward:
-    case ax::mojom::Action::kScrollForward:
-    case ax::mojom::Action::kScrollUp:
-    case ax::mojom::Action::kScrollDown:
-    case ax::mojom::Action::kScrollLeft:
-    case ax::mojom::Action::kScrollRight:
-      Scroll(target.get(), data.action);
-      break;
-    case ax::mojom::Action::kCustomAction:
-    case ax::mojom::Action::kCollapse:
-    case ax::mojom::Action::kExpand:
-    case ax::mojom::Action::kReplaceSelectedText:
-    case ax::mojom::Action::kNone:
-      NOTREACHED();
-      break;
-    case ax::mojom::Action::kGetTextLocation:
-      break;
-    case ax::mojom::Action::kAnnotatePageImages:
-      // Ensure we aren't already labeling images, in which case this should
-      // not change.
-      if (!ax_image_annotator_) {
-        CreateAXImageAnnotator();
-        // Walk the tree to discover images, and mark them dirty so that
-        // they get added to the annotator.
-        MarkAllAXObjectsDirty(ax::mojom::Role::kImage);
-      }
-      break;
-    case ax::mojom::Action::kSignalEndOfTest:
-      // Wait for 100ms to allow pending events to come in
-      base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100));
-
-      HandleAXEvent(root, ax::mojom::Event::kEndOfTest);
-      break;
-    case ax::mojom::Action::kShowTooltip:
-    case ax::mojom::Action::kHideTooltip:
-    case ax::mojom::Action::kInternalInvalidateTree:
-      break;
-  }
-}
-
 void RenderAccessibilityImpl::OnEventsAck(int ack_token) {
   // Ignore acks intended for a different or previous instance.
   if (ack_token_ != ack_token)
@@ -963,23 +976,6 @@
   HandleAXEvent(obj, ax::mojom::Event::kImageFrameUpdated);
 }
 
-void RenderAccessibilityImpl::OnReset(int reset_token) {
-  reset_token_ = reset_token;
-  serializer_.Reset();
-  pending_events_.clear();
-
-  const WebDocument& document = GetMainDocument();
-  if (!document.IsNull()) {
-    // Tree-only mode gets used by the automation extension API which requires a
-    // load complete event to invoke listener callbacks.
-    auto webax_object = WebAXObject::FromWebDocument(document);
-    ax::mojom::Event evt = webax_object.IsLoaded()
-                               ? ax::mojom::Event::kLoadComplete
-                               : ax::mojom::Event::kLayoutComplete;
-    HandleAXEvent(webax_object, evt);
-  }
-}
-
 void RenderAccessibilityImpl::OnDestruct() {
   render_frame_ = nullptr;
   delete this;
diff --git a/content/renderer/accessibility/render_accessibility_impl.h b/content/renderer/accessibility/render_accessibility_impl.h
index 44e92760..71ef56e0 100644
--- a/content/renderer/accessibility/render_accessibility_impl.h
+++ b/content/renderer/accessibility/render_accessibility_impl.h
@@ -120,6 +120,9 @@
   void AccessibilityModeChanged(const ui::AXMode& mode) override;
   bool OnMessageReceived(const IPC::Message& message) override;
 
+  void PerformAction(const ui::AXActionData& data);
+  void Reset(int32_t reset_token);
+
   // blink::mojom::RendererPreferenceObserver implementation.
   void NotifyUpdate(blink::mojom::RendererPreferencesPtr new_prefs) override;
 
@@ -158,9 +161,7 @@
   void OnDestruct() override;
 
   // Handlers for messages from the browser to the renderer.
-  void OnPerformAction(const ui::AXActionData& data);
   void OnEventsAck(int ack_token);
-  void OnReset(int reset_token);
 
   void OnHitTest(const gfx::Point& point,
                  ax::mojom::Event event_to_fire,
diff --git a/content/renderer/accessibility/render_accessibility_manager.cc b/content/renderer/accessibility/render_accessibility_manager.cc
index a32ef236..56258b5 100644
--- a/content/renderer/accessibility/render_accessibility_manager.cc
+++ b/content/renderer/accessibility/render_accessibility_manager.cc
@@ -68,4 +68,14 @@
   CHECK(false) << "Invalid accessibility tree.";
 }
 
+void RenderAccessibilityManager::PerformAction(const ui::AXActionData& data) {
+  DCHECK(render_accessibility_);
+  render_accessibility_->PerformAction(data);
+}
+
+void RenderAccessibilityManager::Reset(int32_t reset_token) {
+  DCHECK(render_accessibility_);
+  render_accessibility_->Reset(reset_token);
+}
+
 }  // namespace content
diff --git a/content/renderer/accessibility/render_accessibility_manager.h b/content/renderer/accessibility/render_accessibility_manager.h
index ba07276..e2f23d50 100644
--- a/content/renderer/accessibility/render_accessibility_manager.h
+++ b/content/renderer/accessibility/render_accessibility_manager.h
@@ -12,6 +12,7 @@
 #include "content/common/render_accessibility.mojom.h"
 #include "mojo/public/cpp/bindings/associated_receiver.h"
 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
+#include "ui/accessibility/ax_action_data.h"
 #include "ui/accessibility/ax_mode.h"
 
 namespace content {
@@ -55,6 +56,8 @@
   // mojom::RenderAccessibility implementation.
   void SetMode(uint32_t ax_mode) override;
   void FatalError() override;
+  void PerformAction(const ui::AXActionData& data) override;
+  void Reset(int32_t reset_token) override;
 
  private:
   // The RenderFrameImpl that owns us.
diff --git a/content/renderer/loader/sync_load_context.cc b/content/renderer/loader/sync_load_context.cc
index 4075afd..3145b37 100644
--- a/content/renderer/loader/sync_load_context.cc
+++ b/content/renderer/loader/sync_load_context.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/time/time.h"
diff --git a/content/renderer/loader/sync_load_context_unittest.cc b/content/renderer/loader/sync_load_context_unittest.cc
index 9db3bb9..d4d012d1a 100644
--- a/content/renderer/loader/sync_load_context_unittest.cc
+++ b/content/renderer/loader/sync_load_context_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "content/renderer/loader/sync_load_context.h"
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/threading/thread.h"
 #include "content/renderer/loader/sync_load_response.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/content/renderer/loader/tracked_child_url_loader_factory_bundle.cc b/content/renderer/loader/tracked_child_url_loader_factory_bundle.cc
index ec00a97..1581276 100644
--- a/content/renderer/loader/tracked_child_url_loader_factory_bundle.cc
+++ b/content/renderer/loader/tracked_child_url_loader_factory_bundle.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "content/public/renderer/render_thread.h"
 
 namespace content {
diff --git a/content/renderer/navigation_state.cc b/content/renderer/navigation_state.cc
index cf9f5bd..9a2c4d88c 100644
--- a/content/renderer/navigation_state.cc
+++ b/content/renderer/navigation_state.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "content/common/frame_messages.h"
 #include "content/public/common/navigation_policy.h"
 #include "content/renderer/internal_document_state_data.h"
diff --git a/content/renderer/pepper/pepper_media_stream_video_track_host.cc b/content/renderer/pepper/pepper_media_stream_video_track_host.cc
index 44d9e51c..89f5d93 100644
--- a/content/renderer/pepper/pepper_media_stream_video_track_host.cc
+++ b/content/renderer/pepper/pepper_media_stream_video_track_host.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/rand_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc
index 86914f7..4106ff43 100644
--- a/content/renderer/render_frame_proxy.cc
+++ b/content/renderer/render_frame_proxy.cc
@@ -11,6 +11,7 @@
 
 #include "base/command_line.h"
 #include "base/lazy_instance.h"
+#include "base/memory/ptr_util.h"
 #include "components/viz/common/surfaces/local_surface_id_allocation.h"
 #include "content/common/content_switches_internal.h"
 #include "content/common/frame_replication_state.h"
diff --git a/content/renderer/render_thread_impl_discardable_memory_browsertest.cc b/content/renderer/render_thread_impl_discardable_memory_browsertest.cc
index 0da4716..35e850d9 100644
--- a/content/renderer/render_thread_impl_discardable_memory_browsertest.cc
+++ b/content/renderer/render_thread_impl_discardable_memory_browsertest.cc
@@ -12,6 +12,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/memory/discardable_memory.h"
 #include "base/memory/discardable_memory_allocator.h"
diff --git a/content/renderer/service_worker/service_worker_network_provider_for_frame.cc b/content/renderer/service_worker/service_worker_network_provider_for_frame.cc
index 29100e0..3a105ad 100644
--- a/content/renderer/service_worker/service_worker_network_provider_for_frame.cc
+++ b/content/renderer/service_worker/service_worker_network_provider_for_frame.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "content/common/service_worker/service_worker_utils.h"
 #include "content/public/common/origin_util.h"
 #include "content/public/renderer/render_frame_observer.h"
diff --git a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
index 45684353..5b782b6 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
diff --git a/content/renderer/worker/worker_thread_registry.cc b/content/renderer/worker/worker_thread_registry.cc
index 04ee7c6..bcfe215 100644
--- a/content/renderer/worker/worker_thread_registry.cc
+++ b/content/renderer/worker/worker_thread_registry.cc
@@ -11,6 +11,7 @@
 #include "base/lazy_instance.h"
 #include "base/location.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/observer_list.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc
index 5a8689e..383c922 100644
--- a/content/shell/browser/shell_content_browser_client.cc
+++ b/content/shell/browser/shell_content_browser_client.cc
@@ -357,6 +357,11 @@
   return nullptr;
 }
 
+base::FilePath
+ShellContentBrowserClient::GetSandboxedStorageServiceDataDirectory() {
+  return browser_context()->GetPath();
+}
+
 std::string ShellContentBrowserClient::GetUserAgent() {
   return GetShellUserAgent();
 }
diff --git a/content/shell/browser/shell_content_browser_client.h b/content/shell/browser/shell_content_browser_client.h
index 92c77f2..9acb46b 100644
--- a/content/shell/browser/shell_content_browser_client.h
+++ b/content/shell/browser/shell_content_browser_client.h
@@ -76,6 +76,7 @@
       scoped_refptr<net::HttpResponseHeaders> response_headers,
       bool first_auth_attempt,
       LoginAuthRequiredCallback auth_required_callback) override;
+  base::FilePath GetSandboxedStorageServiceDataDirectory() override;
 
   std::string GetUserAgent() override;
   blink::UserAgentMetadata GetUserAgentMetadata() override;
diff --git a/content/shell/browser/web_test/fake_bluetooth_chooser_factory.h b/content/shell/browser/web_test/fake_bluetooth_chooser_factory.h
index fcee0f0..f17c423 100644
--- a/content/shell/browser/web_test/fake_bluetooth_chooser_factory.h
+++ b/content/shell/browser/web_test/fake_bluetooth_chooser_factory.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "base/memory/ptr_util.h"
 #include "content/shell/common/web_test/fake_bluetooth_chooser.mojom.h"
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index b98c0c21..f6f854f 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1024,7 +1024,6 @@
     "../browser/sms/sms_browsertest.cc",
     "../browser/snapshot_browsertest.cc",
     "../browser/storage_partition_impl_browsertest.cc",
-    "../browser/storage_service_restart_browsertest.cc",
     "../browser/tracing/background_tracing_manager_browsertest.cc",
     "../browser/tracing/memory_instrumentation_browsertest.cc",
     "../browser/tracing/memory_tracing_browsertest.cc",
@@ -1275,7 +1274,7 @@
       "//ppapi/tests/test_case.html",
       "//ppapi/tests/test_page.css",
       "//ppapi/tests/test_url_loader_data/",
-      "//third_party/pywebsocket/src/mod_pywebsocket/",
+      "//third_party/pywebsocket3/src/mod_pywebsocket/",
       "//third_party/tlslite/",
     ]
   }
@@ -1377,6 +1376,8 @@
       "../browser/serial/serial_browsertest.cc",
       "../browser/speech/speech_recognition_browsertest.cc",
       "../browser/speech/tts_ssml_browsertest.cc",
+      "../browser/storage_service_restart_browsertest.cc",
+      "../browser/storage_service_sandbox_browsertest.cc",
       "../browser/zoom_browsertest.cc",
     ]
     deps += [ "//content/browser/speech/proto" ]
diff --git a/content/test/test_render_widget_host.cc b/content/test/test_render_widget_host.cc
index 857fb37e..ffa8fbf0 100644
--- a/content/test/test_render_widget_host.cc
+++ b/content/test/test_render_widget_host.cc
@@ -4,6 +4,7 @@
 
 #include "content/test/test_render_widget_host.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "content/browser/renderer_host/frame_token_message_queue.h"
 #include "content/public/common/content_features.h"
diff --git a/content/utility/services.cc b/content/utility/services.cc
index 4b9f99d..323d3529 100644
--- a/content/utility/services.cc
+++ b/content/utility/services.cc
@@ -11,6 +11,7 @@
 #include "build/build_config.h"
 #include "components/services/storage/public/mojom/storage_service.mojom.h"
 #include "components/services/storage/storage_service_impl.h"
+#include "content/child/child_process.h"
 #include "content/public/utility/content_utility_client.h"
 #include "content/public/utility/utility_thread.h"
 #include "media/media_buildflags.h"
@@ -146,7 +147,8 @@
 
 auto RunStorageService(
     mojo::PendingReceiver<storage::mojom::StorageService> receiver) {
-  return std::make_unique<storage::StorageServiceImpl>(std::move(receiver));
+  return std::make_unique<storage::StorageServiceImpl>(
+      std::move(receiver), ChildProcess::current()->io_task_runner());
 }
 
 auto RunTracing(
diff --git a/dbus/object_manager.cc b/dbus/object_manager.cc
index 65f3603..1c406e8ce 100644
--- a/dbus/object_manager.cc
+++ b/dbus/object_manager.cc
@@ -7,6 +7,7 @@
 #include <stddef.h>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/metrics/histogram.h"
diff --git a/device/bluetooth/adapter.cc b/device/bluetooth/adapter.cc
index 5393ecc..5ea645e3 100644
--- a/device/bluetooth/adapter.cc
+++ b/device/bluetooth/adapter.cc
@@ -7,6 +7,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/memory/ptr_util.h"
 #include "device/bluetooth/adapter.h"
 #include "device/bluetooth/device.h"
diff --git a/device/bluetooth/bluetooth_adapter_win.cc b/device/bluetooth/bluetooth_adapter_win.cc
index 06eac5b..9422610 100644
--- a/device/bluetooth/bluetooth_adapter_win.cc
+++ b/device/bluetooth/bluetooth_adapter_win.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/feature_list.h"
 #include "base/location.h"
 #include "base/logging.h"
diff --git a/device/bluetooth/bluetooth_adapter_winrt.h b/device/bluetooth/bluetooth_adapter_winrt.h
index 2940061c..01f3ee2e 100644
--- a/device/bluetooth/bluetooth_adapter_winrt.h
+++ b/device/bluetooth/bluetooth_adapter_winrt.h
@@ -15,6 +15,7 @@
 #include <vector>
 
 #include "base/callback_forward.h"
+#include "base/callback_helpers.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic.cc b/device/bluetooth/bluetooth_remote_gatt_characteristic.cc
index 5962a15..d789f260b 100644
--- a/device/bluetooth/bluetooth_remote_gatt_characteristic.cc
+++ b/device/bluetooth/bluetooth_remote_gatt_characteristic.cc
@@ -7,7 +7,9 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "device/bluetooth/bluetooth_gatt_notify_session.h"
diff --git a/device/bluetooth/device.cc b/device/bluetooth/device.cc
index b91079c..a173379f 100644
--- a/device/bluetooth/device.cc
+++ b/device/bluetooth/device.cc
@@ -6,6 +6,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "device/bluetooth/device.h"
diff --git a/device/fido/ble/fido_ble_transaction.cc b/device/fido/ble/fido_ble_transaction.cc
index ae3a4dd..ef41dca 100644
--- a/device/fido/ble/fido_ble_transaction.cc
+++ b/device/fido/ble/fido_ble_transaction.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/device_event_log/device_event_log.h"
diff --git a/device/fido/cable/fido_cable_handshake_handler_v2_fuzzer.cc b/device/fido/cable/fido_cable_handshake_handler_v2_fuzzer.cc
index 286ce789..5274eec 100644
--- a/device/fido/cable/fido_cable_handshake_handler_v2_fuzzer.cc
+++ b/device/fido/cable/fido_cable_handshake_handler_v2_fuzzer.cc
@@ -7,6 +7,7 @@
 
 #include <array>
 
+#include "base/bind_helpers.h"
 #include "base/containers/span.h"
 #include "base/memory/ref_counted.h"
 #include "device/bluetooth/test/mock_bluetooth_adapter.h"
diff --git a/device/fido/hid/fake_hid_impl_for_testing.cc b/device/fido/hid/fake_hid_impl_for_testing.cc
index db8d781..eb60bbf 100644
--- a/device/fido/hid/fake_hid_impl_for_testing.cc
+++ b/device/fido/hid/fake_hid_impl_for_testing.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "device/fido/fido_parsing_utils.h"
 #include "device/fido/hid/fido_hid_discovery.h"
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
diff --git a/device/gamepad/gamepad_device_linux.cc b/device/gamepad/gamepad_device_linux.cc
index 64cba11..98be2d5 100644
--- a/device/gamepad/gamepad_device_linux.cc
+++ b/device/gamepad/gamepad_device_linux.cc
@@ -11,6 +11,7 @@
 #include <linux/joystick.h>
 #include <sys/ioctl.h>
 
+#include "base/callback_helpers.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/device/vr/android/gvr/gvr_device_provider.cc b/device/vr/android/gvr/gvr_device_provider.cc
index 9b007593..7e967c1 100644
--- a/device/vr/android/gvr/gvr_device_provider.cc
+++ b/device/vr/android/gvr/gvr_device_provider.cc
@@ -6,6 +6,7 @@
 
 #include "base/android/build_info.h"
 #include "base/android/bundle_utils.h"
+#include "base/memory/ptr_util.h"
 #include "device/vr/android/gvr/gvr_device.h"
 
 namespace device {
diff --git a/device/vr/oculus/oculus_device.cc b/device/vr/oculus/oculus_device.cc
index ca753d1e..9ad701f 100644
--- a/device/vr/oculus/oculus_device.cc
+++ b/device/vr/oculus/oculus_device.cc
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/memory/ptr_util.h"
 #include "base/numerics/math_constants.h"
 #include "build/build_config.h"
diff --git a/device/vr/openvr/openvr_device.cc b/device/vr/openvr/openvr_device.cc
index 8707ee4..39307be 100644
--- a/device/vr/openvr/openvr_device.cc
+++ b/device/vr/openvr/openvr_device.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/device/vr/orientation/orientation_device_unittest.cc b/device/vr/orientation/orientation_device_unittest.cc
index 9f8ce7a..c55b95f8 100644
--- a/device/vr/orientation/orientation_device_unittest.cc
+++ b/device/vr/orientation/orientation_device_unittest.cc
@@ -7,6 +7,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
diff --git a/extensions/BUILD.gn b/extensions/BUILD.gn
index e1bd23c..a81b164 100644
--- a/extensions/BUILD.gn
+++ b/extensions/BUILD.gn
@@ -241,7 +241,7 @@
   data = [
     "//extensions/test/data/",
     "//net/tools/testserver/",
-    "//third_party/pywebsocket/src/mod_pywebsocket/",
+    "//third_party/pywebsocket3/src/mod_pywebsocket/",
     "//third_party/tlslite/",
     "$root_out_dir/extensions_shell_and_test.pak",
   ]
diff --git a/extensions/browser/api/hid/hid_apitest.cc b/extensions/browser/api/hid/hid_apitest.cc
index 29c7c4e..2630c82 100644
--- a/extensions/browser/api/hid/hid_apitest.cc
+++ b/extensions/browser/api/hid/hid_apitest.cc
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/extensions/browser/api/serial/serial_apitest.cc b/extensions/browser/api/serial/serial_apitest.cc
index 7add6f7..313f8af 100644
--- a/extensions/browser/api/serial/serial_apitest.cc
+++ b/extensions/browser/api/serial/serial_apitest.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/unguessable_token.h"
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 9ff45f4..8de98b58 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1518,6 +1518,8 @@
   PASSWORDSPRIVATE_REMOVECOMPROMISEDCREDENTIAL = 1455,
   TERMINALPRIVATE_GETA11YSTATUS = 1456,
   AUTOTESTPRIVATE_GETSHELFUIINFOFORSTATE = 1457,
+  PASSWORDSPRIVATE_STARTPASSWORDCHECK = 1458,
+  PASSWORDSPRIVATE_STOPPASSWORDCHECK = 1459,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/browser/sandboxed_unpacker_unittest.cc b/extensions/browser/sandboxed_unpacker_unittest.cc
index c0fdb2e8..3edcad2 100644
--- a/extensions/browser/sandboxed_unpacker_unittest.cc
+++ b/extensions/browser/sandboxed_unpacker_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/base64.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/memory/ref_counted.h"
diff --git a/extensions/browser/updater/extension_downloader_unittest.cc b/extensions/browser/updater/extension_downloader_unittest.cc
index 9cb5bbc1..6958f59 100644
--- a/extensions/browser/updater/extension_downloader_unittest.cc
+++ b/extensions/browser/updater/extension_downloader_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "extensions/browser/updater/extension_downloader.h"
 
+#include "base/bind_helpers.h"
 #include "base/sequenced_task_runner.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/test_utils.h"
diff --git a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
index d8d0903..6575001 100644
--- a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
+++ b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
@@ -16,6 +16,7 @@
 #include "base/bind.h"
 #include "base/i18n/string_search.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/utf_offset_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/fuchsia/engine/browser/frame_impl_browsertest.cc b/fuchsia/engine/browser/frame_impl_browsertest.cc
index 42c680e..357b6a6 100644
--- a/fuchsia/engine/browser/frame_impl_browsertest.cc
+++ b/fuchsia/engine/browser/frame_impl_browsertest.cc
@@ -9,6 +9,7 @@
 #include "base/containers/span.h"
 #include "base/fuchsia/fuchsia_logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/stringprintf.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/navigation_handle.h"
diff --git a/fuchsia/engine/browser/url_request_rewrite_rules_manager.cc b/fuchsia/engine/browser/url_request_rewrite_rules_manager.cc
index a93e660c..3aa14fa3 100644
--- a/fuchsia/engine/browser/url_request_rewrite_rules_manager.cc
+++ b/fuchsia/engine/browser/url_request_rewrite_rules_manager.cc
@@ -4,6 +4,7 @@
 
 #include "fuchsia/engine/browser/url_request_rewrite_rules_manager.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/strings/strcat.h"
 #include "fuchsia/base/string_util.h"
 #include "fuchsia/engine/url_request_rewrite_type_converters.h"
diff --git a/gin/gin_features.cc b/gin/gin_features.cc
index d49eb1b..d24cf1e4d 100644
--- a/gin/gin_features.cc
+++ b/gin/gin_features.cc
@@ -18,28 +18,11 @@
 const base::Feature kV8LazyFeedbackAllocation{"V8LazyFeedbackAllocation",
                                               base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Enables memory reducer for small heaps in V8.
-const base::Feature kV8MemoryReducerForSmallHeaps{
-    "V8MemoryReducerForSmallHeaps", base::FEATURE_ENABLED_BY_DEFAULT};
-
-// Increase V8 heap size to 4GB if the physical memory is bigger than 16 GB.
-const base::Feature kV8HugeMaxOldGenerationSize{
-    "V8HugeMaxOldGenerationSize", base::FEATURE_ENABLED_BY_DEFAULT};
-
-// Enables new background GC scheduling heuristics.
-const base::Feature kV8GCBackgroundSchedule{"V8GCBackgroundSchedule",
-                                            base::FEATURE_DISABLED_BY_DEFAULT};
-
-// Perform less compaction in non-memory reducing mode.
-const base::Feature kV8GCLessCompaction{"V8GCLessCompaction",
-                                        base::FEATURE_DISABLED_BY_DEFAULT};
-
-// Always promote young objects in Mark-Compact GC.
-const base::Feature kV8GCAlwaysPromoteYoungMC{
-    "V8GCAlwaysPromoteYoungMC", base::FEATURE_DISABLED_BY_DEFAULT};
-
 // Enable concurrent inlining in TurboFan.
 const base::Feature kV8ConcurrentInlining{"V8ConcurrentInlining",
                                           base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enable per-context marking worklists in V8 GC.
+const base::Feature kV8PerContextMarkingWorklist{
+    "V8PerContextMarkingWorklist", base::FEATURE_DISABLED_BY_DEFAULT};
 }  // namespace features
diff --git a/gin/gin_features.h b/gin/gin_features.h
index 5e8e0715..6502de3 100644
--- a/gin/gin_features.h
+++ b/gin/gin_features.h
@@ -13,12 +13,8 @@
 GIN_EXPORT extern const base::Feature kV8OptimizeJavascript;
 GIN_EXPORT extern const base::Feature kV8FlushBytecode;
 GIN_EXPORT extern const base::Feature kV8LazyFeedbackAllocation;
-GIN_EXPORT extern const base::Feature kV8MemoryReducerForSmallHeaps;
-GIN_EXPORT extern const base::Feature kV8HugeMaxOldGenerationSize;
-GIN_EXPORT extern const base::Feature kV8GCBackgroundSchedule;
-GIN_EXPORT extern const base::Feature kV8GCLessCompaction;
-GIN_EXPORT extern const base::Feature kV8GCAlwaysPromoteYoungMC;
 GIN_EXPORT extern const base::Feature kV8ConcurrentInlining;
+GIN_EXPORT extern const base::Feature kV8PerContextMarkingWorklist;
 
 }  // namespace features
 
diff --git a/gin/v8_initializer.cc b/gin/v8_initializer.cc
index 48bd647..3a3742e 100644
--- a/gin/v8_initializer.cc
+++ b/gin/v8_initializer.cc
@@ -218,42 +218,6 @@
                                sizeof(no_lazy_feedback_allocation) - 1);
   }
 
-  if (!base::FeatureList::IsEnabled(features::kV8MemoryReducerForSmallHeaps)) {
-    static const char no_memory_reducer[] =
-        "--no-memory-reducer-for-small-heaps";
-    v8::V8::SetFlagsFromString(no_memory_reducer,
-                               sizeof(no_memory_reducer) - 1);
-  }
-
-  if (base::FeatureList::IsEnabled(features::kV8HugeMaxOldGenerationSize)) {
-    static const char huge_max_old_generation_size[] =
-        "--huge_max_old_generation_size";
-    v8::V8::SetFlagsFromString(huge_max_old_generation_size,
-                               sizeof(huge_max_old_generation_size) - 1);
-  }
-
-  if (base::FeatureList::IsEnabled(features::kV8GCBackgroundSchedule)) {
-    static const char gc_experiment_background_schedule[] =
-        "--gc_experiment_background_schedule";
-    v8::V8::SetFlagsFromString(gc_experiment_background_schedule,
-                               sizeof(gc_experiment_background_schedule) - 1);
-  }
-
-  if (base::FeatureList::IsEnabled(features::kV8GCLessCompaction)) {
-    static const char gc_experiment_less_compaction[] =
-        "--gc_experiment_less_compaction";
-    v8::V8::SetFlagsFromString(gc_experiment_less_compaction,
-                               sizeof(gc_experiment_less_compaction) - 1);
-  }
-
-  if (base::FeatureList::IsEnabled(features::kV8GCAlwaysPromoteYoungMC)) {
-    static const char gc_experiment_always_promote_young_mc[] =
-        "--always_promote_young_mc";
-    v8::V8::SetFlagsFromString(
-        gc_experiment_always_promote_young_mc,
-        sizeof(gc_experiment_always_promote_young_mc) - 1);
-  }
-
   if (base::FeatureList::IsEnabled(features::kV8ConcurrentInlining)) {
     static const char tf_experiment_concurrent_inlining[] =
         "--concurrent_inlining";
@@ -261,6 +225,13 @@
                                sizeof(tf_experiment_concurrent_inlining) - 1);
   }
 
+  if (base::FeatureList::IsEnabled(features::kV8PerContextMarkingWorklist)) {
+    static const char stress_per_context_marking_worklist[] =
+        "--stress-per-context-marking-worklist";
+    v8::V8::SetFlagsFromString(stress_per_context_marking_worklist,
+                               sizeof(stress_per_context_marking_worklist) - 1);
+  }
+
   if (IsolateHolder::kStrictMode == mode) {
     static const char use_strict[] = "--use_strict";
     v8::V8::SetFlagsFromString(use_strict, sizeof(use_strict) - 1);
diff --git a/google_apis/drive/drive_api_requests.cc b/google_apis/drive/drive_api_requests.cc
index e9d15f8..00cb7f2 100644
--- a/google_apis/drive/drive_api_requests.cc
+++ b/google_apis/drive/drive_api_requests.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/json/json_writer.h"
 #include "base/location.h"
diff --git a/google_apis/drive/request_sender_unittest.cc b/google_apis/drive/request_sender_unittest.cc
index 3545ee2..c414c83 100644
--- a/google_apis/drive/request_sender_unittest.cc
+++ b/google_apis/drive/request_sender_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "google_apis/drive/base_requests.h"
diff --git a/google_apis/gaia/oauth2_access_token_manager.cc b/google_apis/gaia/oauth2_access_token_manager.cc
index 4be75ce..434f18e 100644
--- a/google_apis/gaia/oauth2_access_token_manager.cc
+++ b/google_apis/gaia/oauth2_access_token_manager.cc
@@ -4,6 +4,7 @@
 
 #include "google_apis/gaia/oauth2_access_token_manager.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn
index 432345e..5a9194d5 100644
--- a/gpu/command_buffer/service/BUILD.gn
+++ b/gpu/command_buffer/service/BUILD.gn
@@ -81,6 +81,7 @@
     "//base/third_party/dynamic_annotations",
     "//gpu/command_buffer/client:client_sources",
     "//gpu/config:config_sources",
+    "//gpu/ipc/common:ipc_common_sources",
     "//gpu/ipc/common:surface_handle_type",
     "//ui/gfx",
     "//ui/gfx/geometry",
diff --git a/gpu/command_buffer/service/external_vk_image_backing.cc b/gpu/command_buffer/service/external_vk_image_backing.cc
index 53823c1d..66c3591 100644
--- a/gpu/command_buffer/service/external_vk_image_backing.cc
+++ b/gpu/command_buffer/service/external_vk_image_backing.cc
@@ -7,6 +7,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/memory/ptr_util.h"
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/stl_util.h"
diff --git a/gpu/command_buffer/service/gpu_command_buffer_memory_tracker.cc b/gpu/command_buffer/service/gpu_command_buffer_memory_tracker.cc
index defeefb..fa686c24 100644
--- a/gpu/command_buffer/service/gpu_command_buffer_memory_tracker.cc
+++ b/gpu/command_buffer/service/gpu_command_buffer_memory_tracker.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/metrics/histogram_macros.h"
 #include "gpu/ipc/common/command_buffer_id.h"
+#include "gpu/ipc/common/gpu_peak_memory.h"
 
 // Macro to reduce code duplication when logging memory in
 // GpuCommandBufferMemoryTracker. This is needed as the UMA_HISTOGRAM_* macros
@@ -66,7 +67,9 @@
   uint64_t old_size = size_;
   size_ += delta;
   if (observer_)
-    observer_->OnMemoryAllocatedChange(command_buffer_id_, old_size, size_);
+    observer_->OnMemoryAllocatedChange(
+        command_buffer_id_, old_size, size_,
+        GpuPeakMemoryAllocationSource::COMMAND_BUFFER);
 }
 
 uint64_t GpuCommandBufferMemoryTracker::GetSize() const {
diff --git a/gpu/command_buffer/service/memory_tracking.h b/gpu/command_buffer/service/memory_tracking.h
index 6f67b46..ea211ded 100644
--- a/gpu/command_buffer/service/memory_tracking.h
+++ b/gpu/command_buffer/service/memory_tracking.h
@@ -14,6 +14,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/trace_event/trace_event.h"
 #include "gpu/command_buffer/common/command_buffer_id.h"
+#include "gpu/ipc/common/gpu_peak_memory.h"
 
 namespace gpu {
 
@@ -27,9 +28,11 @@
     Observer() = default;
     virtual ~Observer() = default;
 
-    virtual void OnMemoryAllocatedChange(CommandBufferId id,
-                                         uint64_t old_size,
-                                         uint64_t new_size) = 0;
+    virtual void OnMemoryAllocatedChange(
+        CommandBufferId id,
+        uint64_t old_size,
+        uint64_t new_size,
+        GpuPeakMemoryAllocationSource source) = 0;
 
    private:
     DISALLOW_COPY_AND_ASSIGN(Observer);
diff --git a/gpu/command_buffer/service/shared_context_state.cc b/gpu/command_buffer/service/shared_context_state.cc
index 6c5100e6..c8e0712 100644
--- a/gpu/command_buffer/service/shared_context_state.cc
+++ b/gpu/command_buffer/service/shared_context_state.cc
@@ -57,7 +57,7 @@
 }
 
 SharedContextState::MemoryTracker::MemoryTracker(
-    gpu::MemoryTracker::Observer* peak_memory_monitor)
+    base::WeakPtr<gpu::MemoryTracker::Observer> peak_memory_monitor)
     : peak_memory_monitor_(peak_memory_monitor) {}
 
 SharedContextState::MemoryTracker::~MemoryTracker() {
@@ -67,10 +67,15 @@
 void SharedContextState::MemoryTracker::OnMemoryAllocatedChange(
     CommandBufferId id,
     uint64_t old_size,
-    uint64_t new_size) {
+    uint64_t new_size,
+    GpuPeakMemoryAllocationSource source) {
   size_ += new_size - old_size;
-  if (peak_memory_monitor_)
-    peak_memory_monitor_->OnMemoryAllocatedChange(id, old_size, new_size);
+  if (source == GpuPeakMemoryAllocationSource::UNKNOWN)
+    source = GpuPeakMemoryAllocationSource::SHARED_CONTEXT_STATE;
+  if (peak_memory_monitor_) {
+    peak_memory_monitor_->OnMemoryAllocatedChange(id, old_size, new_size,
+                                                  source);
+  }
 }
 
 SharedContextState::SharedContextState(
@@ -83,7 +88,7 @@
     viz::VulkanContextProvider* vulkan_context_provider,
     viz::MetalContextProvider* metal_context_provider,
     viz::DawnContextProvider* dawn_context_provider,
-    gpu::MemoryTracker::Observer* peak_memory_monitor)
+    base::WeakPtr<gpu::MemoryTracker::Observer> peak_memory_monitor)
     : use_virtualized_gl_contexts_(use_virtualized_gl_contexts),
       context_lost_callback_(std::move(context_lost_callback)),
       gr_context_type_(gr_context_type),
diff --git a/gpu/command_buffer/service/shared_context_state.h b/gpu/command_buffer/service/shared_context_state.h
index df30bdf..5c83ed2 100644
--- a/gpu/command_buffer/service/shared_context_state.h
+++ b/gpu/command_buffer/service/shared_context_state.h
@@ -19,6 +19,7 @@
 #include "gpu/command_buffer/service/memory_tracking.h"
 #include "gpu/config/gpu_preferences.h"
 #include "gpu/gpu_gles2_export.h"
+#include "gpu/ipc/common/gpu_peak_memory.h"
 #include "third_party/skia/include/gpu/GrContext.h"
 #include "ui/gl/progress_reporter.h"
 
@@ -62,7 +63,8 @@
       viz::VulkanContextProvider* vulkan_context_provider = nullptr,
       viz::MetalContextProvider* metal_context_provider = nullptr,
       viz::DawnContextProvider* dawn_context_provider = nullptr,
-      gpu::MemoryTracker::Observer* peak_memory_monitor = nullptr);
+      base::WeakPtr<gpu::MemoryTracker::Observer> peak_memory_monitor =
+          nullptr);
 
   void InitializeGrContext(const GpuPreferences& gpu_preferences,
                            const GpuDriverBugWorkarounds& workarounds,
@@ -157,22 +159,26 @@
   // shared image, and forward information to both histograms and task manager.
   class GPU_GLES2_EXPORT MemoryTracker : public gpu::MemoryTracker::Observer {
    public:
-    MemoryTracker(gpu::MemoryTracker::Observer* peak_memory_monitor);
+    explicit MemoryTracker(
+        base::WeakPtr<gpu::MemoryTracker::Observer> peak_memory_monitor);
     MemoryTracker(MemoryTracker&) = delete;
     MemoryTracker& operator=(MemoryTracker&) = delete;
     ~MemoryTracker() override;
 
     // gpu::MemoryTracker::Observer implementation:
-    void OnMemoryAllocatedChange(CommandBufferId id,
-                                 uint64_t old_size,
-                                 uint64_t new_size) override;
+    void OnMemoryAllocatedChange(
+        CommandBufferId id,
+        uint64_t old_size,
+        uint64_t new_size,
+        GpuPeakMemoryAllocationSource source =
+            GpuPeakMemoryAllocationSource::UNKNOWN) override;
 
     // Reports to GpuServiceImpl::GetVideoMemoryUsageStats()
     uint64_t GetMemoryUsage() const { return size_; }
 
    private:
     uint64_t size_ = 0;
-    gpu::MemoryTracker::Observer* const peak_memory_monitor_;
+    base::WeakPtr<gpu::MemoryTracker::Observer> const peak_memory_monitor_;
   };
 
   ~SharedContextState() override;
diff --git a/gpu/command_buffer/service/shared_image_representation_gl_ozone.cc b/gpu/command_buffer/service/shared_image_representation_gl_ozone.cc
index 3668c2f..0e705ba 100644
--- a/gpu/command_buffer/service/shared_image_representation_gl_ozone.cc
+++ b/gpu/command_buffer/service/shared_image_representation_gl_ozone.cc
@@ -4,6 +4,7 @@
 
 #include "gpu/command_buffer/service/shared_image_representation_gl_ozone.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "components/viz/common/resources/resource_format.h"
 #include "components/viz/common/resources/resource_format_utils.h"
diff --git a/gpu/command_buffer/service/shared_image_representation_skia_gl.cc b/gpu/command_buffer/service/shared_image_representation_skia_gl.cc
index 9f003ba..23ce89e 100644
--- a/gpu/command_buffer/service/shared_image_representation_skia_gl.cc
+++ b/gpu/command_buffer/service/shared_image_representation_skia_gl.cc
@@ -4,6 +4,7 @@
 
 #include "gpu/command_buffer/service/shared_image_representation_skia_gl.h"
 
+#include "base/memory/ptr_util.h"
 #include "components/viz/common/resources/resource_format_utils.h"
 #include "gpu/command_buffer/service/shared_context_state.h"
 #include "gpu/command_buffer/service/skia_utils.h"
diff --git a/gpu/ipc/client/gpu_channel_host.cc b/gpu/ipc/client/gpu_channel_host.cc
index f4b459e..502ebf9 100644
--- a/gpu/ipc/client/gpu_channel_host.cc
+++ b/gpu/ipc/client/gpu_channel_host.cc
@@ -9,6 +9,7 @@
 
 #include "base/atomic_sequence_num.h"
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/gpu/ipc/common/BUILD.gn b/gpu/ipc/common/BUILD.gn
index aff2b97..6624d22 100644
--- a/gpu/ipc/common/BUILD.gn
+++ b/gpu/ipc/common/BUILD.gn
@@ -74,6 +74,7 @@
     "gpu_param_traits.cc",
     "gpu_param_traits.h",
     "gpu_param_traits_macros.h",
+    "gpu_peak_memory.h",
     "gpu_watchdog_timeout.h",
     "memory_stats.cc",
     "memory_stats.h",
@@ -203,6 +204,7 @@
     "gpu_extra_info.mojom",
     "gpu_feature_info.mojom",
     "gpu_info.mojom",
+    "gpu_peak_memory.mojom",
     "mailbox.mojom",
     "mailbox_holder.mojom",
     "memory_stats.mojom",
@@ -284,6 +286,7 @@
 source_set("mojom_traits") {
   sources = [
     "context_result_mojom_traits.h",
+    "gpu_peak_memory_mojom_traits.h",
     "mailbox_holder_mojom_traits.h",
     "mailbox_mojom_traits.h",
     "memory_stats_mojom_traits.h",
diff --git a/gpu/ipc/common/gpu_peak_memory.h b/gpu/ipc/common/gpu_peak_memory.h
new file mode 100644
index 0000000..2baa4631
--- /dev/null
+++ b/gpu/ipc/common/gpu_peak_memory.h
@@ -0,0 +1,21 @@
+// Copyright 2020 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 GPU_IPC_COMMON_GPU_PEAK_MEMORY_H_
+#define GPU_IPC_COMMON_GPU_PEAK_MEMORY_H_
+
+namespace gpu {
+
+enum class GpuPeakMemoryAllocationSource {
+  UNKNOWN,
+  COMMAND_BUFFER,
+  SHARED_CONTEXT_STATE,
+  SHARED_IMAGE_STUB,
+  SKIA,
+  GPU_PEAK_MEMORY_ALLOCATION_SOURCE_MAX = SKIA,
+};
+
+}  // namespace gpu
+
+#endif  // GPU_IPC_COMMON_GPU_PEAK_MEMORY_H_
diff --git a/gpu/ipc/common/gpu_peak_memory.mojom b/gpu/ipc/common/gpu_peak_memory.mojom
new file mode 100644
index 0000000..e184b54
--- /dev/null
+++ b/gpu/ipc/common/gpu_peak_memory.mojom
@@ -0,0 +1,16 @@
+// Copyright 2020 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.
+
+// gpu/common/gpu_peak_memory.h
+module gpu.mojom;
+
+// gpu:GpuPeakMemoryAllocationSource
+enum GpuPeakMemoryAllocationSource
+{
+  UNKNOWN,
+  COMMAND_BUFFER,
+  SHARED_CONTEXT_STATE,
+  SHARED_IMAGE_STUB,
+  SKIA,
+};
diff --git a/gpu/ipc/common/gpu_peak_memory.typemap b/gpu/ipc/common/gpu_peak_memory.typemap
new file mode 100644
index 0000000..da13728
--- /dev/null
+++ b/gpu/ipc/common/gpu_peak_memory.typemap
@@ -0,0 +1,9 @@
+# Copyright 2020 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.
+
+mojom = "//gpu/ipc/common/gpu_peak_memory.mojom"
+public_headers = [ "//gpu/ipc/common/gpu_peak_memory.h" ]
+traits_headers = [ "//gpu/ipc/common/gpu_peak_memory_mojom_traits.h" ]
+public_deps = [ "//gpu/ipc/common" ]
+type_mappings = [ "gpu.mojom.GpuPeakMemoryAllocationSource=::gpu::GpuPeakMemoryAllocationSource" ]
diff --git a/gpu/ipc/common/gpu_peak_memory_mojom_traits.h b/gpu/ipc/common/gpu_peak_memory_mojom_traits.h
new file mode 100644
index 0000000..8e3b39c
--- /dev/null
+++ b/gpu/ipc/common/gpu_peak_memory_mojom_traits.h
@@ -0,0 +1,61 @@
+// Copyright 2020 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 GPU_IPC_COMMON_GPU_PEAK_MEMORY_MOJOM_TRAITS_H_
+#define GPU_IPC_COMMON_GPU_PEAK_MEMORY_MOJOM_TRAITS_H_
+
+#include "gpu/ipc/common/gpu_peak_memory.h"
+#include "gpu/ipc/common/gpu_peak_memory.mojom-shared.h"
+
+namespace mojo {
+
+template <>
+struct EnumTraits<gpu::mojom::GpuPeakMemoryAllocationSource,
+                  gpu::GpuPeakMemoryAllocationSource> {
+  static gpu::mojom::GpuPeakMemoryAllocationSource ToMojom(
+      gpu::GpuPeakMemoryAllocationSource gpu_peak_memory_allocation_source) {
+    switch (gpu_peak_memory_allocation_source) {
+      case gpu::GpuPeakMemoryAllocationSource::UNKNOWN:
+        return gpu::mojom::GpuPeakMemoryAllocationSource::UNKNOWN;
+      case gpu::GpuPeakMemoryAllocationSource::COMMAND_BUFFER:
+        return gpu::mojom::GpuPeakMemoryAllocationSource::COMMAND_BUFFER;
+      case gpu::GpuPeakMemoryAllocationSource::SHARED_CONTEXT_STATE:
+        return gpu::mojom::GpuPeakMemoryAllocationSource::SHARED_CONTEXT_STATE;
+      case gpu::GpuPeakMemoryAllocationSource::SHARED_IMAGE_STUB:
+        return gpu::mojom::GpuPeakMemoryAllocationSource::SHARED_IMAGE_STUB;
+      case gpu::GpuPeakMemoryAllocationSource::SKIA:
+        return gpu::mojom::GpuPeakMemoryAllocationSource::SKIA;
+    }
+    NOTREACHED() << "Invalid GpuPeakMemoryAllocationSource:"
+                 << static_cast<int>(gpu_peak_memory_allocation_source);
+    return gpu::mojom::GpuPeakMemoryAllocationSource::UNKNOWN;
+  }
+
+  static bool FromMojom(gpu::mojom::GpuPeakMemoryAllocationSource input,
+                        gpu::GpuPeakMemoryAllocationSource* out) {
+    switch (input) {
+      case gpu::mojom::GpuPeakMemoryAllocationSource::UNKNOWN:
+        *out = gpu::GpuPeakMemoryAllocationSource::UNKNOWN;
+        return true;
+      case gpu::mojom::GpuPeakMemoryAllocationSource::COMMAND_BUFFER:
+        *out = gpu::GpuPeakMemoryAllocationSource::COMMAND_BUFFER;
+        return true;
+      case gpu::mojom::GpuPeakMemoryAllocationSource::SHARED_CONTEXT_STATE:
+        *out = gpu::GpuPeakMemoryAllocationSource::SHARED_CONTEXT_STATE;
+        return true;
+      case gpu::mojom::GpuPeakMemoryAllocationSource::SHARED_IMAGE_STUB:
+        *out = gpu::GpuPeakMemoryAllocationSource::SHARED_IMAGE_STUB;
+        return true;
+      case gpu::mojom::GpuPeakMemoryAllocationSource::SKIA:
+        *out = gpu::GpuPeakMemoryAllocationSource::SKIA;
+        return true;
+    }
+    NOTREACHED() << "Invalid GpuPeakMemoryAllocationSource: " << input;
+    return false;
+  }
+};
+
+}  // namespace mojo
+
+#endif  // GPU_IPC_COMMON_GPU_PEAK_MEMORY_MOJOM_TRAITS_H_
diff --git a/gpu/ipc/common/typemaps.gni b/gpu/ipc/common/typemaps.gni
index b7862d42..0cafc3c9 100644
--- a/gpu/ipc/common/typemaps.gni
+++ b/gpu/ipc/common/typemaps.gni
@@ -9,6 +9,7 @@
   "//gpu/ipc/common/dx_diag_node.typemap",
   "//gpu/ipc/common/gpu_feature_info.typemap",
   "//gpu/ipc/common/gpu_info.typemap",
+  "//gpu/ipc/common/gpu_peak_memory.typemap",
   "//gpu/ipc/common/gpu_preferences.typemap",
   "//gpu/ipc/common/gpu_extra_info.typemap",
   "//gpu/ipc/common/mailbox.typemap",
diff --git a/gpu/ipc/service/gpu_channel.cc b/gpu/ipc/service/gpu_channel.cc
index b7749a86..3d64d4d 100644
--- a/gpu/ipc/service/gpu_channel.cc
+++ b/gpu/ipc/service/gpu_channel.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "gpu/ipc/service/gpu_channel.h"
+#include "base/memory/ptr_util.h"
 
 #include <utility>
 
diff --git a/gpu/ipc/service/gpu_channel_manager.cc b/gpu/ipc/service/gpu_channel_manager.cc
index 320ac4f..5f5c429 100644
--- a/gpu/ipc/service/gpu_channel_manager.cc
+++ b/gpu/ipc/service/gpu_channel_manager.cc
@@ -15,6 +15,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/system/sys_info.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "base/trace_event/traced_value.h"
 #include "build/build_config.h"
 #include "components/viz/common/features.h"
 #include "gpu/command_buffer/common/context_creation_attribs.h"
@@ -76,43 +77,103 @@
   }
 }
 #endif
+
+std::unique_ptr<base::trace_event::TracedValue>
+FormatAllocationSourcesForTracing(
+    base::flat_map<GpuPeakMemoryAllocationSource, uint64_t>&
+        allocation_sources) {
+  auto dict = std::make_unique<base::trace_event::TracedValue>();
+  dict->SetInteger("UNKNOWN",
+                   allocation_sources[GpuPeakMemoryAllocationSource::UNKNOWN]);
+  dict->SetInteger(
+      "COMMAND_BUFFER",
+      allocation_sources[GpuPeakMemoryAllocationSource::COMMAND_BUFFER]);
+  dict->SetInteger(
+      "SHARED_CONTEXT_STATE",
+      allocation_sources[GpuPeakMemoryAllocationSource::SHARED_CONTEXT_STATE]);
+  dict->SetInteger(
+      "SHARED_IMAGE_STUB",
+      allocation_sources[GpuPeakMemoryAllocationSource::SHARED_IMAGE_STUB]);
+  dict->SetInteger("SKIA",
+                   allocation_sources[GpuPeakMemoryAllocationSource::SKIA]);
+  return dict;
 }
 
+}  // namespace
+
 GpuChannelManager::GpuPeakMemoryMonitor::GpuPeakMemoryMonitor()
     : weak_factory_(this) {}
 
-GpuChannelManager::GpuPeakMemoryMonitor::~GpuPeakMemoryMonitor() {}
+GpuChannelManager::GpuPeakMemoryMonitor::~GpuPeakMemoryMonitor() = default;
 
-uint64_t GpuChannelManager::GpuPeakMemoryMonitor::GetPeakMemoryUsage(
-    uint32_t sequence_num) {
+base::flat_map<GpuPeakMemoryAllocationSource, uint64_t>
+GpuChannelManager::GpuPeakMemoryMonitor::GetPeakMemoryUsage(
+    uint32_t sequence_num,
+    uint64_t* out_peak_memory) {
   auto sequence = sequence_trackers_.find(sequence_num);
-  if (sequence != sequence_trackers_.end())
-    return sequence->second;
-  return 0u;
+  base::flat_map<GpuPeakMemoryAllocationSource, uint64_t> allocation_per_source;
+  *out_peak_memory = 0u;
+  if (sequence != sequence_trackers_.end()) {
+    *out_peak_memory = sequence->second.total_memory_;
+    allocation_per_source = sequence->second.peak_memory_per_source_;
+  }
+  return allocation_per_source;
 }
 
 void GpuChannelManager::GpuPeakMemoryMonitor::StartGpuMemoryTracking(
     uint32_t sequence_num) {
-  TRACE_EVENT_ASYNC_BEGIN1("gpu", "PeakMemoryTracking", sequence_num, "start",
-                           current_memory_);
-  sequence_trackers_.emplace(sequence_num, current_memory_);
+  sequence_trackers_.emplace(
+      sequence_num,
+      SequenceTracker(current_memory_, current_memory_per_source_));
+
+  auto dict = FormatAllocationSourcesForTracing(current_memory_per_source_);
+  TRACE_EVENT_ASYNC_BEGIN2("gpu", "PeakMemoryTracking", sequence_num, "start",
+                           current_memory_, "start_sources", std::move(dict));
 }
 
 void GpuChannelManager::GpuPeakMemoryMonitor::StopGpuMemoryTracking(
     uint32_t sequence_num) {
   auto sequence = sequence_trackers_.find(sequence_num);
   if (sequence != sequence_trackers_.end()) {
-    TRACE_EVENT_ASYNC_END1("gpu", "PeakMemoryTracking", sequence_num, "peak",
-                           sequence->second);
+    auto dict = FormatAllocationSourcesForTracing(
+        sequence->second.peak_memory_per_source_);
+    TRACE_EVENT_ASYNC_END2("gpu", "PeakMemoryTracking", sequence_num, "peak",
+                           sequence->second.total_memory_, "end_sources",
+                           std::move(dict));
     sequence_trackers_.erase(sequence);
   }
 }
 
+base::WeakPtr<MemoryTracker::Observer>
+GpuChannelManager::GpuPeakMemoryMonitor::GetWeakPtr() {
+  return weak_factory_.GetWeakPtr();
+}
+
+void GpuChannelManager::GpuPeakMemoryMonitor::InvalidateWeakPtrs() {
+  weak_factory_.InvalidateWeakPtrs();
+}
+
+GpuChannelManager::GpuPeakMemoryMonitor::SequenceTracker::SequenceTracker(
+    uint64_t current_memory,
+    base::flat_map<GpuPeakMemoryAllocationSource, uint64_t>
+        current_memory_per_source)
+    : total_memory_(current_memory),
+      peak_memory_per_source_(std::move(current_memory_per_source)) {}
+
+GpuChannelManager::GpuPeakMemoryMonitor::SequenceTracker::SequenceTracker(
+    const SequenceTracker& other) = default;
+
+GpuChannelManager::GpuPeakMemoryMonitor::SequenceTracker::~SequenceTracker() =
+    default;
+
 void GpuChannelManager::GpuPeakMemoryMonitor::OnMemoryAllocatedChange(
     CommandBufferId id,
     uint64_t old_size,
-    uint64_t new_size) {
-  current_memory_ += new_size - old_size;
+    uint64_t new_size,
+    GpuPeakMemoryAllocationSource source) {
+  uint64_t diff = new_size - old_size;
+  current_memory_ += diff;
+  current_memory_per_source_[source] += diff;
   if (old_size < new_size) {
     // When memory has increased, iterate over the sequences to update their
     // peak.
@@ -122,13 +183,16 @@
     // |peak_since_last_sequence_update_| on the the memory changes. Then only
     // update the sequences with a new one is added, or the peak is requested.
     for (auto& sequence : sequence_trackers_) {
-      if (current_memory_ > sequence.second) {
-        sequence.second = current_memory_;
+      if (current_memory_ > sequence.second.total_memory_) {
+        sequence.second.total_memory_ = current_memory_;
         for (auto& sequence : sequence_trackers_) {
           TRACE_EVENT_ASYNC_STEP_INTO1("gpu", "PeakMemoryTracking",
                                        sequence.first, "Peak", "peak",
                                        current_memory_);
         }
+        for (auto& source : current_memory_per_source_) {
+          sequence.second.peak_memory_per_source_[source.first] = source.second;
+        }
       }
     }
   }
@@ -206,6 +270,10 @@
     default_offscreen_surface_ = nullptr;
   }
 
+  // Inavlidate here as the |shared_context_state_| attempts to call back to
+  // |this| in the middle of the deletion.
+  peak_memory_monitor_.InvalidateWeakPtrs();
+
   // Try to make the context current so that GPU resources can be destroyed
   // correctly.
   if (shared_context_state_)
@@ -378,12 +446,14 @@
   peak_memory_monitor_.StartGpuMemoryTracking(sequence_num);
 }
 
-uint64_t GpuChannelManager::GetPeakMemoryUsage(uint32_t sequence_num) {
+base::flat_map<GpuPeakMemoryAllocationSource, uint64_t>
+GpuChannelManager::GetPeakMemoryUsage(uint32_t sequence_num,
+                                      uint64_t* out_peak_memory) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  uint64_t total_memory = peak_memory_monitor_.GetPeakMemoryUsage(sequence_num);
+  auto allocation_per_source =
+      peak_memory_monitor_.GetPeakMemoryUsage(sequence_num, out_peak_memory);
   peak_memory_monitor_.StopGpuMemoryTracking(sequence_num);
-  return total_memory;
+  return allocation_per_source;
 }
 
 #if defined(OS_ANDROID)
@@ -593,7 +663,8 @@
       base::BindOnce(&GpuChannelManager::OnContextLost, base::Unretained(this),
                      /*synthetic_loss=*/false),
       gpu_preferences_.gr_context_type, vulkan_context_provider_,
-      metal_context_provider_, dawn_context_provider_, peak_memory_monitor());
+      metal_context_provider_, dawn_context_provider_,
+      peak_memory_monitor_.GetWeakPtr());
 
   // OOP-R needs GrContext for raster tiles.
   bool need_gr_context =
diff --git a/gpu/ipc/service/gpu_channel_manager.h b/gpu/ipc/service/gpu_channel_manager.h
index c7d145a..785fd7e 100644
--- a/gpu/ipc/service/gpu_channel_manager.h
+++ b/gpu/ipc/service/gpu_channel_manager.h
@@ -32,6 +32,7 @@
 #include "gpu/config/gpu_driver_bug_workarounds.h"
 #include "gpu/config/gpu_feature_info.h"
 #include "gpu/config/gpu_preferences.h"
+#include "gpu/ipc/common/gpu_peak_memory.h"
 #include "gpu/ipc/service/gpu_ipc_service_export.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/gfx/native_widget_types.h"
@@ -168,8 +169,11 @@
   // |sequence_num|. Repeated calls with the same value are ignored.
   void StartPeakMemoryMonitor(uint32_t sequence_num);
 
-  // Ends the tracking for |sequence_num| and returns the peak memory usage.
-  uint64_t GetPeakMemoryUsage(uint32_t sequence_num);
+  // Ends the tracking for |sequence_num| and returns the peak memory per
+  // allocation source. Along with the total |out_peak_memory|.
+  base::flat_map<GpuPeakMemoryAllocationSource, uint64_t> GetPeakMemoryUsage(
+      uint32_t sequence_num,
+      uint64_t* out_peak_memory);
 
   scoped_refptr<SharedContextState> GetSharedContextState(
       ContextResult* result);
@@ -198,22 +202,45 @@
     GpuPeakMemoryMonitor();
     ~GpuPeakMemoryMonitor() override;
 
-    uint64_t GetPeakMemoryUsage(uint32_t sequence_num);
+    base::flat_map<GpuPeakMemoryAllocationSource, uint64_t> GetPeakMemoryUsage(
+        uint32_t sequence_num,
+        uint64_t* out_peak_memory);
     void StartGpuMemoryTracking(uint32_t sequence_num);
     void StopGpuMemoryTracking(uint32_t sequence_num);
 
+    base::WeakPtr<MemoryTracker::Observer> GetWeakPtr();
+    void InvalidateWeakPtrs();
+
    private:
+    struct SequenceTracker {
+     public:
+      SequenceTracker(uint64_t current_memory,
+                      base::flat_map<GpuPeakMemoryAllocationSource, uint64_t>
+                          current_memory_per_source);
+      SequenceTracker(const SequenceTracker&);
+      ~SequenceTracker();
+
+      uint64_t total_memory_ = 0u;
+      base::flat_map<GpuPeakMemoryAllocationSource, uint64_t>
+          peak_memory_per_source_;
+    };
     // MemoryTracker::Observer:
-    void OnMemoryAllocatedChange(CommandBufferId id,
-                                 uint64_t old_size,
-                                 uint64_t new_size) override;
+    void OnMemoryAllocatedChange(
+        CommandBufferId id,
+        uint64_t old_size,
+        uint64_t new_size,
+        GpuPeakMemoryAllocationSource source =
+            GpuPeakMemoryAllocationSource::UNKNOWN) override;
 
     // Tracks all currently requested sequences mapped to the peak memory seen.
-    base::flat_map<uint32_t, uint64_t> sequence_trackers_;
+    base::flat_map<uint32_t, SequenceTracker> sequence_trackers_;
 
     // Tracks the total current memory across all MemoryTrackers.
     uint64_t current_memory_ = 0u;
 
+    base::flat_map<GpuPeakMemoryAllocationSource, uint64_t>
+        current_memory_per_source_;
+
     base::WeakPtrFactory<GpuPeakMemoryMonitor> weak_factory_;
     DISALLOW_COPY_AND_ASSIGN(GpuPeakMemoryMonitor);
   };
diff --git a/gpu/ipc/service/gpu_channel_manager_unittest.cc b/gpu/ipc/service/gpu_channel_manager_unittest.cc
index 8e1d1a70..a22a6f6d 100644
--- a/gpu/ipc/service/gpu_channel_manager_unittest.cc
+++ b/gpu/ipc/service/gpu_channel_manager_unittest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <limits.h>
 #include <stddef.h>
 #include <stdint.h>
 
@@ -16,6 +17,9 @@
 
 class GpuChannelManagerTest : public GpuChannelTestCommon {
  public:
+  static constexpr uint64_t kUInt64_T_Max =
+      std::numeric_limits<uint64_t>::max();
+
   GpuChannelManagerTest()
       : GpuChannelTestCommon(true /* use_stub_bindings */) {}
   ~GpuChannelManagerTest() override = default;
@@ -24,9 +28,25 @@
     return &channel_manager()->peak_memory_monitor_;
   }
 
+  // Returns the peak memory usage from the channel_manager(). This will stop
+  // tracking for |sequence_number|.
+  uint64_t GetManagersPeakMemoryUsage(uint32_t sequence_num) {
+    // Set default as max so that invalid cases can properly test 0u returns.
+    uint64_t peak_memory = kUInt64_T_Max;
+    auto allocation =
+        channel_manager()->GetPeakMemoryUsage(sequence_num, &peak_memory);
+    return peak_memory;
+  }
+
+  // Returns the peak memory usage currently stores in the GpuPeakMemoryMonitor.
+  // Does not shut down tracking for |sequence_num|.
   uint64_t GetMonitorsPeakMemoryUsage(uint32_t sequence_num) {
-    return channel_manager()->peak_memory_monitor_.GetPeakMemoryUsage(
-        sequence_num);
+    // Set default as max so that invalid cases can properly test 0u returns.
+    uint64_t peak_memory = kUInt64_T_Max;
+    auto allocation =
+        channel_manager()->peak_memory_monitor_.GetPeakMemoryUsage(
+            sequence_num, &peak_memory);
+    return peak_memory;
   }
 
   // Helpers to call MemoryTracker::Observer methods of
@@ -35,7 +55,8 @@
                                uint64_t old_size,
                                uint64_t new_size) {
     static_cast<MemoryTracker::Observer*>(gpu_peak_memory_monitor())
-        ->OnMemoryAllocatedChange(id, old_size, new_size);
+        ->OnMemoryAllocatedChange(id, old_size, new_size,
+                                  GpuPeakMemoryAllocationSource::UNKNOWN);
   }
 
 #if defined(OS_ANDROID)
@@ -128,13 +149,13 @@
   // With no request to listen to memory it should report 0.
   const uint32_t invalid_sequence_num = 1337;
   EXPECT_EQ(0u, GetMonitorsPeakMemoryUsage(invalid_sequence_num));
-  EXPECT_EQ(0u, manager->GetPeakMemoryUsage(invalid_sequence_num));
+  EXPECT_EQ(0u, GetManagersPeakMemoryUsage(invalid_sequence_num));
 
   // The valid sequence should receive a report.
-  EXPECT_EQ(current_memory, manager->GetPeakMemoryUsage(sequence_num));
+  EXPECT_EQ(current_memory, GetManagersPeakMemoryUsage(sequence_num));
   // However it should be shut-down and no longer report anything.
   EXPECT_EQ(0u, GetMonitorsPeakMemoryUsage(sequence_num));
-  EXPECT_EQ(0u, manager->GetPeakMemoryUsage(sequence_num));
+  EXPECT_EQ(0u, GetManagersPeakMemoryUsage(sequence_num));
 }
 
 // Tests that while a channel may exist for longer than a request to monitor,
@@ -158,7 +179,7 @@
   // the peak seen during the observation of |sequence_num|.
   const uint64_t localized_peak_memory = 24;
   OnMemoryAllocatedChange(buffer_id, reduced_memory, localized_peak_memory);
-  EXPECT_EQ(localized_peak_memory, manager->GetPeakMemoryUsage(sequence_num));
+  EXPECT_EQ(localized_peak_memory, GetManagersPeakMemoryUsage(sequence_num));
 }
 
 // Checks that when there are more than one sequence, that each has a separately
@@ -185,8 +206,8 @@
   const uint64_t localized_peak_memory = 24;
   OnMemoryAllocatedChange(buffer_id, reduced_memory, localized_peak_memory);
 
-  EXPECT_EQ(initial_memory, manager->GetPeakMemoryUsage(sequence_num_1));
-  EXPECT_EQ(localized_peak_memory, manager->GetPeakMemoryUsage(sequence_num_2));
+  EXPECT_EQ(initial_memory, GetManagersPeakMemoryUsage(sequence_num_1));
+  EXPECT_EQ(localized_peak_memory, GetManagersPeakMemoryUsage(sequence_num_2));
 }
 
 }  // namespace gpu
diff --git a/gpu/ipc/service/gpu_watchdog_thread.cc b/gpu/ipc/service/gpu_watchdog_thread.cc
index 35f5230c..cc5d8a9 100644
--- a/gpu/ipc/service/gpu_watchdog_thread.cc
+++ b/gpu/ipc/service/gpu_watchdog_thread.cc
@@ -9,6 +9,7 @@
 #include "base/debug/alias.h"
 #include "base/files/file_util.h"
 #include "base/format_macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop_current.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/power_monitor/power_monitor.h"
diff --git a/gpu/ipc/service/gpu_watchdog_thread_v2.cc b/gpu/ipc/service/gpu_watchdog_thread_v2.cc
index 300eebdd..b0b81a7 100644
--- a/gpu/ipc/service/gpu_watchdog_thread_v2.cc
+++ b/gpu/ipc/service/gpu_watchdog_thread_v2.cc
@@ -11,6 +11,7 @@
 #include "base/debug/alias.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
+#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop_current.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/persistent_histogram_allocator.h"
diff --git a/gpu/ipc/service/shared_image_stub.cc b/gpu/ipc/service/shared_image_stub.cc
index 980c95b7..3078923 100644
--- a/gpu/ipc/service/shared_image_stub.cc
+++ b/gpu/ipc/service/shared_image_stub.cc
@@ -6,6 +6,7 @@
 
 #include <inttypes.h>
 
+#include "base/memory/ptr_util.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "base/trace_event/trace_event.h"
 #include "components/viz/common/features.h"
@@ -13,6 +14,7 @@
 #include "gpu/command_buffer/service/scheduler.h"
 #include "gpu/command_buffer/service/shared_image_factory.h"
 #include "gpu/ipc/common/command_buffer_id.h"
+#include "gpu/ipc/common/gpu_peak_memory.h"
 #include "gpu/ipc/service/gpu_channel.h"
 #include "gpu/ipc/service/gpu_channel_manager.h"
 #include "gpu/ipc/service/gpu_memory_buffer_factory.h"
@@ -447,7 +449,9 @@
   size_ += delta;
   channel_->gpu_channel_manager()
       ->peak_memory_monitor()
-      ->OnMemoryAllocatedChange(command_buffer_id_, old_size, size_);
+      ->OnMemoryAllocatedChange(
+          command_buffer_id_, old_size, size_,
+          GpuPeakMemoryAllocationSource::SHARED_IMAGE_STUB);
 }
 
 uint64_t SharedImageStub::GetSize() const {
diff --git a/headless/BUILD.gn b/headless/BUILD.gn
index 2ced5d6..c8359b6 100644
--- a/headless/BUILD.gn
+++ b/headless/BUILD.gn
@@ -641,7 +641,7 @@
     "$root_out_dir/headless_lib.pak",
     "//net/tools/testserver/",
     "//third_party/blink/web_tests/http/tests/inspector-protocol/",
-    "//third_party/pywebsocket/",
+    "//third_party/pywebsocket3/",
     "//third_party/tlslite/",
     "test/data/",
   ]
diff --git a/headless/lib/browser/headless_browser_context_impl.cc b/headless/lib/browser/headless_browser_context_impl.cc
index b4b3e45..16e03c4 100644
--- a/headless/lib/browser/headless_browser_context_impl.cc
+++ b/headless/lib/browser/headless_browser_context_impl.cc
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/guid.h"
+#include "base/memory/ptr_util.h"
 #include "base/path_service.h"
 #include "base/task/post_task.h"
 #include "components/keyed_service/core/simple_key_map.h"
diff --git a/headless/lib/browser/headless_web_contents_impl.cc b/headless/lib/browser/headless_web_contents_impl.cc
index 8a87c5e..e120fe1 100644
--- a/headless/lib/browser/headless_web_contents_impl.cc
+++ b/headless/lib/browser/headless_web_contents_impl.cc
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/infra/config/buckets/webrtc.fyi.star b/infra/config/buckets/webrtc.fyi.star
index 6fc8c9bb..12361c7 100644
--- a/infra/config/buckets/webrtc.fyi.star
+++ b/infra/config/buckets/webrtc.fyi.star
@@ -151,6 +151,7 @@
     name = 'WebRTC Chromium FYI ios-device',
     caches = [xcode_cache.x11c29],
     executable = 'recipe:webrtc/chromium_ios',
+    goma_backend = goma.backend.RBE_PROD,
     os = os.MAC_ANY,
 )
 
@@ -158,5 +159,6 @@
     name = 'WebRTC Chromium FYI ios-simulator',
     caches = [xcode_cache.x11c29],
     executable = 'recipe:webrtc/chromium_ios',
+    goma_backend = goma.backend.RBE_PROD,
     os = os.MAC_ANY,
 )
diff --git a/infra/config/consoles/chromium.goma.migration.star b/infra/config/consoles/chromium.goma.migration.star
index 4304ea4..1a61bb9 100644
--- a/infra/config/consoles/chromium.goma.migration.star
+++ b/infra/config/consoles/chromium.goma.migration.star
@@ -1154,5 +1154,15 @@
             category = 'cros|week3|kevin',
             short_name = 'hwtests',
         ),
+        luci.console_view_entry(
+            builder = 'webrtc.fyi/WebRTC Chromium FYI ios-device',
+            category = 'ios|week1a',
+            short_name = 'dev',
+        ),
+        luci.console_view_entry(
+            builder = 'webrtc.fyi/WebRTC Chromium FYI ios-simulator',
+            category = 'ios|week1a',
+            short_name = 'sim',
+        ),
     ],
 )
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index a7e12f1..82ba1b7 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -20385,6 +20385,7 @@
         name: "webrtc/chromium_ios"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "mastername:\"chromium.webrtc.fyi\""
       >
       execution_timeout_secs: 7200
@@ -20406,6 +20407,7 @@
         name: "webrtc/chromium_ios"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "mastername:\"chromium.webrtc.fyi\""
       >
       execution_timeout_secs: 7200
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg
index 0146a61..282eb04 100644
--- a/infra/config/generated/luci-milo.cfg
+++ b/infra/config/generated/luci-milo.cfg
@@ -5481,6 +5481,16 @@
     category: "cros|week3|kevin"
     short_name: "hwtests"
   >
+  builders: <
+    name: "buildbucket/luci.chromium.webrtc.fyi/WebRTC Chromium FYI ios-device"
+    category: "ios|week1a"
+    short_name: "dev"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.webrtc.fyi/WebRTC Chromium FYI ios-simulator"
+    category: "ios|week1a"
+    short_name: "sim"
+  >
   header: <
     oncalls: <
       name: "Chromium"
diff --git a/ios/build/bots/chromium.goma.fyi/ios-device-goma-rbe-canary-clobber.json b/ios/build/bots/chromium.goma.fyi/ios-device-goma-rbe-canary-clobber.json
index de71f33..f134315 100644
--- a/ios/build/bots/chromium.goma.fyi/ios-device-goma-rbe-canary-clobber.json
+++ b/ios/build/bots/chromium.goma.fyi/ios-device-goma-rbe-canary-clobber.json
@@ -7,6 +7,7 @@
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "ios_enable_code_signing=false",
+    "ios_use_goma_rbe=true",
     "is_component_build=false",
     "is_debug=false",
     "symbol_level=0",
diff --git a/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-device.json b/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-device.json
index 506f6e6..a62ad82f 100644
--- a/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-device.json
+++ b/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-device.json
@@ -7,6 +7,7 @@
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "ios_enable_code_signing=false",
+    "ios_use_goma_rbe=true",
     "is_component_build=false",
     "is_debug=false",
     "target_cpu=\"arm64\"",
diff --git a/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-simulator.json b/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-simulator.json
index bf77e72..311ed12 100644
--- a/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-simulator.json
+++ b/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-simulator.json
@@ -6,6 +6,7 @@
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "ios_enable_code_signing=false",
+    "ios_use_goma_rbe=true",
     "is_component_build=false",
     "is_debug=true",
     "symbol_level=1",
diff --git a/ios/chrome/app/application_delegate/user_activity_handler_unittest.mm b/ios/chrome/app/application_delegate/user_activity_handler_unittest.mm
index d8d5b684..61090c1 100644
--- a/ios/chrome/app/application_delegate/user_activity_handler_unittest.mm
+++ b/ios/chrome/app/application_delegate/user_activity_handler_unittest.mm
@@ -8,6 +8,7 @@
 
 #import <CoreSpotlight/CoreSpotlight.h>
 
+#include "base/memory/ptr_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/test/scoped_command_line.h"
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index 0ed0805..cac7cb3 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -125,7 +125,6 @@
 #import "ios/chrome/browser/ui/main/browser_view_wrangler.h"
 #import "ios/chrome/browser/ui/main/scene_controller_guts.h"
 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
-#include "ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.h"
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
@@ -319,11 +318,6 @@
 // The ChromeBrowserState associated with the main (non-OTR) browsing mode.
 @property(nonatomic, assign) ChromeBrowserState* mainBrowserState;  // Weak.
 
-// The main coordinator, lazily created the first time it is accessed. Manages
-// the main view controller. This property should not be accessed before the
-// browser has started up to the FOREGROUND stage.
-@property(nonatomic, readonly) TabGridCoordinator* mainCoordinator;
-
 // Returns whether the restore infobar should be displayed.
 - (bool)mustShowRestoreInfobar;
 // Returns the set of the sessions ids of the tabs in the given |tabModel|.
@@ -402,8 +396,6 @@
 @synthesize isColdStart = _isColdStart;
 @synthesize startupParameters = _startupParameters;
 @synthesize appLaunchTime = _appLaunchTime;
-// Defined in private interface
-@synthesize mainCoordinator = _mainCoordinator;
 @synthesize tabSwitcherIsActive;
 
 #pragma mark - Application lifecycle
@@ -665,24 +657,6 @@
   return self.sceneController.browserViewWrangler;
 }
 
-- (TabGridCoordinator*)mainCoordinator {
-  if (_browserInitializationStage == INITIALIZATION_STAGE_BASIC) {
-    NOTREACHED() << "mainCoordinator accessed too early in initialization.";
-    return nil;
-  }
-  if (!_mainCoordinator) {
-    // Lazily create the main coordinator.
-    TabGridCoordinator* tabGridCoordinator =
-        [[TabGridCoordinator alloc] initWithWindow:self.window
-                        applicationCommandEndpoint:self.sceneController
-                       browsingDataCommandEndpoint:self];
-    tabGridCoordinator.regularBrowser = self.mainBrowser;
-    tabGridCoordinator.incognitoBrowser = self.otrBrowser;
-    _mainCoordinator = tabGridCoordinator;
-  }
-  return _mainCoordinator;
-}
-
 - (BOOL)isFirstLaunchAfterUpgrade {
   return [[PreviousSessionInfo sharedInstance] isFirstSessionAfterUpgrade];
 }
@@ -718,15 +692,6 @@
 
   // Teardown UI state that is associated with scenes.
   [self.sceneController teardownUI];
-
-  [_mainCoordinator stop];
-  _mainCoordinator = nil;
-
-  // Invariant: The UI is stopped before the model is shutdown.
-  DCHECK(!_mainCoordinator);
-  [self.sceneController.browserViewWrangler shutdown];
-  self.sceneController.browserViewWrangler = nil;
-
   // End of per-window code.
 
   OmahaService::Stop();
diff --git a/ios/chrome/app/main_controller_guts.h b/ios/chrome/app/main_controller_guts.h
index 8ceca41..2eab0711 100644
--- a/ios/chrome/app/main_controller_guts.h
+++ b/ios/chrome/app/main_controller_guts.h
@@ -46,7 +46,6 @@
 - (BrowserViewController*)currentBVC;
 - (BrowserViewController*)mainBVC;
 - (BrowserViewController*)otrBVC;
-- (TabGridCoordinator*)mainCoordinator;
 - (id<BrowserInterfaceProvider>)interfaceProvider;
 - (UIWindow*)window;
 - (NSDictionary*)launchOptions;
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index b2da486..78d28a6 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1168,6 +1168,12 @@
       <message name="IDS_IOS_PAGE_INFO_SECURITY_BUTTON_ACCESSIBILITY_LABEL" desc="The accessibility text for the page security info button">
         Page Security Info
       </message>
+      <message name="IDS_IOS_PAGE_INFO_SITE_INFORMATION" desc="Title of the navigation controller to display when the page info is presented.">
+        Site information
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_SITE_SECURITY" desc="Title of the button opening the site security information (in page info)">
+        Site security
+      </message>
       <message name="IDS_IOS_PAGE_LOADED_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement when a page has loaded. [Length: unlimited] [iOS only]">
         Webpage loaded
       </message>
diff --git a/ios/chrome/browser/download/browser_download_service_unittest.mm b/ios/chrome/browser/download/browser_download_service_unittest.mm
index db22de8..a840904 100644
--- a/ios/chrome/browser/download/browser_download_service_unittest.mm
+++ b/ios/chrome/browser/download/browser_download_service_unittest.mm
@@ -7,6 +7,7 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
diff --git a/ios/chrome/browser/interstitials/BUILD.gn b/ios/chrome/browser/interstitials/BUILD.gn
index 2b7deb9..ff6ac09 100644
--- a/ios/chrome/browser/interstitials/BUILD.gn
+++ b/ios/chrome/browser/interstitials/BUILD.gn
@@ -5,6 +5,8 @@
 source_set("interstitials") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
+    "ios_blocking_page_tab_helper.h",
+    "ios_blocking_page_tab_helper.mm",
     "ios_chrome_controller_client.h",
     "ios_chrome_controller_client.mm",
     "ios_chrome_metrics_helper.h",
@@ -32,3 +34,15 @@
     "//url",
   ]
 }
+
+source_set("unit_tests") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  testonly = true
+  sources = [ "ios_blocking_page_tab_helper_unittest.mm" ]
+  deps = [
+    ":interstitials",
+    "//ios/chrome/browser/interstitials",
+    "//ios/web",
+    "//ios/web/public/test",
+  ]
+}
diff --git a/ios/chrome/browser/ssl/ios_ssl_error_tab_helper.h b/ios/chrome/browser/interstitials/ios_blocking_page_tab_helper.h
similarity index 78%
rename from ios/chrome/browser/ssl/ios_ssl_error_tab_helper.h
rename to ios/chrome/browser/interstitials/ios_blocking_page_tab_helper.h
index 404434f..ac1548b9 100644
--- a/ios/chrome/browser/ssl/ios_ssl_error_tab_helper.h
+++ b/ios/chrome/browser/interstitials/ios_blocking_page_tab_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 IOS_CHROME_BROWSER_SSL_IOS_SSL_ERROR_TAB_HELPER_H_
-#define IOS_CHROME_BROWSER_SSL_IOS_SSL_ERROR_TAB_HELPER_H_
+#ifndef IOS_CHROME_BROWSER_INTERSTITIALS_IOS_BLOCKING_PAGE_TAB_HELPER_H_
+#define IOS_CHROME_BROWSER_INTERSTITIALS_IOS_BLOCKING_PAGE_TAB_HELPER_H_
 
 #include "ios/chrome/browser/interstitials/ios_security_interstitial_page.h"
 #include "ios/web/public/web_state_observer.h"
@@ -17,13 +17,13 @@
 // interstitial code. Stores an IOSSecurityInterstitialPage while an SSL error
 // is currently being shown, then cleans it up when the user navigates away
 // from the SSL error.
-class IOSSSLErrorTabHelper
+class IOSBlockingPageTabHelper
     : public web::WebStateObserver,
-      public web::WebStateUserData<IOSSSLErrorTabHelper> {
+      public web::WebStateUserData<IOSBlockingPageTabHelper> {
  public:
-  ~IOSSSLErrorTabHelper() override;
+  ~IOSBlockingPageTabHelper() override;
 
-  // Associates |blocking_page| with an IOSSSLErrorTabHelper to manage the
+  // Associates |blocking_page| with an IOSBlockingPageTabHelper to manage the
   // |blocking_page|'s lifetime.
   static void AssociateBlockingPage(
       web::WebState* web_state,
@@ -38,10 +38,10 @@
  private:
   WEB_STATE_USER_DATA_KEY_DECL();
 
-  explicit IOSSSLErrorTabHelper(web::WebState* web_state);
-  DISALLOW_COPY_AND_ASSIGN(IOSSSLErrorTabHelper);
+  explicit IOSBlockingPageTabHelper(web::WebState* web_state);
+  DISALLOW_COPY_AND_ASSIGN(IOSBlockingPageTabHelper);
 
-  friend class web::WebStateUserData<IOSSSLErrorTabHelper>;
+  friend class web::WebStateUserData<IOSBlockingPageTabHelper>;
 
   void SetBlockingPage(
       int64_t navigation_id,
@@ -72,7 +72,7 @@
 
   // Subscription for JS messages.
   std::unique_ptr<web::WebState::ScriptCommandSubscription> subscription_;
-  base::WeakPtrFactory<IOSSSLErrorTabHelper> weak_factory_{this};
+  base::WeakPtrFactory<IOSBlockingPageTabHelper> weak_factory_{this};
 };
 
-#endif  // IOS_CHROME_BROWSER_SSL_IOS_SSL_ERROR_TAB_HELPER_H_
+#endif  // IOS_CHROME_BROWSER_INTERSTITIALS_IOS_BLOCKING_PAGE_TAB_HELPER_H_
diff --git a/ios/chrome/browser/ssl/ios_ssl_error_tab_helper.mm b/ios/chrome/browser/interstitials/ios_blocking_page_tab_helper.mm
similarity index 77%
rename from ios/chrome/browser/ssl/ios_ssl_error_tab_helper.mm
rename to ios/chrome/browser/interstitials/ios_blocking_page_tab_helper.mm
index d0c53f0..6c046bb 100644
--- a/ios/chrome/browser/ssl/ios_ssl_error_tab_helper.mm
+++ b/ios/chrome/browser/interstitials/ios_blocking_page_tab_helper.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ssl/ios_ssl_error_tab_helper.h"
+#import "ios/chrome/browser/interstitials/ios_blocking_page_tab_helper.h"
 
 #include "base/values.h"
 #include "ios/chrome/browser/interstitials/ios_security_interstitial_page.h"
@@ -19,27 +19,29 @@
 const char kCommandPrefix[] = "blockingPage";
 }  // namespace
 
-IOSSSLErrorTabHelper::IOSSSLErrorTabHelper(web::WebState* web_state)
+IOSBlockingPageTabHelper::IOSBlockingPageTabHelper(web::WebState* web_state)
     : web_state_(web_state), subscription_(nullptr), weak_factory_(this) {
   web_state_->AddObserver(this);
-  auto command_callback = base::Bind(
-      &IOSSSLErrorTabHelper::OnBlockingPageCommand, weak_factory_.GetWeakPtr());
+  auto command_callback =
+      base::Bind(&IOSBlockingPageTabHelper::OnBlockingPageCommand,
+                 weak_factory_.GetWeakPtr());
   subscription_ =
       web_state->AddScriptCommandCallback(command_callback, kCommandPrefix);
 }
 
-IOSSSLErrorTabHelper::~IOSSSLErrorTabHelper() = default;
+IOSBlockingPageTabHelper::~IOSBlockingPageTabHelper() = default;
 
 // static
-void IOSSSLErrorTabHelper::AssociateBlockingPage(
+void IOSBlockingPageTabHelper::AssociateBlockingPage(
     web::WebState* web_state,
     int64_t navigation_id,
     std::unique_ptr<IOSSecurityInterstitialPage> blocking_page) {
   // CreateForWebState() creates a tab helper if it doesn't exist for
   // |web_state| yet.
-  IOSSSLErrorTabHelper::CreateForWebState(web_state);
+  IOSBlockingPageTabHelper::CreateForWebState(web_state);
 
-  IOSSSLErrorTabHelper* helper = IOSSSLErrorTabHelper::FromWebState(web_state);
+  IOSBlockingPageTabHelper* helper =
+      IOSBlockingPageTabHelper::FromWebState(web_state);
   helper->SetBlockingPage(navigation_id, std::move(blocking_page));
 }
 
@@ -47,7 +49,7 @@
 // IOSSecurityInterstitialPage in a member variable so that it can handle
 // commands. Clean up the member variable when a subsequent navigation commits,
 // since the IOSSecurityInterstitialPage is no longer needed.
-void IOSSSLErrorTabHelper::DidFinishNavigation(
+void IOSBlockingPageTabHelper::DidFinishNavigation(
     web::WebState* web_state,
     web::NavigationContext* navigation_context) {
   DCHECK_EQ(web_state_, web_state);
@@ -74,19 +76,19 @@
   web_state_->DidChangeVisibleSecurityState();
 }
 
-void IOSSSLErrorTabHelper::WebStateDestroyed(web::WebState* web_state) {
+void IOSBlockingPageTabHelper::WebStateDestroyed(web::WebState* web_state) {
   DCHECK_EQ(web_state_, web_state);
   web_state_->RemoveObserver(this);
   web_state_ = nullptr;
 }
 
-void IOSSSLErrorTabHelper::SetBlockingPage(
+void IOSBlockingPageTabHelper::SetBlockingPage(
     int64_t navigation_id,
     std::unique_ptr<IOSSecurityInterstitialPage> blocking_page) {
   blocking_pages_for_navigations_[navigation_id] = std::move(blocking_page);
 }
 
-void IOSSSLErrorTabHelper::OnBlockingPageCommand(
+void IOSBlockingPageTabHelper::OnBlockingPageCommand(
     const base::DictionaryValue& message,
     const GURL& url,
     bool user_is_interacting,
@@ -102,4 +104,4 @@
   }
 }
 
-WEB_STATE_USER_DATA_KEY_IMPL(IOSSSLErrorTabHelper)
+WEB_STATE_USER_DATA_KEY_IMPL(IOSBlockingPageTabHelper)
diff --git a/ios/chrome/browser/ssl/ios_ssl_error_tab_helper_unittest.mm b/ios/chrome/browser/interstitials/ios_blocking_page_tab_helper_unittest.mm
similarity index 90%
rename from ios/chrome/browser/ssl/ios_ssl_error_tab_helper_unittest.mm
rename to ios/chrome/browser/interstitials/ios_blocking_page_tab_helper_unittest.mm
index 4474309..1722fa00 100644
--- a/ios/chrome/browser/ssl/ios_ssl_error_tab_helper_unittest.mm
+++ b/ios/chrome/browser/interstitials/ios_blocking_page_tab_helper_unittest.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ssl/ios_ssl_error_tab_helper.h"
+#import "ios/chrome/browser/interstitials/ios_blocking_page_tab_helper.h"
 
 #include "ios/chrome/browser/interstitials/ios_security_interstitial_page.h"
 #import "ios/web/public/test/fakes/fake_navigation_context.h"
@@ -42,11 +42,11 @@
   bool* destroyed_tracker_;
 };
 
-class IOSSSLErrorTabHelperTest : public web::WebTestWithWebState {
+class IOSBlockingPageTabHelperTest : public web::WebTestWithWebState {
  protected:
   void SetUp() override {
     web::WebTestWithWebState::SetUp();
-    IOSSSLErrorTabHelper::CreateForWebState(web_state());
+    IOSBlockingPageTabHelper::CreateForWebState(web_state());
   }
 
   std::unique_ptr<web::NavigationContext> CreateContext(bool committed,
@@ -59,12 +59,12 @@
   }
 
   // The lifetime of the blocking page is managed by the
-  // IOSSSLErrorTabHelper for the test's web_state.
+  // IOSBlockingPageTabHelper for the test's web_state.
   // |destroyed_tracker| will be set to true when the corresponding blocking
   // page is destroyed.
   void CreateAssociatedBlockingPage(web::NavigationContext* context,
                                     bool* destroyed_tracker) {
-    IOSSSLErrorTabHelper::AssociateBlockingPage(
+    IOSBlockingPageTabHelper::AssociateBlockingPage(
         web_state(), context->GetNavigationId(),
         std::make_unique<TestInterstitialPage>(web_state(), GURL(),
                                                destroyed_tracker));
@@ -73,14 +73,14 @@
 
 // Tests that the helper properly handles the lifetime of a single blocking
 // page, interleaved with other navigations.
-TEST_F(IOSSSLErrorTabHelperTest, SingleBlockingPage) {
+TEST_F(IOSBlockingPageTabHelperTest, SingleBlockingPage) {
   std::unique_ptr<web::NavigationContext> blocking_page_context =
       CreateContext(true, false);
   bool blocking_page_destroyed = false;
   CreateAssociatedBlockingPage(blocking_page_context.get(),
                                &blocking_page_destroyed);
-  IOSSSLErrorTabHelper* helper =
-      IOSSSLErrorTabHelper::FromWebState(web_state());
+  IOSBlockingPageTabHelper* helper =
+      IOSBlockingPageTabHelper::FromWebState(web_state());
 
   // Test that a same-document navigation doesn't destroy the blocking page if
   // its navigation hasn't committed yet.
@@ -110,7 +110,7 @@
 
 // Tests that the helper properly handles the lifetime of multiple blocking
 // pages, committed in a different order than they are created.
-TEST_F(IOSSSLErrorTabHelperTest, MultipleBlockingPage) {
+TEST_F(IOSBlockingPageTabHelperTest, MultipleBlockingPage) {
   // Simulate associating the first interstitial.
   std::unique_ptr<web::NavigationContext> context1 = CreateContext(true, false);
   bool blocking_page1_destroyed = false;
@@ -118,8 +118,8 @@
 
   // We can directly retrieve the helper for testing once
   // CreateAssociatedBlockingPage() was called.
-  IOSSSLErrorTabHelper* helper =
-      IOSSSLErrorTabHelper::FromWebState(web_state());
+  IOSBlockingPageTabHelper* helper =
+      IOSBlockingPageTabHelper::FromWebState(web_state());
 
   // Simulate commiting the first interstitial.
   helper->DidFinishNavigation(web_state(), context1.get());
@@ -162,14 +162,14 @@
 
 // Tests that the helper properly handles a navigation that finishes without
 // committing.
-TEST_F(IOSSSLErrorTabHelperTest, NavigationDoesNotCommit) {
+TEST_F(IOSBlockingPageTabHelperTest, NavigationDoesNotCommit) {
   std::unique_ptr<web::NavigationContext> committed_context =
       CreateContext(true, false);
   bool committed_blocking_page_destroyed = false;
   CreateAssociatedBlockingPage(committed_context.get(),
                                &committed_blocking_page_destroyed);
-  IOSSSLErrorTabHelper* helper =
-      IOSSSLErrorTabHelper::FromWebState(web_state());
+  IOSBlockingPageTabHelper* helper =
+      IOSBlockingPageTabHelper::FromWebState(web_state());
   helper->DidFinishNavigation(web_state(), committed_context.get());
   EXPECT_FALSE(committed_blocking_page_destroyed);
 
diff --git a/ios/chrome/browser/open_in/open_in_tab_helper.mm b/ios/chrome/browser/open_in/open_in_tab_helper.mm
index 57bce11..cc39773 100644
--- a/ios/chrome/browser/open_in/open_in_tab_helper.mm
+++ b/ios/chrome/browser/open_in/open_in_tab_helper.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/open_in/open_in_tab_helper.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/web/public/navigation/navigation_context.h"
diff --git a/ios/chrome/browser/overlays/overlay_presenter_impl.mm b/ios/chrome/browser/overlays/overlay_presenter_impl.mm
index 1a9fc24..29555fb 100644
--- a/ios/chrome/browser/overlays/overlay_presenter_impl.mm
+++ b/ios/chrome/browser/overlays/overlay_presenter_impl.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/overlays/overlay_presenter_impl.h"
 
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #import "ios/chrome/browser/main/browser.h"
 #import "ios/chrome/browser/overlays/public/overlay_presentation_context.h"
 #import "ios/chrome/browser/overlays/public/overlay_presenter_observer.h"
diff --git a/ios/chrome/browser/sessions/session_restoration_browser_agent.mm b/ios/chrome/browser/sessions/session_restoration_browser_agent.mm
index cdba571b..37b5bd47 100644
--- a/ios/chrome/browser/sessions/session_restoration_browser_agent.mm
+++ b/ios/chrome/browser/sessions/session_restoration_browser_agent.mm
@@ -4,6 +4,7 @@
 
 #include "ios/chrome/browser/sessions/session_restoration_browser_agent.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "components/favicon/ios/web_favicon_driver.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
diff --git a/ios/chrome/browser/ssl/BUILD.gn b/ios/chrome/browser/ssl/BUILD.gn
index 29ec842..3b316501 100644
--- a/ios/chrome/browser/ssl/BUILD.gn
+++ b/ios/chrome/browser/ssl/BUILD.gn
@@ -17,8 +17,6 @@
     "ios_ssl_blocking_page.mm",
     "ios_ssl_error_handler.h",
     "ios_ssl_error_handler.mm",
-    "ios_ssl_error_tab_helper.h",
-    "ios_ssl_error_tab_helper.mm",
   ]
   deps = [
     ":feature_flags",
@@ -62,7 +60,6 @@
   sources = [
     "ios_captive_portal_blocking_page_unittest.mm",
     "ios_ssl_error_handler_unittest.mm",
-    "ios_ssl_error_tab_helper_unittest.mm",
   ]
   deps = [
     ":feature_flags",
@@ -70,7 +67,6 @@
     "//base/test:test_support",
     "//components/security_state/core",
     "//ios/chrome/browser/browser_state:test_support",
-    "//ios/chrome/browser/interstitials",
     "//ios/chrome/browser/web:test_support",
     "//ios/web",
     "//ios/web/public/security",
diff --git a/ios/chrome/browser/ssl/ios_ssl_error_handler.mm b/ios/chrome/browser/ssl/ios_ssl_error_handler.mm
index 6cae8d0..a8d6c8cb 100644
--- a/ios/chrome/browser/ssl/ios_ssl_error_handler.mm
+++ b/ios/chrome/browser/ssl/ios_ssl_error_handler.mm
@@ -7,17 +7,18 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/sys_string_conversions.h"
 #include "components/captive_portal/core/captive_portal_detector.h"
 #include "components/security_interstitials/core/ssl_error_options_mask.h"
 #include "components/security_interstitials/core/ssl_error_ui.h"
+#import "ios/chrome/browser/interstitials/ios_blocking_page_tab_helper.h"
 #include "ios/chrome/browser/ssl/captive_portal_detector_tab_helper.h"
 #include "ios/chrome/browser/ssl/captive_portal_features.h"
 #include "ios/chrome/browser/ssl/captive_portal_metrics.h"
 #include "ios/chrome/browser/ssl/ios_captive_portal_blocking_page.h"
 #include "ios/chrome/browser/ssl/ios_ssl_blocking_page.h"
-#import "ios/chrome/browser/ssl/ios_ssl_error_tab_helper.h"
 #include "ios/web/public/browser_state.h"
 #import "ios/web/public/web_state.h"
 #include "net/ssl/ssl_info.h"
@@ -137,8 +138,8 @@
         web_state_, cert_error_, ssl_info_, request_url_, options_mask,
         base::Time::NowFromSystemTime(), std::move(callback_));
     std::string error_html = page->GetHtmlContents();
-    IOSSSLErrorTabHelper::AssociateBlockingPage(web_state_, navigation_id_,
-                                                std::move(page));
+    IOSBlockingPageTabHelper::AssociateBlockingPage(web_state_, navigation_id_,
+                                                    std::move(page));
     std::move(blocking_page_callback_).Run(base::SysUTF8ToNSString(error_html));
   } else {
     // SSLBlockingPage deletes itself when it's dismissed.
@@ -158,8 +159,8 @@
     auto page = std::make_unique<IOSCaptivePortalBlockingPage>(
         web_state_, request_url_, landing_url, std::move(callback_));
     std::string error_html = page->GetHtmlContents();
-    IOSSSLErrorTabHelper::AssociateBlockingPage(web_state_, navigation_id_,
-                                                std::move(page));
+    IOSBlockingPageTabHelper::AssociateBlockingPage(web_state_, navigation_id_,
+                                                    std::move(page));
     std::move(blocking_page_callback_).Run(base::SysUTF8ToNSString(error_html));
   } else {
     // IOSCaptivePortalBlockingPage deletes itself when it's dismissed.
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
index f981f93..95c1029 100644
--- a/ios/chrome/browser/sync/ios_chrome_sync_client.mm
+++ b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
@@ -231,18 +231,6 @@
       return history ? history->GetDeleteDirectivesSyncableService()
                      : base::WeakPtr<syncer::SyncableService>();
     }
-    case syncer::FAVICON_IMAGES:
-    case syncer::FAVICON_TRACKING: {
-      if (!base::FeatureList::IsEnabled(switches::kDoNotSyncFaviconDataTypes)) {
-        sync_sessions::FaviconCache* favicons =
-            SessionSyncServiceFactory::GetForBrowserState(browser_state_)
-                ->GetFaviconCache();
-        return favicons ? favicons->AsWeakPtr()
-                        : base::WeakPtr<syncer::SyncableService>();
-      }
-      NOTREACHED();
-      return nullptr;
-    }
     case syncer::PASSWORDS: {
       return password_store_ ? password_store_->GetPasswordSyncableService()
                              : base::WeakPtr<syncer::SyncableService>();
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn
index a3fd4159..0039048 100644
--- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn
@@ -26,7 +26,6 @@
     "//ios/chrome/browser/sync",
     "//ios/chrome/browser/ui/alert_coordinator",
     "//ios/chrome/browser/ui/authentication/signin:signin_protected",
-    "//ios/chrome/browser/ui/settings:settings_controller_protocol",
     "//ios/chrome/browser/ui/settings/google_services:constants",
     "//ios/web/public",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_navigation_controller.mm b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_navigation_controller.mm
index a3e5524..628d1d83 100644
--- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_navigation_controller.mm
+++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_navigation_controller.mm
@@ -5,7 +5,6 @@
 #import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_navigation_controller.h"
 
 #import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_constants.h"
-#import "ios/chrome/browser/ui/settings/settings_controller_protocol.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ui/base/l10n/l10n_util_mac.h"
 
@@ -19,17 +18,6 @@
 
 #pragma mark - UINavigationController
 
-// Calls |viewControllerWasPopped| for the popped view controller.
-- (UIViewController*)popViewControllerAnimated:(BOOL)animated {
-  UIViewController* poppedViewController =
-      [super popViewControllerAnimated:animated];
-  if ([poppedViewController
-          respondsToSelector:@selector(viewControllerWasPopped)]) {
-    [poppedViewController performSelector:@selector(viewControllerWasPopped)];
-  }
-  return poppedViewController;
-}
-
 - (void)pushViewController:(UIViewController*)viewController
                   animated:(BOOL)animated {
   [super pushViewController:viewController animated:animated];
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm
index 10b783d..3c83dadc 100644
--- a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm
+++ b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm
@@ -23,7 +23,8 @@
 #import "ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_view.h"
 #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
 #import "ios/chrome/browser/ui/util/keyboard_observer_helper.h"
-#include "ios/chrome/browser/ui/util/ui_util.h"
+#import "ios/chrome/browser/ui/util/ui_util.h"
+#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/web/common/url_scheme_util.h"
 #import "ios/web/public/deprecated/crw_js_injection_receiver.h"
@@ -52,8 +53,8 @@
 // The object that manages the currently-shown custom accessory view.
 @property(nonatomic, weak) id<FormInputSuggestionsProvider> currentProvider;
 
-// YES if the first responder is a text input other than the web view.
-@property(nonatomic, assign) BOOL editingUIKitTextInput;
+// YES if the first responder is valid.
+@property(nonatomic, assign) BOOL firstResponderIsValid;
 
 // The form input handler. This is in charge of form navigation.
 @property(nonatomic, strong)
@@ -246,6 +247,10 @@
 }
 
 - (void)keyboardWillChangeToState:(KeyboardState)keyboardState {
+  if (keyboardState.isVisible) {
+    [self verifyFirstResponderAndUpdateCustomKeyboardView];
+  }
+
   [self updateSuggestionsIfNeeded];
   [self.consumer keyboardWillChangeToState:keyboardState];
   if (!keyboardState.isVisible) {
@@ -407,8 +412,8 @@
     return;
   }
 
-  // Return early if the current text input is not the web view.
-  if (self.editingUIKitTextInput) {
+  // Return early if the current input is not valid.
+  if (!self.firstResponderIsValid) {
     return;
   }
 
@@ -516,21 +521,47 @@
   [self.delegate mediatorDidDetectMovingToBackground:self];
 }
 
+// Verifies that the first responder is a child of WKWebView and that is is not
+// a child of SSOSignInViewController. Pause or try to continue the keyboard
+// custom view depending on the validity of the first responder.
+- (void)verifyFirstResponderAndUpdateCustomKeyboardView {
+  UIResponder* firstResponder = GetFirstResponder();
+  BOOL ancestorIsSSOSignInViewController = NO;
+  BOOL ancestorIsWkWebView = NO;
+  while (firstResponder) {
+    if ([firstResponder isKindOfClass:NSClassFromString(@"WKWebView")]) {
+      ancestorIsWkWebView = YES;
+    }
+    if ([firstResponder
+            isKindOfClass:NSClassFromString(@"SSOSignInViewController")]) {
+      ancestorIsSSOSignInViewController = YES;
+      break;
+    }
+    firstResponder = firstResponder.nextResponder;
+  }
+  self.firstResponderIsValid =
+      ancestorIsWkWebView && !ancestorIsSSOSignInViewController;
+  if (self.firstResponderIsValid) {
+    [self continueCustomKeyboardView];
+  } else {
+    [self pauseCustomKeyboardView];
+  }
+}
+
 #pragma mark - Keyboard Notifications
 
 // When any text field or text view (e.g. omnibox, settings search bar)
 // begins editing, pause the consumer so it doesn't present the custom view over
 // the keyboard.
 - (void)handleTextInputDidBeginEditing:(NSNotification*)notification {
-  self.editingUIKitTextInput = YES;
+  self.firstResponderIsValid = NO;
   [self pauseCustomKeyboardView];
 }
 
 // When any text field or text view (e.g. omnibox, settings, card unmask dialog)
 // ends editing, continue presenting.
 - (void)handleTextInputDidEndEditing:(NSNotification*)notification {
-  self.editingUIKitTextInput = NO;
-  [self continueCustomKeyboardView];
+  [self verifyFirstResponderAndUpdateCustomKeyboardView];
 }
 
 #pragma mark - PasswordFetcherDelegate
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index 2527059..b961977 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -3911,13 +3911,7 @@
   [[OmniboxGeolocationController sharedInstance]
       locationBarDidBecomeFirstResponder:self.browserState];
 
-  // On the non-incognito NTP, the primaryToolbarCoordinator focuses the
-  // location bar itself when focusing the fakebox (while animating the
-  // fakebox). On all other pages, the fakebox is focused here after the
-  // location bar becomes first responder.
-  if (!IsVisibleURLNewTabPage(self.currentWebState) || self.isOffTheRecord) {
-    [self.primaryToolbarCoordinator transitionToLocationBarFocusedState:YES];
-  }
+  [self.primaryToolbarCoordinator transitionToLocationBarFocusedState:YES];
 }
 
 - (void)locationBarDidResignFirstResponder {
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
index 1603476..91c8406 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
@@ -450,19 +450,12 @@
   if (self.disableScrollAnimation)
     return;
 
-  // Focus the location bar if the omnibox is not already focused.
-  if (!self.omniboxFocused) {
-    // Only animated the location bar focus if the header is scrolled to the
-    // top.
-    BOOL animated = [self.delegate isScrolledToTop];
-    [self.dispatcher focusLocationBarWithAnimation:animated];
-  }
-
   void (^animations)() = nil;
   if (![self.delegate isScrolledToTop]) {
     // Only trigger the fake omnibox animation if the header isn't scrolled to
     // the top. Otherwise just rely on the normal animation.
     self.disableScrollAnimation = YES;
+    [self.dispatcher focusOmniboxNoAnimation];
     NamedGuide* omniboxGuide = [NamedGuide guideWithName:kOmniboxGuide
                                                     view:self.headerView];
     // Layout the owning view to make sure that the constrains are applied.
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.mm
index 2d45797..087dc80 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/supports_user_data.h"
 #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
diff --git a/ios/chrome/browser/ui/main/scene_controller.mm b/ios/chrome/browser/ui/main/scene_controller.mm
index 9e52c71..59bf473 100644
--- a/ios/chrome/browser/ui/main/scene_controller.mm
+++ b/ios/chrome/browser/ui/main/scene_controller.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/ui/main/scene_controller.h"
 
+#include "base/bind_helpers.h"
 #import "base/logging.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
@@ -164,6 +165,11 @@
 // in a modal dialog.
 @property(nonatomic, assign) BOOL presentingFirstRunUI;
 
+// The main coordinator, lazily created the first time it is accessed. Manages
+// the main view controller. This property should not be accessed before the
+// browser has started up to the FOREGROUND stage.
+@property(nonatomic, strong) TabGridCoordinator* mainCoordinator;
+
 @end
 
 @implementation SceneController
@@ -195,6 +201,20 @@
 
 #pragma mark - Setters and getters
 
+- (TabGridCoordinator*)mainCoordinator {
+  if (!_mainCoordinator) {
+    // Lazily create the main coordinator.
+    TabGridCoordinator* tabGridCoordinator =
+        [[TabGridCoordinator alloc] initWithWindow:self.sceneState.window
+                        applicationCommandEndpoint:self
+                       browsingDataCommandEndpoint:self.mainController];
+    tabGridCoordinator.regularBrowser = self.mainInterface.browser;
+    tabGridCoordinator.incognitoBrowser = self.incognitoInterface.browser;
+    _mainCoordinator = tabGridCoordinator;
+  }
+  return _mainCoordinator;
+}
+
 - (id<BrowserInterface>)mainInterface {
   return self.mainController.interfaceProvider.mainInterface;
 }
@@ -311,9 +331,9 @@
   [self.mainController.window makeKeyAndVisible];
 
   // Lazy init of mainCoordinator.
-  [self.mainController.mainCoordinator start];
+  [self.mainCoordinator start];
 
-  _tabSwitcher = self.mainController.mainCoordinator.tabSwitcher;
+  _tabSwitcher = self.mainCoordinator.tabSwitcher;
   // Call -restoreInternalState so that the grid shows the correct panel.
   [_tabSwitcher
       restoreInternalStateWithMainBrowser:self.mainInterface.browser
@@ -371,6 +391,12 @@
   [self.historyCoordinator stop];
   self.historyCoordinator = nil;
 
+  [_mainCoordinator stop];
+  _mainCoordinator = nil;
+
+  [self.browserViewWrangler shutdown];
+  self.browserViewWrangler = nil;
+
   self.hasInitializedUI = NO;
 }
 
@@ -524,8 +550,7 @@
                                     snapshotResult);
         });
   }
-  [self.mainController.mainCoordinator
-      prepareToShowTabSwitcher:self.tabSwitcher];
+  [self.mainCoordinator prepareToShowTabSwitcher:self.tabSwitcher];
 }
 
 - (void)displayTabSwitcher {
@@ -688,7 +713,7 @@
   DCHECK(!self.signinInteractionCoordinator.isSettingsViewPresented);
   if (!baseViewController) {
     DCHECK_EQ(self.mainController.currentBVC,
-              self.mainController.mainCoordinator.activeViewController);
+              self.mainCoordinator.activeViewController);
     baseViewController = self.mainController.currentBVC;
   }
 
@@ -717,7 +742,7 @@
   DCHECK(!self.signinInteractionCoordinator.isSettingsViewPresented);
   if (!baseViewController) {
     DCHECK_EQ(self.mainController.currentBVC,
-              self.mainController.mainCoordinator.activeViewController);
+              self.mainCoordinator.activeViewController);
     baseViewController = self.mainController.currentBVC;
   }
 
@@ -851,8 +876,7 @@
 }
 
 - (UIImage*)currentPageScreenshot {
-  UIView* lastView =
-      self.mainController.mainCoordinator.activeViewController.view;
+  UIView* lastView = self.mainCoordinator.activeViewController.view;
   DCHECK(lastView);
   CGFloat scale = 0.0;
   // For screenshots of the tab switcher we need to use a scale of 1.0 to avoid
@@ -944,7 +968,7 @@
   // The tab switcher dismissal animation runs
   // as part of the BVC presentation process.  The BVC is presented before the
   // animations begin, so it should be the current active VC at this point.
-  DCHECK_EQ(self.mainController.mainCoordinator.activeViewController,
+  DCHECK_EQ(self.mainCoordinator.activeViewController,
             self.mainController.currentBVC);
 
   if (self.modeToDisplayOnTabSwitcherDismissal ==
@@ -1160,9 +1184,8 @@
     [self.signinInteractionCoordinator cancelAndDismiss];
     // History coordinator can be started on top of the tab grid. This is not
     // true of the other tab switchers.
-    DCHECK(self.mainController.mainCoordinator);
-    [self.mainController.mainCoordinator
-        stopChildCoordinatorsWithCompletion:completion];
+    DCHECK(self.mainCoordinator);
+    [self.mainCoordinator stopChildCoordinatorsWithCompletion:completion];
   };
 
   // As a top level rule, if the settings are showing, they need to be
@@ -1399,9 +1422,8 @@
       [weakCurrentBVC.dispatcher focusOmnibox];
     };
   }
-  [self.mainController.mainCoordinator
-      showTabViewController:self.currentInterface.bvc
-                 completion:completion];
+  [self.mainCoordinator showTabViewController:self.currentInterface.bvc
+                                   completion:completion];
   [self.currentInterface.bvc.dispatcher
       setIncognitoContentVisible:(self.currentInterface ==
                                   self.incognitoInterface)];
@@ -1455,7 +1477,7 @@
   // TODO(crbug.com/754642): Implement TopPresentedViewControllerFrom()
   // privately.
   return top_view_controller::TopPresentedViewControllerFrom(
-      self.mainController.mainCoordinator.viewController);
+      self.mainCoordinator.viewController);
 }
 
 #pragma mark - WebStateListObserving
@@ -1569,7 +1591,7 @@
   self.mainController.tabSwitcherIsActive = YES;
   [self.tabSwitcher setDelegate:self];
 
-  [self.mainController.mainCoordinator showTabSwitcher:self.tabSwitcher];
+  [self.mainCoordinator showTabSwitcher:self.tabSwitcher];
 }
 
 // Destroys and rebuilds the incognito browser state.
diff --git a/ios/chrome/browser/ui/overlays/overlay_presentation_context_impl.mm b/ios/chrome/browser/ui/overlays/overlay_presentation_context_impl.mm
index d2753ca..7af1b67 100644
--- a/ios/chrome/browser/ui/overlays/overlay_presentation_context_impl.mm
+++ b/ios/chrome/browser/ui/overlays/overlay_presentation_context_impl.mm
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/memory/ptr_util.h"
 #import "ios/chrome/browser/main/browser.h"
 #import "ios/chrome/browser/overlays/public/overlay_presentation_context_observer.h"
 #import "ios/chrome/browser/overlays/public/overlay_presenter.h"
diff --git a/ios/chrome/browser/ui/page_info/BUILD.gn b/ios/chrome/browser/ui/page_info/BUILD.gn
index 0e389d8..a9164d13 100644
--- a/ios/chrome/browser/ui/page_info/BUILD.gn
+++ b/ios/chrome/browser/ui/page_info/BUILD.gn
@@ -9,6 +9,12 @@
     "legacy_page_info_view_controller.mm",
     "page_info_config.h",
     "page_info_config.mm",
+    "page_info_consumer.h",
+    "page_info_description.h",
+    "page_info_description.mm",
+    "page_info_navigation_commands.h",
+    "page_info_site_security_view_controller.h",
+    "page_info_site_security_view_controller.mm",
     "page_info_view_controller.h",
     "page_info_view_controller.mm",
   ]
@@ -27,6 +33,7 @@
     "//ios/chrome/browser/ui/fancy_ui",
     "//ios/chrome/browser/ui/page_info/requirements",
     "//ios/chrome/browser/ui/popup_menu",
+    "//ios/chrome/browser/ui/table_view",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
     "//ios/chrome/common/ui/colors",
@@ -66,6 +73,8 @@
     "page_info_coordinator.mm",
     "page_info_legacy_coordinator.h",
     "page_info_legacy_coordinator.mm",
+    "page_info_mediator.h",
+    "page_info_mediator.mm",
   ]
   deps = [
     ":page_info",
diff --git a/ios/chrome/browser/ui/page_info/page_info_consumer.h b/ios/chrome/browser/ui/page_info/page_info_consumer.h
new file mode 100644
index 0000000..a299867
--- /dev/null
+++ b/ios/chrome/browser/ui/page_info/page_info_consumer.h
@@ -0,0 +1,18 @@
+// Copyright 2020 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 IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_CONSUMER_H_
+#define IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_CONSUMER_H_
+
+#import "ios/chrome/browser/ui/page_info/page_info_description.h"
+
+// A consumer for page info changes.
+@protocol PageInfoConsumer
+
+// Called when the page info has changed.
+- (void)pageInfoChanged:(PageInfoDescription*)pageInfoDescription;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/page_info/page_info_coordinator.mm b/ios/chrome/browser/ui/page_info/page_info_coordinator.mm
index 1e5c7c1..64609b6 100644
--- a/ios/chrome/browser/ui/page_info/page_info_coordinator.mm
+++ b/ios/chrome/browser/ui/page_info/page_info_coordinator.mm
@@ -7,28 +7,74 @@
 #include "base/logging.h"
 #include "ios/chrome/browser/main/browser.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
+#import "ios/chrome/browser/ui/page_info/page_info_mediator.h"
+#import "ios/chrome/browser/ui/page_info/page_info_navigation_commands.h"
+#import "ios/chrome/browser/ui/page_info/page_info_site_security_view_controller.h"
 #import "ios/chrome/browser/ui/page_info/page_info_view_controller.h"
+#import "ios/chrome/browser/web_state_list/web_state_list.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
-@interface PageInfoCoordinator ()
+@interface PageInfoCoordinator () <PageInfoNavigationCommands>
+
+@property(nonatomic, strong) CommandDispatcher* dispatcher;
+@property(nonatomic, strong) PageInfoViewController* viewController;
+@property(nonatomic, strong) PageInfoMediator* mediator;
+@property(nonatomic, strong) UINavigationController* navigationController;
 
 @end
 
 @implementation PageInfoCoordinator
 
 @synthesize presentationProvider = _presentationProvider;
+@synthesize navigationController = _navigationController;
 
 #pragma mark - ChromeCoordinator
 
 - (void)start {
-  // TODO(crbug.com/1038919): Implement this.
+  self.dispatcher = self.browser->GetCommandDispatcher();
+  [self.dispatcher
+      startDispatchingToTarget:self
+                   forProtocol:@protocol(PageInfoNavigationCommands)];
+
+  self.viewController =
+      [[PageInfoViewController alloc] initWithStyle:UITableViewStylePlain];
+  self.viewController.handler =
+      HandlerForProtocol(self.dispatcher, PageInfoNavigationCommands);
+
+  web::WebState* webState =
+      self.browser->GetWebStateList()->GetActiveWebState();
+  self.mediator = [[PageInfoMediator alloc] initWithWebState:webState];
+  self.mediator.consumer = self.viewController;
+
+  self.navigationController = [[UINavigationController alloc]
+      initWithRootViewController:self.viewController];
+
+  [self.baseViewController presentViewController:self.navigationController
+                                        animated:YES
+                                      completion:nil];
 }
 
 - (void)stop {
-  // TODO(crbug.com/1038919): Implement this.
+  [self.dispatcher stopDispatchingToTarget:self];
+  [self.baseViewController.presentingViewController
+      dismissViewControllerAnimated:YES
+                         completion:nil];
+  self.dispatcher = nil;
+  self.navigationController = nil;
+  self.mediator.consumer = nil;
+  self.mediator = nil;
+  self.viewController = nil;
+}
+
+#pragma mark - PageInfoNavigationCommands
+
+- (void)showSiteSecurityInfo {
+  PageInfoSiteSecurityViewController* viewController =
+      [[PageInfoSiteSecurityViewController alloc] init];
+  [self.navigationController pushViewController:viewController animated:YES];
 }
 
 @end
diff --git a/ios/chrome/browser/ui/page_info/page_info_description.h b/ios/chrome/browser/ui/page_info/page_info_description.h
new file mode 100644
index 0000000..0d6b1d51
--- /dev/null
+++ b/ios/chrome/browser/ui/page_info/page_info_description.h
@@ -0,0 +1,36 @@
+// Copyright 2020 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 IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_DESCRIPTION_H_
+#define IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_DESCRIPTION_H_
+
+#import <UIKit/UIKit.h>
+
+class GURL;
+
+namespace web {
+struct SSLStatus;
+}
+
+// Create and store all the data to be displayed inside the root of the page
+// info.
+@interface PageInfoDescription : NSObject
+
+// Init based on the |URL|, the SSL |status| and if the current page is an
+// |offlinePage|.
+- (instancetype)initWithURL:(const GURL&)URL
+                  SSLStatus:(const web::SSLStatus&)status
+              isPageOffline:(BOOL)isOffline NS_DESIGNATED_INITIALIZER;
+- (instancetype)init NS_UNAVAILABLE;
+
+// Describes the security status of this page, i.e. "Page is secure" or "SSL
+// cert expired".
+@property(nonatomic, readonly) NSString* pageSecurityStatusDescription;
+
+// The icon name for the page security status, e.g. a lock.
+@property(nonatomic, readonly) NSString* pageSecurityStatusIconImageName;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_DESCRIPTION_H_
diff --git a/ios/chrome/browser/ui/page_info/page_info_description.mm b/ios/chrome/browser/ui/page_info/page_info_description.mm
new file mode 100644
index 0000000..36d924b
--- /dev/null
+++ b/ios/chrome/browser/ui/page_info/page_info_description.mm
@@ -0,0 +1,110 @@
+// Copyright 2020 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.
+
+#import "ios/chrome/browser/ui/page_info/page_info_description.h"
+
+#include "base/strings/sys_string_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "components/security_state/core/security_state.h"
+#include "components/strings/grit/components_chromium_strings.h"
+#include "components/strings/grit/components_google_chrome_strings.h"
+#include "components/strings/grit/components_strings.h"
+#include "ios/chrome/browser/chrome_url_constants.h"
+#include "ios/chrome/grit/ios_strings.h"
+#include "ios/web/public/security/ssl_status.h"
+#include "ui/base/l10n/l10n_util.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface PageInfoDescription ()
+
+@property(nonatomic, assign) web::SSLStatus status;
+@property(nonatomic, assign) const GURL& URL;
+@property(nonatomic, assign) BOOL isOffline;
+
+@end
+
+@implementation PageInfoDescription {
+  GURL _URL;
+}
+
+- (instancetype)initWithURL:(const GURL&)URL
+                  SSLStatus:(const web::SSLStatus&)status
+              isPageOffline:(BOOL)isOffline {
+  self = [super init];
+  if (self) {
+    _URL = URL;
+    _status = status;
+    _isOffline = isOffline;
+  }
+  return self;
+}
+
+- (NSString*)pageSecurityStatusDescription {
+  if (self.isOffline) {
+    return l10n_util::GetNSString(IDS_IOS_PAGE_INFO_OFFLINE_PAGE);
+  }
+
+  if (self.URL.SchemeIs(kChromeUIScheme)) {
+    return l10n_util::GetNSString(IDS_PAGE_INFO_INTERNAL_PAGE);
+  }
+
+  if (!self.status.certificate) {
+    return l10n_util::GetNSString(IDS_PAGE_INFO_NOT_SECURE_SUMMARY);
+  }
+
+  if (net::IsCertStatusError((self.status.cert_status)) ||
+      (self.status.security_style ==
+       web::SECURITY_STYLE_AUTHENTICATION_BROKEN)) {
+    // HTTPS with major errors
+    return l10n_util::GetNSString(IDS_PAGE_INFO_NOT_SECURE_SUMMARY);
+  }
+
+  if (self.status.content_status ==
+      web::SSLStatus::DISPLAYED_INSECURE_CONTENT) {
+    return l10n_util::GetNSString(IDS_PAGE_INFO_NOT_SECURE_SUMMARY);
+  }
+
+  // Valid HTTPS
+  return l10n_util::GetNSString(IDS_PAGE_INFO_SECURE_SUMMARY);
+}
+
+- (NSString*)pageSecurityStatusIconImageName {
+  if (self.isOffline)
+    return @"page_info_offline";
+
+  if (!self.status.certificate) {
+    if (security_state::ShouldShowDangerTriangleForWarningLevel())
+      return @"page_info_bad";
+
+    return @"page_info_info";
+  }
+
+  if (net::IsCertStatusError(self.status.cert_status) ||
+      self.status.security_style == web::SECURITY_STYLE_AUTHENTICATION_BROKEN)
+    // HTTPS with major errors
+    return @"page_info_bad";
+
+  // The remaining states are valid HTTPS, or HTTPS with minor errors.
+  if (self.status.content_status ==
+      web::SSLStatus::DISPLAYED_INSECURE_CONTENT) {
+    if (security_state::ShouldShowDangerTriangleForWarningLevel())
+      return @"page_info_bad";
+
+    return @"page_info";
+  }
+
+  // Valid HTTPS
+  return @"page_info_good";
+}
+
+#pragma mark - Properties
+
+- (const GURL&)URL {
+  return _URL;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/page_info/page_info_mediator.h b/ios/chrome/browser/ui/page_info/page_info_mediator.h
new file mode 100644
index 0000000..4d123de4
--- /dev/null
+++ b/ios/chrome/browser/ui/page_info/page_info_mediator.h
@@ -0,0 +1,29 @@
+// Copyright 2020 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 IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_MEDIATOR_H_
+#define IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_MEDIATOR_H_
+
+#import <Foundation/Foundation.h>
+
+#include "ios/chrome/browser/main/browser.h"
+#import "ios/web/public/web_state_observer_bridge.h"
+
+@protocol PageInfoConsumer;
+
+// The mediator is pushing the data for the root of the info page page to the
+// consumer.
+@interface PageInfoMediator : NSObject
+
+- (instancetype)initWithWebState:(web::WebState*)webState
+    NS_DESIGNATED_INITIALIZER;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+// The consumer for this mediator.
+@property(nonatomic, weak) id<PageInfoConsumer> consumer;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/page_info/page_info_mediator.mm b/ios/chrome/browser/ui/page_info/page_info_mediator.mm
new file mode 100644
index 0000000..d5fdd656
--- /dev/null
+++ b/ios/chrome/browser/ui/page_info/page_info_mediator.mm
@@ -0,0 +1,57 @@
+// Copyright 2020 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.
+
+#import "ios/chrome/browser/ui/page_info/page_info_mediator.h"
+
+#include "ios/chrome/browser/main/browser.h"
+#import "ios/chrome/browser/reading_list/offline_page_tab_helper.h"
+#import "ios/chrome/browser/ui/page_info/page_info_consumer.h"
+#import "ios/chrome/browser/ui/page_info/page_info_description.h"
+#import "ios/chrome/browser/web_state_list/web_state_list.h"
+#include "ios/web/public/navigation/navigation_item.h"
+#include "ios/web/public/navigation/navigation_manager.h"
+#import "ios/web/public/web_state.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface PageInfoMediator ()
+@property(nonatomic, assign) web::WebState* webState;
+@property(nonatomic, assign) web::NavigationItem* navigationItem;
+@end
+
+@implementation PageInfoMediator
+
+- (instancetype)initWithWebState:(web::WebState*)webState {
+  self = [super init];
+  if (self) {
+    _webState = webState;
+    _navigationItem = _webState->GetNavigationManager()->GetVisibleItem();
+  }
+  return self;
+}
+
+- (void)setConsumer:(id<PageInfoConsumer>)consumer {
+  if (_consumer == consumer)
+    return;
+
+  _consumer = consumer;
+  [self updateConsumer];
+}
+
+#pragma mark - Private
+
+- (void)updateConsumer {
+  const BOOL presentingOfflinePage =
+      OfflinePageTabHelper::FromWebState(_webState)->presenting_offline_page();
+
+  PageInfoDescription* description =
+      [[PageInfoDescription alloc] initWithURL:self.navigationItem->GetURL()
+                                     SSLStatus:self.navigationItem->GetSSL()
+                                 isPageOffline:presentingOfflinePage];
+  [self.consumer pageInfoChanged:description];
+}
+
+@end
diff --git a/ios/chrome/browser/ui/page_info/page_info_navigation_commands.h b/ios/chrome/browser/ui/page_info/page_info_navigation_commands.h
new file mode 100644
index 0000000..e1a434b9
--- /dev/null
+++ b/ios/chrome/browser/ui/page_info/page_info_navigation_commands.h
@@ -0,0 +1,17 @@
+// Copyright 2020 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 IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_NAVIGATION_COMMANDS_H_
+#define IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_NAVIGATION_COMMANDS_H_
+
+// Commands related to the Page Info navigation inside the page info view
+// controller.
+@protocol PageInfoNavigationCommands
+
+// Shows the site security information.
+- (void)showSiteSecurityInfo;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_NAVIGATION_COMMANDS_H_
diff --git a/ios/chrome/browser/ui/page_info/page_info_site_security_view_controller.h b/ios/chrome/browser/ui/page_info/page_info_site_security_view_controller.h
new file mode 100644
index 0000000..8db6accd
--- /dev/null
+++ b/ios/chrome/browser/ui/page_info/page_info_site_security_view_controller.h
@@ -0,0 +1,14 @@
+// Copyright 2020 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 IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_SITE_SECURITY_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_SITE_SECURITY_VIEW_CONTROLLER_H_
+
+#import <UIKit/UIKit.h>
+
+// View Controller for displaying the site security.
+@interface PageInfoSiteSecurityViewController : UIViewController
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_SITE_SECURITY_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/page_info/page_info_site_security_view_controller.mm b/ios/chrome/browser/ui/page_info/page_info_site_security_view_controller.mm
new file mode 100644
index 0000000..748e2b7
--- /dev/null
+++ b/ios/chrome/browser/ui/page_info/page_info_site_security_view_controller.mm
@@ -0,0 +1,22 @@
+// Copyright 2020 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.
+
+#import "ios/chrome/browser/ui/page_info/page_info_site_security_view_controller.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation PageInfoSiteSecurityViewController
+
+#pragma mark - UIViewController
+
+- (void)viewDidLoad {
+  // TODO(crbug.com/1038919): Implement this.
+  [super viewDidLoad];
+
+  self.view.backgroundColor = [UIColor redColor];
+}
+
+@end
diff --git a/ios/chrome/browser/ui/page_info/page_info_view_controller.h b/ios/chrome/browser/ui/page_info/page_info_view_controller.h
index 867ab66a..bd9c69e6 100644
--- a/ios/chrome/browser/ui/page_info/page_info_view_controller.h
+++ b/ios/chrome/browser/ui/page_info/page_info_view_controller.h
@@ -7,8 +7,16 @@
 
 #import <UIKit/UIKit.h>
 
+#import "ios/chrome/browser/ui/page_info/page_info_consumer.h"
+#import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h"
+
+@protocol PageInfoNavigationCommands;
+
 // View Controller for displaying the page info.
-@interface PageInfoViewController : UIViewController
+@interface PageInfoViewController : ChromeTableViewController <PageInfoConsumer>
+
+// Handler used to navigate inside the page info.
+@property(nonatomic, weak) id<PageInfoNavigationCommands> handler;
 
 @end
 
diff --git a/ios/chrome/browser/ui/page_info/page_info_view_controller.mm b/ios/chrome/browser/ui/page_info/page_info_view_controller.mm
index 67023f9e..4f54cc0 100644
--- a/ios/chrome/browser/ui/page_info/page_info_view_controller.mm
+++ b/ios/chrome/browser/ui/page_info/page_info_view_controller.mm
@@ -4,10 +4,72 @@
 
 #import "ios/chrome/browser/ui/page_info/page_info_view_controller.h"
 
+#import "ios/chrome/browser/ui/page_info/page_info_navigation_commands.h"
+#import "ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.h"
+#include "ios/chrome/grit/ios_strings.h"
+#include "ui/base/l10n/l10n_util.h"
+
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
+namespace {
+
+typedef NS_ENUM(NSInteger, SectionIdentifier) {
+  SectionIdentifierContent = kSectionIdentifierEnumZero,
+};
+
+typedef NS_ENUM(NSInteger, ItemType) {
+  ItemTypeSecurity = kItemTypeEnumZero,
+};
+
+}  // namespace
+
 @implementation PageInfoViewController
 
+#pragma mark - UIViewController
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+
+  self.title = l10n_util::GetNSString(IDS_IOS_PAGE_INFO_SITE_INFORMATION);
+}
+
+#pragma mark - PageInfoConsumer
+
+- (void)pageInfoChanged:(PageInfoDescription*)pageInfoDescription {
+  [self loadModel];
+
+  [self.tableViewModel addSectionWithIdentifier:SectionIdentifierContent];
+
+  // Create the Security item.
+  TableViewDetailIconItem* securityItem =
+      [[TableViewDetailIconItem alloc] initWithType:ItemTypeSecurity];
+  securityItem.text = l10n_util::GetNSString(IDS_IOS_PAGE_INFO_SITE_SECURITY);
+  securityItem.detailText = pageInfoDescription.pageSecurityStatusDescription;
+  securityItem.iconImageName =
+      pageInfoDescription.pageSecurityStatusIconImageName;
+  securityItem.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
+  [self.tableViewModel addItem:securityItem
+       toSectionWithIdentifier:SectionIdentifierContent];
+
+  [self.tableView reloadData];
+}
+
+#pragma mark - UITableViewDelegate
+
+- (void)tableView:(UITableView*)tableView
+    didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
+  [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
+  NSInteger itemType = [self.tableViewModel itemTypeForIndexPath:indexPath];
+  switch (itemType) {
+    case ItemTypeSecurity: {
+      [self.handler showSiteSecurityInfo];
+      break;
+    }
+    default:
+      break;
+  }
+}
+
 @end
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn
index c721e6bc..26d1e2da 100644
--- a/ios/chrome/browser/ui/settings/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -7,6 +7,7 @@
   sources = [
     "bar_button_activity_indicator.h",
     "bar_button_activity_indicator.mm",
+    "settings_controller_protocol.h",
     "settings_navigation_controller.h",
     "settings_root_table_view_controller.h",
     "settings_root_table_view_controller.mm",
@@ -29,7 +30,6 @@
     "//ios/public/provider/chrome/browser/user_feedback",
     "//ui/base",
   ]
-  public_deps = [ ":settings_controller_protocol" ]
 }
 
 source_set("settings_root_constants") {
@@ -194,12 +194,6 @@
   ]
 }
 
-source_set("settings_controller_protocol") {
-  configs += [ "//build/config/compiler:enable_arc" ]
-  sources = [ "settings_controller_protocol.h" ]
-  frameworks = [ "UIKit.framework" ]
-}
-
 source_set("constants") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
diff --git a/ios/chrome/browser/ui/settings/settings_controller_protocol.h b/ios/chrome/browser/ui/settings/settings_controller_protocol.h
index 22ec1e10..6dfc3f5 100644
--- a/ios/chrome/browser/ui/settings/settings_controller_protocol.h
+++ b/ios/chrome/browser/ui/settings/settings_controller_protocol.h
@@ -15,10 +15,6 @@
 // Notifies the controller that the settings screen is being dismissed.
 - (void)settingsWillBeDismissed;
 
-// Notifies the controller that is popped out from the settings navigation
-// controller.
-- (void)viewControllerWasPopped;
-
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_SETTINGS_SETTINGS_CONTROLLER_PROTOCOL_H_
diff --git a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
index b560bd5..a984b1f 100644
--- a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
@@ -336,16 +336,6 @@
   }
 }
 
-- (UIViewController*)popViewControllerAnimated:(BOOL)animated {
-  UIViewController* poppedViewController =
-      [super popViewControllerAnimated:animated];
-  if ([poppedViewController
-          respondsToSelector:@selector(viewControllerWasPopped)]) {
-    [poppedViewController performSelector:@selector(viewControllerWasPopped)];
-  }
-  return poppedViewController;
-}
-
 #pragma mark - Private
 
 // Creates an autoreleased "Cancel" button that cancels the settings when
diff --git a/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.mm
index b2adc68..9792296 100644
--- a/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.mm
+++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.mm
@@ -159,10 +159,16 @@
 
 #pragma mark - FakeboxFocuser
 
-- (void)focusLocationBarWithAnimation:(BOOL)animated {
-  self.enableAnimationsForOmniboxFocus = animated;
-  [self transitionToLocationBarFocusedState:YES];
+- (void)focusOmniboxNoAnimation {
+  self.enableAnimationsForOmniboxFocus = NO;
+  [self fakeboxFocused];
   self.enableAnimationsForOmniboxFocus = YES;
+  // If the pasteboard is containing a URL, the omnibox popup suggestions are
+  // displayed as soon as the omnibox is focused.
+  // If the fake omnibox animation is triggered at the same time, it is possible
+  // to see the NTP going up where the real omnibox should be displayed.
+  if ([self.locationBarCoordinator omniboxPopupHasAutocompleteResults])
+    [self onFakeboxAnimationComplete];
 }
 
 - (void)fakeboxFocused {
diff --git a/ios/chrome/browser/ui/toolbar/public/fakebox_focuser.h b/ios/chrome/browser/ui/toolbar/public/fakebox_focuser.h
index 998d9711..59808d55 100644
--- a/ios/chrome/browser/ui/toolbar/public/fakebox_focuser.h
+++ b/ios/chrome/browser/ui/toolbar/public/fakebox_focuser.h
@@ -10,8 +10,8 @@
 // This protocol provides callbacks for focusing and blurring the fake omnibox
 // on NTP.
 @protocol FakeboxFocuser
-// Focuses the location bar.
-- (void)focusLocationBarWithAnimation:(BOOL)animated;
+// Focuses the omnibox without animations.
+- (void)focusOmniboxNoAnimation;
 // Give focus to the omnibox, but indicate that the focus event was initiated
 // from the fakebox on the Google landing page.
 - (void)fakeboxFocused;
diff --git a/ios/chrome/browser/web/repost_form_tab_helper.mm b/ios/chrome/browser/web/repost_form_tab_helper.mm
index b771f16b6..ca4b442 100644
--- a/ios/chrome/browser/web/repost_form_tab_helper.mm
+++ b/ios/chrome/browser/web/repost_form_tab_helper.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/web/repost_form_tab_helper.h"
 
+#include "base/memory/ptr_util.h"
 #import "ios/chrome/browser/web/repost_form_tab_helper_delegate.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn
index 8d573c2..7e95a92 100644
--- a/ios/chrome/test/BUILD.gn
+++ b/ios/chrome/test/BUILD.gn
@@ -189,6 +189,7 @@
     "//ios/chrome/browser/infobars/overlays/browser_agent:unit_tests",
     "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common:unit_tests",
     "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords:unit_tests",
+    "//ios/chrome/browser/interstitials:unit_tests",
     "//ios/chrome/browser/itunes_urls:unit_tests",
     "//ios/chrome/browser/json_parser:unit_tests",
     "//ios/chrome/browser/language:unit_tests",
diff --git a/ios/public/provider/chrome/browser/build_config.gni b/ios/public/provider/chrome/browser/build_config.gni
index 41bb857..20c09d1 100644
--- a/ios/public/provider/chrome/browser/build_config.gni
+++ b/ios/public/provider/chrome/browser/build_config.gni
@@ -31,4 +31,12 @@
   # file which is copied to the application bundle. This is used by Firebase
   # SDK (which comes from the internal framework).
   ios_firebase_resources_target = ""
+
+  # This defines targets to include resources needed by the providers which are
+  # copied to the application bundle.
+  ios_providers_resources_targets = []
+
+  # This defines targets to include resources needed by the providers which are
+  # copied to the test application bundle.
+  ios_providers_test_resources_targets = []
 }
diff --git a/ios/web/browsing_data/browsing_data_remover.mm b/ios/web/browsing_data/browsing_data_remover.mm
index b520893fa..5f4bb21 100644
--- a/ios/web/browsing_data/browsing_data_remover.mm
+++ b/ios/web/browsing_data/browsing_data_remover.mm
@@ -7,6 +7,7 @@
 #import <WebKit/WebKit.h>
 
 #import "base/ios/block_types.h"
+#include "base/memory/ptr_util.h"
 #include "base/task/post_task.h"
 #import "ios/web/browsing_data/browsing_data_remover_observer.h"
 #import "ios/web/public/browser_state.h"
diff --git a/ios/web/navigation/navigation_item_impl.h b/ios/web/navigation/navigation_item_impl.h
index 27397d0..cdb9f12 100644
--- a/ios/web/navigation/navigation_item_impl.h
+++ b/ios/web/navigation/navigation_item_impl.h
@@ -131,6 +131,9 @@
   void SetUntrusted();
   bool IsUntrusted();
 
+  // Restores the state of the |other| navigation item in this item.
+  void RestoreStateFromItem(NavigationItem* other);
+
 #ifndef NDEBUG
   // Returns a human-readable description of the state for debugging purposes.
   NSString* GetDescription() const;
diff --git a/ios/web/navigation/navigation_item_impl.mm b/ios/web/navigation/navigation_item_impl.mm
index 70cef74..c4aa87d 100644
--- a/ios/web/navigation/navigation_item_impl.mm
+++ b/ios/web/navigation/navigation_item_impl.mm
@@ -338,6 +338,17 @@
   SetNavigationInitiationType(web::NavigationInitiationType::NONE);
 }
 
+void NavigationItemImpl::RestoreStateFromItem(NavigationItem* other) {
+  // Only restore the UserAgent type and the page display state. The other
+  // headers might not make sense after creating a new navigation to the page.
+  bool inherited_user_agent =
+      other->GetUserAgentType() == other->GetUserAgentForInheritance();
+  if (other->GetUserAgentType() != UserAgentType::NONE) {
+    SetUserAgentType(other->GetUserAgentType(), inherited_user_agent);
+  }
+  SetPageDisplayState(other->GetPageDisplayState());
+}
+
 ErrorRetryStateMachine& NavigationItemImpl::error_retry_state_machine() {
   DCHECK(!base::FeatureList::IsEnabled(web::features::kUseJSForErrorPage));
   return error_retry_state_machine_;
diff --git a/ios/web/navigation/navigation_manager_impl_unittest.mm b/ios/web/navigation/navigation_manager_impl_unittest.mm
index e6478e7..18ea49f2 100644
--- a/ios/web/navigation/navigation_manager_impl_unittest.mm
+++ b/ios/web/navigation/navigation_manager_impl_unittest.mm
@@ -103,6 +103,14 @@
   WebState* web_state_ = nullptr;
 };
 
+// Data holder for the informations to be restored in the items.
+struct ItemInfoToBeRestored {
+  GURL url;
+  UserAgentType user_agent;
+  bool user_agent_inherited;
+  PageDisplayState display_state;
+};
+
 }  // namespace
 
 // Test fixture for NavigationManagerImpl testing.
@@ -1824,12 +1832,22 @@
 
 // Tests that Restore() creates the correct navigation state.
 TEST_F(NavigationManagerTest, Restore) {
-  GURL urls[3] = {GURL("http://www.url.com/0"), GURL("http://www.url.com/1"),
-                  GURL("http://www.url.com/2")};
+  ItemInfoToBeRestored restore_information[3];
+  restore_information[0] = {GURL("http://www.url.com/0"), UserAgentType::MOBILE,
+                            true, PageDisplayState()};
+  restore_information[1] = {GURL("http://www.url.com/1"),
+                            UserAgentType::DESKTOP, true, PageDisplayState()};
+  restore_information[2] = {GURL("http://www.url.com/2"),
+                            UserAgentType::DESKTOP, false, PageDisplayState()};
+
   std::vector<std::unique_ptr<NavigationItem>> items;
-  for (size_t index = 0; index < base::size(urls); ++index) {
+  for (size_t index = 0; index < base::size(restore_information); ++index) {
     items.push_back(NavigationItem::Create());
-    items.back()->SetURL(urls[index]);
+    items.back()->SetURL(restore_information[index].url);
+    items.back()->SetUserAgentType(
+        restore_information[index].user_agent,
+        restore_information[index].user_agent_inherited);
+    items.back()->SetPageDisplayState(restore_information[index].display_state);
   }
 
   // Call Restore() and check that the NavigationItems are in the correct order
@@ -1838,6 +1856,7 @@
   navigation_manager()->Restore(1, std::move(items));
   __block bool restore_done = false;
   navigation_manager()->AddRestoreCompletionCallback(base::BindOnce(^{
+    navigation_manager()->CommitPendingItem();
     restore_done = true;
   }));
 
@@ -1857,7 +1876,7 @@
   navigation_manager()->OnNavigationStarted(pending_url);
 
   // Simulate the end effect of loading the restore session URL in web view.
-  pending_item->SetURL(urls[1]);
+  pending_item->SetURL(restore_information[1].url);
   [mock_wk_list_ setCurrentURL:@"http://www.url.com/1"
                   backListURLs:@[ @"http://www.url.com/0" ]
                forwardListURLs:@[ @"http://www.url.com/2" ]];
@@ -1870,10 +1889,29 @@
   EXPECT_FALSE(navigation_manager()->IsRestoreSessionInProgress());
   ASSERT_EQ(3, navigation_manager()->GetItemCount());
   EXPECT_EQ(1, navigation_manager()->GetLastCommittedItemIndex());
-  EXPECT_EQ(urls[1], navigation_manager()->GetLastCommittedItem()->GetURL());
+  EXPECT_EQ(restore_information[1].url,
+            navigation_manager()->GetLastCommittedItem()->GetURL());
 
-  for (size_t i = 0; i < base::size(urls); ++i) {
-    EXPECT_EQ(urls[i], navigation_manager()->GetItemAtIndex(i)->GetURL());
+  for (size_t i = 0; i < base::size(restore_information); ++i) {
+    NavigationItem* navigation_item = navigation_manager()->GetItemAtIndex(i);
+    EXPECT_EQ(restore_information[i].url, navigation_item->GetURL());
+    EXPECT_EQ(restore_information[i].user_agent,
+              navigation_item->GetUserAgentType());
+    if (restore_information[i].user_agent_inherited) {
+      EXPECT_EQ(restore_information[i].user_agent,
+                navigation_item->GetUserAgentForInheritance());
+    } else {
+      if (base::FeatureList::IsEnabled(
+              features::kUseDefaultUserAgentInWebClient)) {
+        EXPECT_EQ(UserAgentType::AUTOMATIC,
+                  navigation_item->GetUserAgentForInheritance());
+      } else {
+        EXPECT_EQ(UserAgentType::MOBILE,
+                  navigation_item->GetUserAgentForInheritance());
+      }
+    }
+    EXPECT_EQ(restore_information[i].display_state,
+              navigation_item->GetPageDisplayState());
   }
 
   histogram_tester_.ExpectTotalCount(kRestoreNavigationItemCount, 1);
diff --git a/ios/web/navigation/wk_based_navigation_manager_impl.h b/ios/web/navigation/wk_based_navigation_manager_impl.h
index d224587..d6b72c0 100644
--- a/ios/web/navigation/wk_based_navigation_manager_impl.h
+++ b/ios/web/navigation/wk_based_navigation_manager_impl.h
@@ -204,6 +204,12 @@
     DISALLOW_COPY_AND_ASSIGN(WKWebViewCache);
   };
 
+  // Type of the list passed to restore items.
+  enum class RestoreItemListType {
+    kBackList,
+    kForwardList,
+  };
+
   // NavigationManagerImpl:
   NavigationItemImpl* GetNavigationItemImplAtIndex(size_t index) const override;
   NavigationItemImpl* GetLastCommittedItemInCurrentOrRestoredSession()
@@ -222,6 +228,17 @@
       NavigationInitiationType initiation_type) override;
   bool IsPlaceholderUrl(const GURL& url) const override;
 
+  // Restores the state of the |items_restored| in the navigation items
+  // associated with the WKBackForwardList. |back_list| is used to specify if
+  // the items passed are the list containing the back list or the forward list.
+  void RestoreItemsState(
+      RestoreItemListType list_type,
+      std::vector<std::unique_ptr<NavigationItem>> items_restored);
+
+  // Restores the state of the |restored_visible_item_| in the last committed
+  // item.
+  void RestoreVisibleItemState();
+
   // Restores the specified navigation session in the current web view. This
   // differs from Restore() in that it doesn't reset the current navigation
   // history to empty before restoring. It simply appends the restored session
diff --git a/ios/web/navigation/wk_based_navigation_manager_impl.mm b/ios/web/navigation/wk_based_navigation_manager_impl.mm
index db7488d..cbb26d6 100644
--- a/ios/web/navigation/wk_based_navigation_manager_impl.mm
+++ b/ios/web/navigation/wk_based_navigation_manager_impl.mm
@@ -84,7 +84,7 @@
   delegate_->OnNavigationItemCommitted(item);
 
   if (!wk_navigation_util::IsRestoreSessionUrl(item->GetURL())) {
-    restored_visible_item_.reset();
+    RestoreVisibleItemState();
   }
 }
 
@@ -417,7 +417,7 @@
   // Abort restore.
   DiscardNonCommittedItems();
   last_committed_item_index_ = web_view_cache_.GetCurrentItemIndex();
-  restored_visible_item_.reset();
+  RestoreVisibleItemState();
   FinalizeSessionRestore();
   return true;
 }
@@ -733,6 +733,24 @@
   if (last_committed_item_index > -1)
     restored_visible_item_ = std::move(items[last_committed_item_index]);
 
+  std::vector<std::unique_ptr<NavigationItem>> back_items;
+  for (int index = 0; index < last_committed_item_index; index++) {
+    back_items.push_back(std::move(items[index]));
+  }
+
+  std::vector<std::unique_ptr<NavigationItem>> forward_items;
+  for (size_t index = last_committed_item_index + 1; index < items.size();
+       index++) {
+    forward_items.push_back(std::move(items[index]));
+  }
+
+  AddRestoreCompletionCallback(base::BindOnce(
+      &WKBasedNavigationManagerImpl::RestoreItemsState, base::Unretained(this),
+      RestoreItemListType::kBackList, std::move(back_items)));
+  AddRestoreCompletionCallback(base::BindOnce(
+      &WKBasedNavigationManagerImpl::RestoreItemsState, base::Unretained(this),
+      RestoreItemListType::kForwardList, std::move(forward_items)));
+
   LoadURLWithParams(params);
 
   // On restore prime the first navigation item with the title.  The remaining
@@ -743,6 +761,49 @@
   }
 }
 
+void WKBasedNavigationManagerImpl::RestoreItemsState(
+    RestoreItemListType list_type,
+    std::vector<std::unique_ptr<NavigationItem>> items_restored) {
+  bool back_list = list_type == RestoreItemListType::kBackList;
+  size_t current_item_index = web_view_cache_.GetCurrentItemIndex();
+  size_t cache_offset = back_list ? 0 : current_item_index + 1;
+  size_t cache_limit = back_list
+                           ? current_item_index
+                           : web_view_cache_.GetBackForwardListItemCount();
+
+  for (size_t index = 0; index < items_restored.size(); index++) {
+    size_t cache_index = index + cache_offset;
+    if (cache_index >= cache_limit)
+      break;
+
+    NavigationItemImpl* cached_item =
+        web_view_cache_.GetNavigationItemImplAtIndex(
+            cache_index, true /* create_if_missing */);
+    NavigationItem* restore_item = items_restored[index].get();
+
+    bool is_same_url = cached_item->GetURL() == restore_item->GetURL();
+    if (wk_navigation_util::IsRestoreSessionUrl(cached_item->GetURL())) {
+      GURL target_url;
+      if (wk_navigation_util::ExtractTargetURL(cached_item->GetURL(),
+                                               &target_url))
+        is_same_url = target_url == restore_item->GetURL();
+    }
+
+    if (is_same_url) {
+      cached_item->RestoreStateFromItem(restore_item);
+    }
+  }
+}
+
+void WKBasedNavigationManagerImpl::RestoreVisibleItemState() {
+  NavigationItemImpl* last_committed_item =
+      GetLastCommittedItemInCurrentOrRestoredSession();
+  if (restored_visible_item_ && last_committed_item) {
+    last_committed_item->RestoreStateFromItem(restored_visible_item_.get());
+  }
+  restored_visible_item_.reset();
+}
+
 void WKBasedNavigationManagerImpl::LoadURLWithParams(
     const NavigationManager::WebLoadParams& params) {
   if (IsRestoreSessionInProgress() &&
diff --git a/ios/web_view/internal/cwv_back_forward_list.mm b/ios/web_view/internal/cwv_back_forward_list.mm
index 177ead75..b2242f41 100644
--- a/ios/web_view/internal/cwv_back_forward_list.mm
+++ b/ios/web_view/internal/cwv_back_forward_list.mm
@@ -15,6 +15,8 @@
 
 @implementation CWVBackForwardListItemArray {
   BOOL _isBackList;
+
+  CWVBackForwardListItem* _fastEnumerationItemCache;
 }
 
 - (instancetype)initWithBackForwardList:(CWVBackForwardList*)list
@@ -23,6 +25,8 @@
   if (self) {
     _list = list;
     _isBackList = isBackList;
+
+    _fastEnumerationItemCache = nil;
   }
   return self;
 }
@@ -69,6 +73,34 @@
   return [[CWVBackForwardListItem alloc] initWithNavigationItem:item];
 }
 
+#pragma mark - NSFastEnumeration
+
+- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState*)state
+                                  objects:(id __unsafe_unretained[])stackbuf
+                                    count:(NSUInteger)len {
+  DCHECK_GE(self.count, state->state);
+  DCHECK_GE(len, 1UL);
+  if (self.count == state->state) {
+    return 0;
+  }
+
+  // |state| is a pure C-struct so retaining an item in |state| is impossible.
+  // So, |_fastEnumerationItemCache| is designed to retain the returned item.
+  // It is the caller's responsibility to ensure this is not deallocated during
+  // enumeration, so a caller should not use nested for-in statement on the same
+  // list, otherwise it will cause a use-after-free bug.
+  _fastEnumerationItemCache = [self objectAtIndexedSubscript:state->state];
+
+  // This tells Obj-C runtime that |self| is immutable (because
+  // |&state->extra[0]| is constant) during enumeration.
+  state->mutationsPtr = &state->extra[0];
+
+  state->itemsPtr = stackbuf;
+  state->itemsPtr[0] = _fastEnumerationItemCache;
+  ++state->state;
+  return 1;
+}
+
 @end
 
 @implementation CWVBackForwardList
diff --git a/ios/web_view/internal/sync/cwv_sync_controller.mm b/ios/web_view/internal/sync/cwv_sync_controller.mm
index 2c42dfe..69cfedb 100644
--- a/ios/web_view/internal/sync/cwv_sync_controller.mm
+++ b/ios/web_view/internal/sync/cwv_sync_controller.mm
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback_helpers.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/time/time.h"
diff --git a/ios/web_view/public/cwv_back_forward_list.h b/ios/web_view/public/cwv_back_forward_list.h
index 76e1c2e6..d1e7af9 100644
--- a/ios/web_view/public/cwv_back_forward_list.h
+++ b/ios/web_view/public/cwv_back_forward_list.h
@@ -15,8 +15,24 @@
 @class CWVWebView;
 
 // This just behaves like a NSArray<CWVBackForwardListItem*>.
+//
+// |objectAtIndexedSubscript:| and |NSFastEnumeration| are implemented to
+// allow to use [] operator and a for-in statement to iterate |self|, like:
+//   for (CWVBackForwardListItem* item in backList) { ... }
+//   CWVBackForwardListItem* lastItem = backList[backList.count-1];
+//
+// WARNING: Do not use nested for-in statements to iterate one list at the
+// same time, otherwise it will cause a use-after-free bug. Example:
+//   for (CWVBackForwardListItem* item in forwardList) {  // OK
+//     for (CWVBackForwardListItem* item2 in forwardList) {  // BAD!!
+//       // |item| will be deallocated here so the above line is BAD!
+//     }
+//     // |item| has been deallocated, so using |item| will cause a
+//     // use-after-free bug.
+//     for (CWVBackForwardListItem* item2 in backList) {}  // OK
+//   }
 CWV_EXPORT
-@interface CWVBackForwardListItemArray : NSObject
+@interface CWVBackForwardListItemArray : NSObject <NSFastEnumeration>
 
 // The number of items in this array-like |self|.
 @property(nonatomic, readonly) NSUInteger count;
diff --git a/ios/web_view/test/web_view_back_forward_list_inttest.mm b/ios/web_view/test/web_view_back_forward_list_inttest.mm
index 897074d..ac56b07 100644
--- a/ios/web_view/test/web_view_back_forward_list_inttest.mm
+++ b/ios/web_view/test/web_view_back_forward_list_inttest.mm
@@ -250,4 +250,33 @@
   EXPECT_FALSE([list itemAtIndex:3]);
 }
 
+// Tests if a CWVBackForwardListItemArray can be correctly iterated using
+// a for-in statement.
+TEST_F(WebViewBackForwardListTest, TestCWVBackForwardListItemArrayForInLoop) {
+  ASSERT_TRUE(test_server_->Start());
+  GenerateTestPageUrls();
+
+  // Go to page3
+  ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page1_url_)));
+  ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page2_url_)));
+  ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page3_url_)));
+  // Now it should be in page3
+  ASSERT_NSEQ(@"page3",
+              test::EvaluateJavaScript(web_view_, @"document.title", nil));
+
+  CWVBackForwardList* list = web_view_.backForwardList;
+  ASSERT_EQ(2UL, list.backList.count);
+  size_t i = 0;
+  for (CWVBackForwardListItem* item in list.backList) {
+    EXPECT_NSEQ(list.backList[i], item);
+    ++i;
+  }
+  EXPECT_EQ(i, list.backList.count);
+  i = 0;
+  for (CWVBackForwardListItem* _ __unused in list.forwardList) {
+    ++i;
+  }
+  EXPECT_EQ(i, list.forwardList.count);
+}
+
 }  // namespace ios_web_view
diff --git a/media/capture/video/gpu_memory_buffer_utils.cc b/media/capture/video/gpu_memory_buffer_utils.cc
index 1deb1245..62c52b72 100644
--- a/media/capture/video/gpu_memory_buffer_utils.cc
+++ b/media/capture/video/gpu_memory_buffer_utils.cc
@@ -4,6 +4,7 @@
 
 #include "media/capture/video/gpu_memory_buffer_utils.h"
 
+#include "base/bind_helpers.h"
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 
diff --git a/media/cast/cast_environment.cc b/media/cast/cast_environment.cc
index b83ecd5..281b90490 100644
--- a/media/cast/cast_environment.cc
+++ b/media/cast/cast_environment.cc
@@ -36,9 +36,10 @@
 
 bool CastEnvironment::PostDelayedTask(ThreadId identifier,
                                       const base::Location& from_here,
-                                      const base::Closure& task,
+                                      base::OnceClosure task,
                                       base::TimeDelta delay) {
-  return GetTaskRunner(identifier)->PostDelayedTask(from_here, task, delay);
+  return GetTaskRunner(identifier)
+      ->PostDelayedTask(from_here, std::move(task), delay);
 }
 
 scoped_refptr<SingleThreadTaskRunner> CastEnvironment::GetTaskRunner(
diff --git a/media/cast/cast_environment.h b/media/cast/cast_environment.h
index 7a0b7b7..bff6604e 100644
--- a/media/cast/cast_environment.h
+++ b/media/cast/cast_environment.h
@@ -48,7 +48,7 @@
 
   bool PostDelayedTask(ThreadId identifier,
                        const base::Location& from_here,
-                       const base::Closure& task,
+                       base::OnceClosure task,
                        base::TimeDelta delay);
 
   bool CurrentlyOn(ThreadId identifier);
diff --git a/media/cast/cast_receiver.h b/media/cast/cast_receiver.h
index d4b2aef..659531b 100644
--- a/media/cast/cast_receiver.h
+++ b/media/cast/cast_receiver.h
@@ -39,13 +39,6 @@
                                  base::TimeTicks playout_time,
                                  bool is_continuous)>;
 
-// The following callback delivers encoded frame data and metadata.  The client
-// should examine the |frame_id| field to determine whether any frames have been
-// dropped (i.e., frame_id should be incrementing by one each time).  Note: A
-// NULL pointer can be returned on error.
-typedef base::Callback<void(std::unique_ptr<EncodedFrame>)>
-    ReceiveEncodedFrameCallback;
-
 class CastReceiver {
  public:
   static std::unique_ptr<CastReceiver> Create(
diff --git a/media/cast/receiver/frame_receiver.cc b/media/cast/receiver/frame_receiver.cc
index 9b1aff2..71ff3dc8 100644
--- a/media/cast/receiver/frame_receiver.cc
+++ b/media/cast/receiver/frame_receiver.cc
@@ -74,10 +74,9 @@
   cast_environment_->logger()->Unsubscribe(&event_subscriber_);
 }
 
-void FrameReceiver::RequestEncodedFrame(
-    const ReceiveEncodedFrameCallback& callback) {
+void FrameReceiver::RequestEncodedFrame(ReceiveEncodedFrameCallback callback) {
   DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
-  frame_request_queue_.push_back(callback);
+  frame_request_queue_.push_back(std::move(callback));
   EmitAvailableEncodedFrames();
 }
 
@@ -245,8 +244,9 @@
           is_waiting_for_consecutive_frame_ = true;
           cast_environment_->PostDelayedTask(
               CastEnvironment::MAIN, FROM_HERE,
-              base::Bind(&FrameReceiver::EmitAvailableEncodedFramesAfterWaiting,
-                         AsWeakPtr()),
+              base::BindOnce(
+                  &FrameReceiver::EmitAvailableEncodedFramesAfterWaiting,
+                  AsWeakPtr()),
               playout_time - now);
         }
         return;
@@ -281,7 +281,7 @@
     cast_environment_->PostTask(
         CastEnvironment::MAIN, FROM_HERE,
         base::BindOnce(&FrameReceiver::EmitOneFrame, AsWeakPtr(),
-                       frame_request_queue_.front(),
+                       base::Passed(std::move(*frame_request_queue_.begin())),
                        base::Passed(&encoded_frame)));
     frame_request_queue_.pop_front();
   }
@@ -295,11 +295,11 @@
 }
 
 void FrameReceiver::EmitOneFrame(
-    const ReceiveEncodedFrameCallback& callback,
+    ReceiveEncodedFrameCallback callback,
     std::unique_ptr<EncodedFrame> encoded_frame) const {
   DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
   if (!callback.is_null())
-    callback.Run(std::move(encoded_frame));
+    std::move(callback).Run(std::move(encoded_frame));
 }
 
 base::TimeTicks FrameReceiver::GetPlayoutTime(const EncodedFrame& frame) const {
@@ -324,7 +324,7 @@
       time_to_send, base::TimeDelta::FromMilliseconds(kMinSchedulingDelayMs));
   cast_environment_->PostDelayedTask(
       CastEnvironment::MAIN, FROM_HERE,
-      base::Bind(&FrameReceiver::SendNextCastMessage, AsWeakPtr()),
+      base::BindOnce(&FrameReceiver::SendNextCastMessage, AsWeakPtr()),
       time_to_send);
 }
 
@@ -339,7 +339,7 @@
 
   cast_environment_->PostDelayedTask(
       CastEnvironment::MAIN, FROM_HERE,
-      base::Bind(&FrameReceiver::SendNextRtcpReport, AsWeakPtr()),
+      base::BindOnce(&FrameReceiver::SendNextRtcpReport, AsWeakPtr()),
       base::TimeDelta::FromMilliseconds(kRtcpReportIntervalMs));
 }
 
diff --git a/media/cast/receiver/frame_receiver.h b/media/cast/receiver/frame_receiver.h
index 95d9c358..a949f86c 100644
--- a/media/cast/receiver/frame_receiver.h
+++ b/media/cast/receiver/frame_receiver.h
@@ -32,6 +32,13 @@
 
 class CastEnvironment;
 
+// The following callback delivers encoded frame data and metadata.  The client
+// should examine the |frame_id| field to determine whether any frames have been
+// dropped (i.e., frame_id should be incrementing by one each time).  Note: A
+// nullptr can be returned on error.
+using ReceiveEncodedFrameCallback =
+    base::OnceCallback<void(std::unique_ptr<EncodedFrame>)>;
+
 // FrameReceiver receives packets out-of-order while clients make requests for
 // complete frames in-order.  (A frame consists of one or more packets.)
 //
@@ -63,7 +70,7 @@
   //
   // The given |callback| is guaranteed to be run at some point in the future,
   // except for those requests still enqueued at destruction time.
-  void RequestEncodedFrame(const ReceiveEncodedFrameCallback& callback);
+  void RequestEncodedFrame(ReceiveEncodedFrameCallback callback);
 
   // Called to deliver another packet, possibly a duplicate, and possibly
   // out-of-order.  Returns true if the parsing of the packet succeeded.
@@ -96,7 +103,7 @@
   // This method is used by EmitAvailableEncodedFrames() to return to the event
   // loop, but make sure that FrameReceiver is still alive before the callback
   // is run.
-  void EmitOneFrame(const ReceiveEncodedFrameCallback& callback,
+  void EmitOneFrame(ReceiveEncodedFrameCallback callback,
                     std::unique_ptr<EncodedFrame> encoded_frame) const;
 
   // Computes the playout time for a frame with the given |rtp_timestamp|.
diff --git a/media/cast/receiver/frame_receiver_unittest.cc b/media/cast/receiver/frame_receiver_unittest.cc
index 1599ac9d..04c4682 100644
--- a/media/cast/receiver/frame_receiver_unittest.cc
+++ b/media/cast/receiver/frame_receiver_unittest.cc
@@ -254,10 +254,8 @@
   const base::TimeTicks first_frame_capture_time = testing_clock_.NowTicks();
 
   // Enqueue a request for a frame.
-  const ReceiveEncodedFrameCallback frame_encoded_callback =
-      base::Bind(&FakeFrameClient::DeliverEncodedFrame,
-                 base::Unretained(&frame_client_));
-  receiver_->RequestEncodedFrame(frame_encoded_callback);
+  receiver_->RequestEncodedFrame(base::BindOnce(
+      &FakeFrameClient::DeliverEncodedFrame, base::Unretained(&frame_client_)));
   task_runner_->RunTasks();
   EXPECT_EQ(0, frame_client_.number_times_called());
 
@@ -272,7 +270,8 @@
   EXPECT_EQ(1, frame_client_.number_times_called());
 
   // Enqueue a second request for a frame, but it should not be fulfilled yet.
-  receiver_->RequestEncodedFrame(frame_encoded_callback);
+  receiver_->RequestEncodedFrame(base::BindOnce(
+      &FakeFrameClient::DeliverEncodedFrame, base::Unretained(&frame_client_)));
   task_runner_->RunTasks();
   EXPECT_EQ(1, frame_client_.number_times_called());
 
@@ -292,7 +291,8 @@
   EXPECT_EQ(1, frame_client_.number_times_called());
 
   // Enqueue a third request for a frame.
-  receiver_->RequestEncodedFrame(frame_encoded_callback);
+  receiver_->RequestEncodedFrame(base::BindOnce(
+      &FakeFrameClient::DeliverEncodedFrame, base::Unretained(&frame_client_)));
   task_runner_->RunTasks();
   EXPECT_EQ(1, frame_client_.number_times_called());
 
@@ -368,10 +368,8 @@
   const base::TimeTicks first_frame_capture_time = testing_clock_.NowTicks();
 
   // Enqueue a request for a frame.
-  const ReceiveEncodedFrameCallback frame_encoded_callback =
-      base::Bind(&FakeFrameClient::DeliverEncodedFrame,
-                 base::Unretained(&frame_client_));
-  receiver_->RequestEncodedFrame(frame_encoded_callback);
+  receiver_->RequestEncodedFrame(base::BindOnce(
+      &FakeFrameClient::DeliverEncodedFrame, base::Unretained(&frame_client_)));
   task_runner_->RunTasks();
   EXPECT_EQ(0, frame_client_.number_times_called());
 
@@ -386,7 +384,8 @@
   EXPECT_EQ(1, frame_client_.number_times_called());
 
   // Enqueue a second request for a frame, but it should not be fulfilled yet.
-  receiver_->RequestEncodedFrame(frame_encoded_callback);
+  receiver_->RequestEncodedFrame(base::BindOnce(
+      &FakeFrameClient::DeliverEncodedFrame, base::Unretained(&frame_client_)));
   task_runner_->RunTasks();
   EXPECT_EQ(1, frame_client_.number_times_called());
 
@@ -403,7 +402,8 @@
   EXPECT_EQ(1, frame_client_.number_times_called());
 
   // Enqueue a third request for a frame.
-  receiver_->RequestEncodedFrame(frame_encoded_callback);
+  receiver_->RequestEncodedFrame(base::BindOnce(
+      &FakeFrameClient::DeliverEncodedFrame, base::Unretained(&frame_client_)));
   task_runner_->RunTasks();
   EXPECT_EQ(1, frame_client_.number_times_called());
 
diff --git a/media/cast/sender/frame_sender.cc b/media/cast/sender/frame_sender.cc
index 3d96a1d..b8328e8 100644
--- a/media/cast/sender/frame_sender.cc
+++ b/media/cast/sender/frame_sender.cc
@@ -110,8 +110,8 @@
 
   cast_environment_->PostDelayedTask(
       CastEnvironment::MAIN, FROM_HERE,
-      base::BindRepeating(&FrameSender::SendRtcpReport,
-                          weak_factory_.GetWeakPtr(), true),
+      base::BindOnce(&FrameSender::SendRtcpReport, weak_factory_.GetWeakPtr(),
+                     true),
       base::TimeDelta::FromMilliseconds(kRtcpReportIntervalMs));
 }
 
@@ -192,8 +192,7 @@
   time_to_next = std::max(time_to_next, kMinSchedulingDelay);
   cast_environment_->PostDelayedTask(
       CastEnvironment::MAIN, FROM_HERE,
-      base::BindRepeating(&FrameSender::ResendCheck,
-                          weak_factory_.GetWeakPtr()),
+      base::BindOnce(&FrameSender::ResendCheck, weak_factory_.GetWeakPtr()),
       time_to_next);
 }
 
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index c7d6d9e..c96e599d 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -545,4 +545,17 @@
       "//testing/gtest",
     ]
   }
+
+  test("video_encode_accelerator_tests") {
+    sources = [ "video_encode_accelerator_tests.cc" ]
+    data = [ "//media/test/data/" ]
+    deps = [
+      ":buildflags",
+      "test:helpers",
+      "test:video_encoder",
+      "test:video_encoder_test_environment",
+      "//media:test_support",
+      "//testing/gtest",
+    ]
+  }
 }
diff --git a/media/gpu/android/pooled_shared_image_video_provider.cc b/media/gpu/android/pooled_shared_image_video_provider.cc
index 87b29cb8..f46a8ca0 100644
--- a/media/gpu/android/pooled_shared_image_video_provider.cc
+++ b/media/gpu/android/pooled_shared_image_video_provider.cc
@@ -4,6 +4,7 @@
 
 #include "media/gpu/android/pooled_shared_image_video_provider.h"
 
+#include "base/memory/ptr_util.h"
 #include "gpu/command_buffer/common/sync_token.h"
 #include "media/base/bind_to_current_loop.h"
 #include "mojo/public/cpp/bindings/callback_helpers.h"
diff --git a/media/gpu/android/pooled_shared_image_video_provider_unittest.cc b/media/gpu/android/pooled_shared_image_video_provider_unittest.cc
index c561eed..174c8bb8 100644
--- a/media/gpu/android/pooled_shared_image_video_provider_unittest.cc
+++ b/media/gpu/android/pooled_shared_image_video_provider_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <list>
 
+#include "base/memory/ptr_util.h"
 #include "base/test/mock_callback.h"
 #include "base/test/task_environment.h"
 #include "base/threading/sequenced_task_runner_handle.h"
diff --git a/media/gpu/chromeos/image_processor.cc b/media/gpu/chromeos/image_processor.cc
index 1cdd12e..cde32f09 100644
--- a/media/gpu/chromeos/image_processor.cc
+++ b/media/gpu/chromeos/image_processor.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "base/task/post_task.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
diff --git a/media/gpu/mac/vt_video_decode_accelerator_mac.cc b/media/gpu/mac/vt_video_decode_accelerator_mac.cc
index b3a3a6e72..35dd1da8 100644
--- a/media/gpu/mac/vt_video_decode_accelerator_mac.cc
+++ b/media/gpu/mac/vt_video_decode_accelerator_mac.cc
@@ -18,6 +18,7 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/mac/mac_logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
diff --git a/media/gpu/test/BUILD.gn b/media/gpu/test/BUILD.gn
index ffb26da..2ec2073 100644
--- a/media/gpu/test/BUILD.gn
+++ b/media/gpu/test/BUILD.gn
@@ -132,6 +132,35 @@
   ]
 }
 
+static_library("video_encoder") {
+  testonly = true
+  sources = [
+    "bitstream_helpers.h",
+    "video_encoder/video_encoder.cc",
+    "video_encoder/video_encoder.h",
+    "video_encoder/video_encoder_client.cc",
+    "video_encoder/video_encoder_client.h",
+  ]
+  deps = [
+    ":test_helpers",
+    "//media/gpu",
+    "//testing/gtest:gtest",
+  ]
+}
+
+static_library("video_encoder_test_environment") {
+  testonly = true
+  sources = [
+    "video_encoder/video_encoder_test_environment.cc",
+    "video_encoder/video_encoder_test_environment.h",
+  ]
+  data = [ "//media/test/data/" ]
+  deps = [
+    ":helpers",
+    "//media/gpu",
+  ]
+}
+
 if (use_vaapi || use_v4l2_codec) {
   static_library("image_processor") {
     testonly = true
diff --git a/media/gpu/test/bitstream_helpers.h b/media/gpu/test/bitstream_helpers.h
new file mode 100644
index 0000000..a00aa17b
--- /dev/null
+++ b/media/gpu/test/bitstream_helpers.h
@@ -0,0 +1,39 @@
+// Copyright 2020 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 MEDIA_GPU_TEST_BITSTREAM_HELPERS_H_
+#define MEDIA_GPU_TEST_BITSTREAM_HELPERS_H_
+
+namespace base {
+class UnsafeSharedMemoryRegion;
+}
+
+namespace media {
+
+struct BitstreamBufferMetadata;
+
+namespace test {
+
+// This class defines an abstract interface for classes that are interested in
+// processing bitstreams (e.g. BitstreamBufferValidator,...).
+class BitstreamProcessor {
+ public:
+  virtual ~BitstreamProcessor() = default;
+
+  // Process the specified bitstream buffer. This can e.g. validate the
+  // buffer's contents or calculate the buffer's checksum.
+  virtual void ProcessBitstreamBuffer(
+      int32_t bitstream_buffer_id,
+      const BitstreamBufferMetadata& metadata,
+      const base::UnsafeSharedMemoryRegion* shm) = 0;
+
+  // Wait until all currently scheduled bitstream buffers have been processed.
+  // Returns whether processing was successful.
+  virtual bool WaitUntilDone() = 0;
+};
+
+}  // namespace test
+}  // namespace media
+
+#endif  // MEDIA_GPU_TEST_BITSTREAM_HELPERS_H_
diff --git a/media/gpu/test/video_encoder/video_encoder.cc b/media/gpu/test/video_encoder/video_encoder.cc
new file mode 100644
index 0000000..144119e
--- /dev/null
+++ b/media/gpu/test/video_encoder/video_encoder.cc
@@ -0,0 +1,234 @@
+// Copyright 2020 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 "media/gpu/test/video_encoder/video_encoder.h"
+
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
+#include "media/gpu/macros.h"
+#include "media/gpu/test/video.h"
+#include "media/gpu/test/video_encoder/video_encoder_client.h"
+
+namespace media {
+namespace test {
+
+namespace {
+// Get the name of the specified video encoder |event|.
+const char* EventName(VideoEncoder::EncoderEvent event) {
+  switch (event) {
+    case VideoEncoder::EncoderEvent::kInitialized:
+      return "Initialized";
+    case VideoEncoder::EncoderEvent::kFrameReleased:
+      return "FrameReleased";
+    case VideoEncoder::EncoderEvent::kBitstreamReady:
+      return "BitstreamReady";
+    case VideoEncoder::EncoderEvent::kFlushing:
+      return "Flushing";
+    case VideoEncoder::EncoderEvent::kFlushDone:
+      return "FlushDone";
+    default:
+      return "Unknown";
+  }
+}
+
+// Default timeout used when waiting for events.
+constexpr base::TimeDelta kDefaultEventWaitTimeout =
+    base::TimeDelta::FromSeconds(30);
+
+// Default initial size used for |video_encoder_events_|.
+constexpr size_t kDefaultEventListSize = 512;
+
+}  // namespace
+
+// static
+std::unique_ptr<VideoEncoder> VideoEncoder::Create(
+    const VideoEncoderClientConfig& config,
+    std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors) {
+  auto video_encoder = base::WrapUnique(new VideoEncoder());
+  if (!video_encoder->CreateEncoderClient(config,
+                                          std::move(bitstream_processors))) {
+    return nullptr;
+  }
+  return video_encoder;
+}
+
+VideoEncoder::VideoEncoder()
+    : event_timeout_(kDefaultEventWaitTimeout),
+      video_encoder_event_counts_{},
+      next_unprocessed_event_(0) {
+  video_encoder_events_.reserve(kDefaultEventListSize);
+}
+
+VideoEncoder::~VideoEncoder() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DVLOGF(4);
+
+  encoder_client_.reset();
+}
+
+bool VideoEncoder::CreateEncoderClient(
+    const VideoEncoderClientConfig& config,
+    std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK_EQ(video_encoder_state_.load(), EncoderState::kUninitialized);
+  DVLOGF(4);
+
+  // base::Unretained is safe here as we will never receive callbacks after
+  // destroying the video encoder, since the video encoder client will be
+  // destroyed first.
+  EventCallback event_cb =
+      base::BindRepeating(&VideoEncoder::NotifyEvent, base::Unretained(this));
+
+  encoder_client_ = VideoEncoderClient::Create(
+      event_cb, std::move(bitstream_processors), config);
+  if (!encoder_client_) {
+    VLOGF(1) << "Failed to create video encoder client";
+    return false;
+  }
+
+  return true;
+}
+
+void VideoEncoder::SetEventWaitTimeout(base::TimeDelta timeout) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DVLOGF(4);
+
+  event_timeout_ = timeout;
+}
+
+bool VideoEncoder::Initialize(const Video* video) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(video_encoder_state_ == EncoderState::kUninitialized ||
+         video_encoder_state_ == EncoderState::kIdle);
+  DCHECK(video);
+  DVLOGF(4);
+
+  if (!encoder_client_->Initialize(video))
+    return false;
+
+  // Wait until the video encoder is initialized.
+  if (!WaitForEvent(EncoderEvent::kInitialized)) {
+    LOG(ERROR) << "Timeout while initializing video encode accelerator";
+    return false;
+  }
+
+  video_ = video;
+  video_encoder_state_ = EncoderState::kIdle;
+  return true;
+}
+
+void VideoEncoder::Encode() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK_EQ(video_encoder_state_.load(), EncoderState::kIdle);
+  DVLOGF(4);
+
+  // Encode until the end of the video.
+  EncodeUntil(EncoderEvent::kNumEvents, std::numeric_limits<size_t>::max());
+}
+
+void VideoEncoder::EncodeUntil(EncoderEvent event, size_t event_count) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK_EQ(video_encoder_state_.load(), EncoderState::kIdle);
+  DCHECK(video_);
+  DVLOGF(4);
+
+  // Start encoding the video.
+  encode_until_ = std::make_pair(event, event_count);
+  video_encoder_state_ = EncoderState::kEncoding;
+  encoder_client_->Encode();
+}
+
+void VideoEncoder::Flush() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DVLOGF(4);
+
+  encoder_client_->Flush();
+}
+
+VideoEncoder::EncoderState VideoEncoder::GetState() const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  return video_encoder_state_;
+}
+
+bool VideoEncoder::WaitForEvent(EncoderEvent event, size_t times) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DVLOGF(4) << "Event ID: " << EventName(event);
+
+  if (times == 0)
+    return true;
+
+  base::TimeDelta time_waiting;
+  base::AutoLock auto_lock(event_lock_);
+  while (true) {
+    // Go through the list of events since last wait, looking for the event
+    // we're interested in.
+    while (next_unprocessed_event_ < video_encoder_events_.size()) {
+      if (video_encoder_events_[next_unprocessed_event_++] == event) {
+        if (--times == 0)
+          return true;
+      }
+    }
+
+    // Check whether we've exceeded the maximum time we're allowed to wait.
+    if (time_waiting >= event_timeout_) {
+      LOG(ERROR) << "Timeout while waiting for '" << EventName(event)
+                 << "' event";
+      return false;
+    }
+
+    const base::TimeTicks start_time = base::TimeTicks::Now();
+    event_cv_.TimedWait(event_timeout_ - time_waiting);
+    time_waiting += base::TimeTicks::Now() - start_time;
+  }
+}
+
+bool VideoEncoder::WaitForFlushDone() {
+  return WaitForEvent(EncoderEvent::kFlushDone);
+}
+
+bool VideoEncoder::WaitForFrameReleased(size_t times) {
+  return WaitForEvent(EncoderEvent::kFrameReleased, times);
+}
+
+size_t VideoEncoder::GetEventCount(EncoderEvent event) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  base::AutoLock auto_lock(event_lock_);
+  return video_encoder_event_counts_[event];
+}
+
+bool VideoEncoder::WaitForBitstreamProcessors() {
+  return !encoder_client_ || encoder_client_->WaitForBitstreamProcessors();
+}
+
+size_t VideoEncoder::GetFlushDoneCount() const {
+  return GetEventCount(EncoderEvent::kFlushDone);
+}
+
+size_t VideoEncoder::GetFrameReleasedCount() const {
+  return GetEventCount(EncoderEvent::kFrameReleased);
+}
+
+bool VideoEncoder::NotifyEvent(EncoderEvent event) {
+  base::AutoLock auto_lock(event_lock_);
+  if (event == EncoderEvent::kFlushDone) {
+    video_encoder_state_ = EncoderState::kIdle;
+  }
+
+  video_encoder_events_.push_back(event);
+  video_encoder_event_counts_[event]++;
+  event_cv_.Signal();
+
+  // Check whether video encoding should be paused after this event.
+  if (encode_until_.first == event &&
+      encode_until_.second == video_encoder_event_counts_[event]) {
+    video_encoder_state_ = EncoderState::kIdle;
+    return false;
+  }
+  return true;
+}
+
+}  // namespace test
+}  // namespace media
diff --git a/media/gpu/test/video_encoder/video_encoder.h b/media/gpu/test/video_encoder/video_encoder.h
new file mode 100644
index 0000000..b4fc446
--- /dev/null
+++ b/media/gpu/test/video_encoder/video_encoder.h
@@ -0,0 +1,143 @@
+// Copyright 2020 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 MEDIA_GPU_TEST_VIDEO_ENCODER_VIDEO_ENCODER_H_
+#define MEDIA_GPU_TEST_VIDEO_ENCODER_VIDEO_ENCODER_H_
+
+#include <limits.h>
+#include <atomic>
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/sequence_checker.h"
+#include "base/synchronization/condition_variable.h"
+#include "base/synchronization/lock.h"
+#include "base/thread_annotations.h"
+
+namespace media {
+namespace test {
+
+class BitstreamProcessor;
+class Video;
+class VideoEncoderClient;
+struct VideoEncoderClientConfig;
+
+// This class provides a framework to build video encode accelerator tests upon.
+// It provides methods to control video encoding, and wait for specific events
+// to occur.
+class VideoEncoder {
+ public:
+  // Different video encoder states.
+  enum class EncoderState { kUninitialized = 0, kIdle, kEncoding };
+
+  // The list of events that can be thrown by the video encoder.
+  enum EncoderEvent {
+    kInitialized,
+    kFrameReleased,
+    kBitstreamReady,
+    kFlushing,
+    kFlushDone,
+    kNumEvents,
+  };
+
+  using EventCallback = base::RepeatingCallback<bool(EncoderEvent)>;
+
+  // Create an instance of the video encoder.
+  static std::unique_ptr<VideoEncoder> Create(
+      const VideoEncoderClientConfig& config,
+      std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors =
+          {});
+
+  // Disallow copy and assign.
+  VideoEncoder(const VideoEncoder&) = delete;
+  VideoEncoder& operator=(const VideoEncoder&) = delete;
+
+  ~VideoEncoder();
+
+  // Wait until all processors have finished processing the currently queued
+  // list of bitstream buffers. Returns whether processing was successful.
+  bool WaitForBitstreamProcessors();
+
+  // Set the maximum time we will wait for an event to finish.
+  void SetEventWaitTimeout(base::TimeDelta timeout);
+
+  // Initialize the video encoder for the specified |video|. The |video| will
+  // not be owned by the video encoder, the caller should guarantee it outlives
+  // the video encoder.
+  bool Initialize(const Video* video);
+  // Start encoding the video asynchronously.
+  void Encode();
+  // Encode the video asynchronously. Automatically pause encoding when the
+  // specified |event| occurred |event_count| times.
+  void EncodeUntil(EncoderEvent event, size_t event_count = 1);
+  // Flush the encoder.
+  void Flush();
+
+  // Get the current state of the video encoder.
+  EncoderState GetState() const;
+
+  // Wait for an event to occur the specified number of times. All events that
+  // occurred since last calling this function will be taken into account. All
+  // events with different types will be consumed. Will return false if the
+  // specified timeout is exceeded while waiting for the events.
+  bool WaitForEvent(EncoderEvent event, size_t times = 1);
+  // Helper function to wait for a FlushDone event.
+  bool WaitForFlushDone();
+  // Helper function to wait for the specified number of FrameReleased events.
+  bool WaitForFrameReleased(size_t times);
+
+  // Get the number of times the specified event occurred.
+  size_t GetEventCount(EncoderEvent event) const;
+  // Helper function to get the number of FlushDone events thrown.
+  size_t GetFlushDoneCount() const;
+  // Helper function to get the number of FrameReleased events thrown.
+  size_t GetFrameReleasedCount() const;
+
+ private:
+  VideoEncoder();
+
+  bool CreateEncoderClient(
+      const VideoEncoderClientConfig& config,
+      std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors);
+
+  // Notify the video encoder an event has occurred (e.g. bitstream ready).
+  // Returns whether the encoder client should continue encoding frames.
+  bool NotifyEvent(EncoderEvent event);
+
+  // The video currently being encoded.
+  const Video* video_ = nullptr;
+  // The state of the video encoder.
+  std::atomic<EncoderState> video_encoder_state_{EncoderState::kUninitialized};
+  // The video encoder client communicating between this class and the hardware
+  // video encode accelerator.
+  std::unique_ptr<VideoEncoderClient> encoder_client_;
+
+  // The timeout used when waiting for events.
+  base::TimeDelta event_timeout_;
+
+  mutable base::Lock event_lock_;
+  base::ConditionVariable event_cv_{&event_lock_};
+  // The list of events thrown by the video encoder client.
+  std::vector<EncoderEvent> video_encoder_events_ GUARDED_BY(event_lock_);
+  // The number of times each event has occurred.
+  size_t video_encoder_event_counts_[EncoderEvent::kNumEvents] GUARDED_BY(
+      event_lock_);
+  // The index of the next event to start at, when waiting for events.
+  size_t next_unprocessed_event_ GUARDED_BY(event_lock_);
+
+  // Automatically pause encoding once the video encoder has seen the specified
+  // number of events occur.
+  std::pair<EncoderEvent, size_t> encode_until_{
+      kNumEvents, std::numeric_limits<size_t>::max()};
+
+  SEQUENCE_CHECKER(sequence_checker_);
+};
+
+}  // namespace test
+}  // namespace media
+
+#endif  // MEDIA_GPU_TEST_VIDEO_ENCODER_VIDEO_ENCODER_H_
diff --git a/media/gpu/test/video_encoder/video_encoder_client.cc b/media/gpu/test/video_encoder/video_encoder_client.cc
new file mode 100644
index 0000000..1361b138
--- /dev/null
+++ b/media/gpu/test/video_encoder/video_encoder_client.cc
@@ -0,0 +1,351 @@
+// Copyright 2020 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 "media/gpu/test/video_encoder/video_encoder_client.h"
+
+#include <string>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
+#include "gpu/config/gpu_preferences.h"
+#include "media/gpu/gpu_video_encode_accelerator_factory.h"
+#include "media/gpu/macros.h"
+#include "media/gpu/test/bitstream_helpers.h"
+#include "media/gpu/test/video.h"
+#include "media/gpu/test/video_test_helpers.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace media {
+namespace test {
+
+namespace {
+
+// TODO(crbug.com/1045825): Check IsFlushSupported() before flushing encoder.
+// TODO(crbug.com/1045825): Support encoding parameter changes.
+
+// Callbacks can be called from any thread, but WeakPtrs are not thread-safe.
+// This helper thunk wraps a WeakPtr into an 'Optional' value, so the WeakPtr is
+// only dereferenced after rescheduling the task on the specified task runner.
+template <typename CallbackFunc, typename... CallbackArgs>
+void CallbackThunk(
+    base::Optional<base::WeakPtr<VideoEncoderClient>> encoder_client,
+    scoped_refptr<base::SequencedTaskRunner> task_runner,
+    CallbackFunc func,
+    CallbackArgs... args) {
+  DCHECK(encoder_client);
+  task_runner->PostTask(FROM_HERE,
+                        base::BindOnce(func, *encoder_client, args...));
+}
+}  // namespace
+
+VideoEncoderClient::VideoEncoderClient(
+    const VideoEncoder::EventCallback& event_cb,
+    std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors,
+    const VideoEncoderClientConfig& config)
+    : event_cb_(event_cb),
+      bitstream_processors_(std::move(bitstream_processors)),
+      encoder_client_config_(config),
+      encoder_client_thread_("VDAClientEncoderThread"),
+      encoder_client_state_(VideoEncoderClientState::kUninitialized) {
+  DETACH_FROM_SEQUENCE(encoder_client_sequence_checker_);
+
+  weak_this_ = weak_this_factory_.GetWeakPtr();
+}
+
+VideoEncoderClient::~VideoEncoderClient() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(test_sequence_checker_);
+
+  Destroy();
+
+  // Wait until the bitstream processors are done before destroying them. This
+  // needs to be done after destroying the encoder so no new bitstream buffers
+  // will be queued while waiting.
+  WaitForBitstreamProcessors();
+  bitstream_processors_.clear();
+}
+
+// static
+std::unique_ptr<VideoEncoderClient> VideoEncoderClient::Create(
+    const VideoEncoder::EventCallback& event_cb,
+    std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors,
+    const VideoEncoderClientConfig& config) {
+  return base::WrapUnique(new VideoEncoderClient(
+      event_cb, std::move(bitstream_processors), config));
+}
+
+bool VideoEncoderClient::Initialize(const Video* video) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(test_sequence_checker_);
+  DCHECK(video);
+
+  if (!encoder_client_thread_.Start()) {
+    VLOGF(1) << "Failed to start encoder thread";
+    return false;
+  }
+  encoder_client_task_runner_ = encoder_client_thread_.task_runner();
+
+  bool success = false;
+  base::WaitableEvent done;
+  encoder_client_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&VideoEncoderClient::CreateEncoderTask,
+                                weak_this_, video, &success, &done));
+  done.Wait();
+  return success;
+}
+
+void VideoEncoderClient::Destroy() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(test_sequence_checker_);
+
+  if (!encoder_client_thread_.IsRunning())
+    return;
+
+  base::WaitableEvent done;
+  encoder_client_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&VideoEncoderClient::DestroyEncoderTask,
+                                weak_this_, &done));
+  done.Wait();
+
+  encoder_client_thread_.Stop();
+}
+
+void VideoEncoderClient::Encode() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(test_sequence_checker_);
+
+  encoder_client_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&VideoEncoderClient::EncodeTask, weak_this_));
+}
+
+void VideoEncoderClient::Flush() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(test_sequence_checker_);
+
+  encoder_client_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&VideoEncoderClient::FlushTask, weak_this_));
+}
+
+bool VideoEncoderClient::WaitForBitstreamProcessors() {
+  bool success = true;
+  for (auto& bitstream_processor : bitstream_processors_)
+    success &= bitstream_processor->WaitUntilDone();
+  return success;
+}
+
+void VideoEncoderClient::RequireBitstreamBuffers(
+    unsigned int input_count,
+    const gfx::Size& input_coded_size,
+    size_t output_buffer_size) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_client_sequence_checker_);
+  ASSERT_EQ(encoder_client_state_, VideoEncoderClientState::kUninitialized);
+  ASSERT_EQ(bitstream_buffers_.size(), 0u);
+  ASSERT_GT(input_count, 0UL);
+  ASSERT_GT(output_buffer_size, 0UL);
+  DVLOGF(4);
+
+  // TODO(crbug.com/1045825): Add support for videos with a visible rectangle
+  // not starting at (0,0).
+  aligned_data_helper_ = std::make_unique<AlignedDataHelper>(
+      video_->Data(), video_->NumFrames(), video_->PixelFormat(),
+      gfx::Rect(video_->Resolution()), input_coded_size);
+
+  output_buffer_size_ = output_buffer_size;
+
+  // Create output buffers.
+  // TODO(dstaessens): Replace with hiroh@'s upcoming bitstream buffer manager.
+  for (unsigned int i = 0; i < input_count; ++i) {
+    auto shm = std::make_unique<base::UnsafeSharedMemoryRegion>();
+    *shm = base::UnsafeSharedMemoryRegion::Create(output_buffer_size_);
+    LOG_ASSERT(shm->IsValid());
+
+    BitstreamBuffer bitstream_buffer(
+        GetNextBitstreamBufferId(),
+        base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
+            shm->Duplicate()),
+        output_buffer_size_);
+
+    bitstream_buffers_.insert(
+        std::make_pair(bitstream_buffer.id(), std::move(shm)));
+
+    encoder_->UseOutputBitstreamBuffer(std::move(bitstream_buffer));
+  }
+
+  // Notify the test video encoder that initialization is now complete.
+  encoder_client_state_ = VideoEncoderClientState::kIdle;
+  FireEvent(VideoEncoder::EncoderEvent::kInitialized);
+}
+
+void VideoEncoderClient::BitstreamBufferReady(
+    int32_t bitstream_buffer_id,
+    const BitstreamBufferMetadata& metadata) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_client_sequence_checker_);
+
+  auto it = bitstream_buffers_.find(bitstream_buffer_id);
+  ASSERT_NE(it, bitstream_buffers_.end());
+
+  for (auto& bitstream_processor : bitstream_processors_) {
+    bitstream_processor->ProcessBitstreamBuffer(bitstream_buffer_id, metadata,
+                                                it->second.get());
+  }
+
+  // Notify the test an encoded bitstream buffer is ready. We should only do
+  // this after scheduling the bitstream to be processed, so calling
+  // WaitForBitstreamProcessors() after receiving this event will always
+  // guarantee the bitstream to be processed.
+  FireEvent(VideoEncoder::EncoderEvent::kBitstreamReady);
+
+  // Currently output buffers are returned immediately to the encoder.
+  // TODO(dstaessens): Add support for asynchronous bitstream buffer processing.
+  BitstreamBuffer bitstream_buffer(
+      bitstream_buffer_id,
+      base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
+          it->second->Duplicate()),
+      output_buffer_size_);
+  encoder_->UseOutputBitstreamBuffer(std::move(bitstream_buffer));
+}
+
+void VideoEncoderClient::NotifyError(VideoEncodeAccelerator::Error error) {}
+
+void VideoEncoderClient::NotifyEncoderInfoChange(const VideoEncoderInfo& info) {
+}
+
+void VideoEncoderClient::CreateEncoderTask(const Video* video,
+                                           bool* success,
+                                           base::WaitableEvent* done) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_client_sequence_checker_);
+  DCHECK_EQ(encoder_client_state_, VideoEncoderClientState::kUninitialized);
+  ASSERT_TRUE(!encoder_) << "Can't create encoder: already created";
+  ASSERT_TRUE(video);
+
+  video_ = video;
+
+  const VideoEncodeAccelerator::Config config(
+      video_->PixelFormat(), video_->Resolution(),
+      encoder_client_config_.output_profile, encoder_client_config_.bitrate,
+      encoder_client_config_.framerate);
+  encoder_ = GpuVideoEncodeAcceleratorFactory::CreateVEA(config, this,
+                                                         gpu::GpuPreferences());
+  *success = (encoder_ != nullptr);
+
+  // Initialization is continued once the encoder notifies us of the coded size
+  // in RequireBitstreamBuffers().
+  done->Signal();
+}
+
+void VideoEncoderClient::DestroyEncoderTask(base::WaitableEvent* done) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_client_sequence_checker_);
+  DCHECK_EQ(0u, num_outstanding_encode_requests_);
+  DVLOGF(4);
+
+  // Invalidate all scheduled tasks.
+  weak_this_factory_.InvalidateWeakPtrs();
+
+  // Destroy the encoder. This will destroy all video frames.
+  encoder_ = nullptr;
+
+  encoder_client_state_ = VideoEncoderClientState::kUninitialized;
+  done->Signal();
+}
+
+void VideoEncoderClient::EncodeTask() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_client_sequence_checker_);
+  ASSERT_EQ(encoder_client_state_, VideoEncoderClientState::kIdle);
+  DVLOGF(4);
+
+  // Start encoding the first frames. While in the encoding state new frames
+  // will automatically be fed to the encoder, when an input frame is returned
+  // to us in EncodeDoneTask().
+  encoder_client_state_ = VideoEncoderClientState::kEncoding;
+  for (size_t i = 0; i < encoder_client_config_.max_outstanding_encode_requests;
+       ++i) {
+    EncodeNextFrameTask();
+  }
+}
+
+void VideoEncoderClient::EncodeNextFrameTask() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_client_sequence_checker_);
+  DVLOGF(4);
+
+  // Stop encoding frames if we're no longer in the encoding state.
+  if (encoder_client_state_ != VideoEncoderClientState::kEncoding)
+    return;
+
+  // Flush immediately when we reached the end of the stream. This changes the
+  // state to kFlushing so further encode tasks will be aborted.
+  if (aligned_data_helper_->AtEndOfStream()) {
+    FlushTask();
+    return;
+  }
+
+  scoped_refptr<VideoFrame> video_frame = aligned_data_helper_->GetNextFrame();
+  video_frame->AddDestructionObserver(base::BindOnce(
+      CallbackThunk<decltype(&VideoEncoderClient::EncodeDoneTask),
+                    base::TimeDelta>,
+      weak_this_, encoder_client_task_runner_,
+      &VideoEncoderClient::EncodeDoneTask, video_frame->timestamp()));
+
+  // TODO(dstaessens): Add support for forcing key frames.
+  bool force_keyframe = false;
+  encoder_->Encode(video_frame, force_keyframe);
+
+  num_outstanding_encode_requests_++;
+}
+
+void VideoEncoderClient::FlushTask() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_client_sequence_checker_);
+  DVLOGF(4);
+
+  // Changing the state to flushing will abort any pending encodes.
+  encoder_client_state_ = VideoEncoderClientState::kFlushing;
+
+  auto flush_done_cb = base::BindOnce(
+      CallbackThunk<decltype(&VideoEncoderClient::FlushDoneTask), bool>,
+      weak_this_, encoder_client_task_runner_,
+      &VideoEncoderClient::FlushDoneTask);
+  encoder_->Flush(std::move(flush_done_cb));
+
+  FireEvent(VideoEncoder::EncoderEvent::kFlushing);
+}
+
+void VideoEncoderClient::EncodeDoneTask(base::TimeDelta timestamp) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_client_sequence_checker_);
+  DCHECK_NE(VideoEncoderClientState::kIdle, encoder_client_state_);
+  DVLOGF(4);
+
+  num_outstanding_encode_requests_--;
+
+  FireEvent(VideoEncoder::EncoderEvent::kFrameReleased);
+
+  // Queue the next frame to be encoded.
+  encoder_client_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&VideoEncoderClient::EncodeNextFrameTask, weak_this_));
+}
+
+void VideoEncoderClient::FlushDoneTask(bool success) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_client_sequence_checker_);
+  DCHECK_EQ(0u, num_outstanding_encode_requests_);
+  ASSERT_TRUE(success) << "Failed to flush encoder";
+
+  encoder_client_state_ = VideoEncoderClientState::kIdle;
+  FireEvent(VideoEncoder::EncoderEvent::kFlushDone);
+}
+
+void VideoEncoderClient::FireEvent(VideoEncoder::EncoderEvent event) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_client_sequence_checker_);
+
+  bool continue_encoding = event_cb_.Run(event);
+  if (!continue_encoding) {
+    // Changing the state to idle will abort any pending encodes.
+    encoder_client_state_ = VideoEncoderClientState::kIdle;
+  }
+}
+
+int32_t VideoEncoderClient::GetNextBitstreamBufferId() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_client_sequence_checker_);
+  // The bitstream buffer ID should always be positive, negative values are
+  // reserved for uninitialized buffers.
+  next_bitstream_buffer_id_ = (next_bitstream_buffer_id_ + 1) & 0x7FFFFFFF;
+  return next_bitstream_buffer_id_;
+}
+
+}  // namespace test
+}  // namespace media
diff --git a/media/gpu/test/video_encoder/video_encoder_client.h b/media/gpu/test/video_encoder/video_encoder_client.h
new file mode 100644
index 0000000..e360d74
--- /dev/null
+++ b/media/gpu/test/video_encoder/video_encoder_client.h
@@ -0,0 +1,189 @@
+// Copyright 2020 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 MEDIA_GPU_TEST_VIDEO_ENCODER_VIDEO_ENCODER_CLIENT_H_
+#define MEDIA_GPU_TEST_VIDEO_ENCODER_VIDEO_ENCODER_CLIENT_H_
+
+#include <stdint.h>
+
+#include <map>
+#include <memory>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/sequence_checker.h"
+#include "base/threading/thread.h"
+#include "media/gpu/test/bitstream_helpers.h"
+#include "media/gpu/test/video_encoder/video_encoder.h"
+#include "media/video/video_encode_accelerator.h"
+
+namespace gpu {
+class gpu_memory_buffer_factory;
+}
+
+namespace media {
+
+class Video;
+
+namespace test {
+
+class AlignedDataHelper;
+
+// Video encoder client configuration.
+// TODO(dstaessens): Add extra parameters (e.g. h264 output level)
+struct VideoEncoderClientConfig {
+  // The output output profile to be used.
+  VideoCodecProfile output_profile = VideoCodecProfile::H264PROFILE_MAIN;
+  // The maximum number of bitstream buffer encodes that can be requested
+  // without waiting for the result of the previous encodes requests.
+  size_t max_outstanding_encode_requests = 1;
+  // The desired bitrate in bits/second.
+  uint32_t bitrate = 64000;
+  // The desired framerate in frames/second.
+  uint32_t framerate = 30.0;
+};
+
+// The video encoder client is responsible for the communication between the
+// test video encoder and the video encoder. It also communicates with the
+// attached bitstream processors. The video encoder client can only have one
+// active encoder at any time. To encode a different stream the Destroy() and
+// Initialize() functions have to be called to destroy and re-create the
+// encoder.
+//
+// All communication with the encoder is done on the |encoder_client_thread_|,
+// so callbacks scheduled by the encoder can be executed asynchronously. This is
+// necessary in order not to interrupt the test flow.
+class VideoEncoderClient : public VideoEncodeAccelerator::Client {
+ public:
+  // Disallow copy and assign.
+  VideoEncoderClient(const VideoEncoderClient&) = delete;
+  VideoEncoderClient& operator=(const VideoEncoderClient&) = delete;
+
+  ~VideoEncoderClient() override;
+
+  // Return an instance of the VideoEncoderClient. The
+  // |gpu_memory_buffer_factory| will not be owned by the encoder client, the
+  // caller should guarantee it outlives the encoder client. The |event_cb| will
+  // be called whenever an event occurs (e.g. frame encoded) and should be
+  // thread-safe.
+  static std::unique_ptr<VideoEncoderClient> Create(
+      const VideoEncoder::EventCallback& event_cb,
+      std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors,
+      const VideoEncoderClientConfig& config);
+
+  // Initialize the video encode accelerator for the specified |video|.
+  // Initialization is performed asynchronous, upon completion a 'kInitialized'
+  // event will be sent to the test encoder.
+  bool Initialize(const Video* video);
+
+  // Start encoding the video stream, encoder should be idle when this function
+  // is called. This function is non-blocking, for each frame encoded a
+  // 'kFrameEncoded' event will be sent to the test encoder.
+  void Encode();
+  // Flush all scheduled encode tasks. This function is non-blocking, a
+  // kFlushing/kFlushDone event is sent upon start/finish. The kFlushDone
+  // event is always sent after all associated kFrameEncoded events.
+  void Flush();
+
+  // Wait until all bitstream processors have finished processing. Returns
+  // whether processing was successful.
+  bool WaitForBitstreamProcessors();
+
+  // VideoEncodeAccelerator::Client implementation
+  void RequireBitstreamBuffers(unsigned int input_count,
+                               const gfx::Size& input_coded_size,
+                               size_t output_buffer_size) override;
+  void BitstreamBufferReady(int32_t bitstream_buffer_id,
+                            const BitstreamBufferMetadata& metadata) override;
+  void NotifyError(VideoEncodeAccelerator::Error error) override;
+  void NotifyEncoderInfoChange(const VideoEncoderInfo& info) override;
+
+ private:
+  enum class VideoEncoderClientState {
+    kUninitialized = 0,
+    kIdle,
+    kEncoding,
+    kFlushing,
+  };
+
+  VideoEncoderClient(
+      const VideoEncoder::EventCallback& event_cb,
+      std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors,
+      const VideoEncoderClientConfig& config);
+
+  // Destroy the video encoder client.
+  void Destroy();
+
+  // Create a new video |encoder_| on the |encoder_client_thread_|.
+  void CreateEncoderTask(const Video* video,
+                         bool* success,
+                         base::WaitableEvent* done);
+  // Destroy the active video |encoder_| on the |encoder_client_thread_|.
+  void DestroyEncoderTask(base::WaitableEvent* done);
+
+  // Start encoding video stream buffers on the |encoder_client_thread_|.
+  void EncodeTask();
+  // Instruct the encoder to encode the next video frame on the
+  // |encoder_client_thread_|.
+  void EncodeNextFrameTask();
+  // Instruct the encoder to perform a flush on the |encoder_client_thread_|.
+  void FlushTask();
+
+  // Called by the encoder when a frame has been encoded.
+  void EncodeDoneTask(base::TimeDelta timestamp);
+  // Called by the encoder when flushing has completed.
+  void FlushDoneTask(bool success);
+
+  // Fire the specified event.
+  void FireEvent(VideoEncoder::EncoderEvent event);
+
+  // Get the next bitstream buffer id to be used.
+  int32_t GetNextBitstreamBufferId();
+
+  // The callback used to notify the test video encoder of events.
+  VideoEncoder::EventCallback event_cb_;
+  // The list of bitstream processors. All decoded bitstream buffers will be
+  // forwarded to the bitstream processors (e.g. verification of contents).
+  std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors_;
+
+  // The currently active video encode accelerator.
+  std::unique_ptr<media::VideoEncodeAccelerator> encoder_;
+  // The video encoder client configuration.
+  const VideoEncoderClientConfig encoder_client_config_;
+  // The thread used for all communication with the video encode accelerator.
+  base::Thread encoder_client_thread_;
+  // The task runner associated with the |encoder_client_thread_|;
+  scoped_refptr<base::SingleThreadTaskRunner> encoder_client_task_runner_;
+
+  // The current number of outgoing frame encode requests.
+  size_t num_outstanding_encode_requests_ = 0;
+  // Encoder client state, should only be accessed on the encoder client thread.
+  VideoEncoderClientState encoder_client_state_;
+
+  // The video being encoded, owned by the video encoder test environment.
+  const Video* video_ = nullptr;
+  // Helper used to align data and create frames from the raw video stream.
+  std::unique_ptr<media::test::AlignedDataHelper> aligned_data_helper_;
+
+  // Size of the output buffer requested by the encoder.
+  size_t output_buffer_size_ = 0u;
+  // Maps bitstream buffer Id's on the associated memory.
+  std::map<int32_t, std::unique_ptr<base::UnsafeSharedMemoryRegion>>
+      bitstream_buffers_;
+
+  // Id to be used for the the next bitstream buffer.
+  int32_t next_bitstream_buffer_id_ = 0;
+
+  SEQUENCE_CHECKER(test_sequence_checker_);
+  SEQUENCE_CHECKER(encoder_client_sequence_checker_);
+
+  base::WeakPtr<VideoEncoderClient> weak_this_;
+  base::WeakPtrFactory<VideoEncoderClient> weak_this_factory_{this};
+};
+
+}  // namespace test
+}  // namespace media
+
+#endif  // MEDIA_GPU_TEST_VIDEO_ENCODER_VIDEO_ENCODER_CLIENT_H_
diff --git a/media/gpu/test/video_encoder/video_encoder_test_environment.cc b/media/gpu/test/video_encoder/video_encoder_test_environment.cc
new file mode 100644
index 0000000..6a2d825b
--- /dev/null
+++ b/media/gpu/test/video_encoder/video_encoder_test_environment.cc
@@ -0,0 +1,58 @@
+// Copyright 2020 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 "media/gpu/test/video_encoder/video_encoder_test_environment.h"
+
+#include <utility>
+
+#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
+#include "media/gpu/test/video.h"
+
+namespace media {
+namespace test {
+
+// static
+VideoEncoderTestEnvironment* VideoEncoderTestEnvironment::Create(
+    const base::FilePath& video_path,
+    const base::FilePath& video_metadata_path,
+    const base::FilePath& output_folder) {
+  if (video_path.empty()) {
+    LOG(ERROR) << "No video specified";
+    return nullptr;
+  }
+  auto video =
+      std::make_unique<media::test::Video>(video_path, video_metadata_path);
+  if (!video->Load()) {
+    LOG(ERROR) << "Failed to load " << video_path;
+    return nullptr;
+  }
+
+  return new VideoEncoderTestEnvironment(std::move(video), output_folder);
+}
+
+VideoEncoderTestEnvironment::VideoEncoderTestEnvironment(
+    std::unique_ptr<media::test::Video> video,
+    const base::FilePath& output_folder)
+    : video_(std::move(video)),
+      output_folder_(output_folder),
+      gpu_memory_buffer_factory_(
+          gpu::GpuMemoryBufferFactory::CreateNativeType(nullptr)) {}
+
+VideoEncoderTestEnvironment::~VideoEncoderTestEnvironment() = default;
+
+const media::test::Video* VideoEncoderTestEnvironment::Video() const {
+  return video_.get();
+}
+
+const base::FilePath& VideoEncoderTestEnvironment::OutputFolder() const {
+  return output_folder_;
+}
+
+gpu::GpuMemoryBufferFactory*
+VideoEncoderTestEnvironment::GetGpuMemoryBufferFactory() const {
+  return gpu_memory_buffer_factory_.get();
+}
+
+}  // namespace test
+}  // namespace media
diff --git a/media/gpu/test/video_encoder/video_encoder_test_environment.h b/media/gpu/test/video_encoder/video_encoder_test_environment.h
new file mode 100644
index 0000000..cd8f176
--- /dev/null
+++ b/media/gpu/test/video_encoder/video_encoder_test_environment.h
@@ -0,0 +1,58 @@
+// Copyright 2020 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 MEDIA_GPU_TEST_VIDEO_ENCODER_VIDEO_ENCODER_TEST_ENVIRONMENT_H_
+#define MEDIA_GPU_TEST_VIDEO_ENCODER_VIDEO_ENCODER_TEST_ENVIRONMENT_H_
+
+#include <limits>
+#include <memory>
+
+#include "base/files/file_path.h"
+#include "media/gpu/test/video_test_environment.h"
+
+namespace gpu {
+class GpuMemoryBufferFactory;
+}
+
+namespace media {
+namespace test {
+
+class Video;
+
+// Test environment for video encoder tests. Performs setup and teardown once
+// for the entire test run.
+class VideoEncoderTestEnvironment : public VideoTestEnvironment {
+ public:
+  static VideoEncoderTestEnvironment* Create(
+      const base::FilePath& video_path,
+      const base::FilePath& video_metadata_path,
+      const base::FilePath& output_folder);
+  ~VideoEncoderTestEnvironment() override;
+
+  // Get the video the tests will be ran on.
+  const media::test::Video* Video() const;
+  // Get the output folder.
+  const base::FilePath& OutputFolder() const;
+
+  // Get the GpuMemoryBufferFactory for doing buffer allocations. This needs to
+  // survive as long as the process is alive just like in production which is
+  // why it's in here as there are threads that won't immediately die when an
+  // individual test is completed.
+  gpu::GpuMemoryBufferFactory* GetGpuMemoryBufferFactory() const;
+
+ private:
+  VideoEncoderTestEnvironment(std::unique_ptr<media::test::Video> video,
+                              const base::FilePath& output_folder);
+
+  // Video file to be used for testing.
+  const std::unique_ptr<media::test::Video> video_;
+  // Output folder to be used to store test artifacts (e.g. perf metrics).
+  const base::FilePath output_folder_;
+
+  std::unique_ptr<gpu::GpuMemoryBufferFactory> gpu_memory_buffer_factory_;
+};
+}  // namespace test
+}  // namespace media
+
+#endif  // MEDIA_GPU_TEST_VIDEO_ENCODER_VIDEO_ENCODER_TEST_ENVIRONMENT_H_
diff --git a/media/gpu/test/video_test_helpers.cc b/media/gpu/test/video_test_helpers.cc
index e1ca359..ff626bf 100644
--- a/media/gpu/test/video_test_helpers.cc
+++ b/media/gpu/test/video_test_helpers.cc
@@ -9,6 +9,7 @@
 #include "base/stl_util.h"
 #include "base/sys_byteorder.h"
 #include "media/base/video_decoder_config.h"
+#include "media/base/video_frame_layout.h"
 #include "media/video/h264_parser.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -247,5 +248,136 @@
   return false;
 }
 
+AlignedDataHelper::AlignedDataHelper(const std::vector<uint8_t>& stream,
+                                     uint32_t num_frames,
+                                     VideoPixelFormat pixel_format,
+                                     const gfx::Rect& visible_area,
+                                     const gfx::Size& coded_size)
+    : num_frames_(num_frames),
+      pixel_format_(pixel_format),
+      visible_area_(visible_area),
+      coded_size_(coded_size) {
+  // TODO(b/150257482): Rather than aligning the video stream data here, we
+  // could directly create a vector of aligned video frames.
+  CreateAlignedInputStream(stream);
+}
+
+AlignedDataHelper::~AlignedDataHelper() {}
+
+scoped_refptr<VideoFrame> AlignedDataHelper::GetNextFrame() {
+  size_t num_planes = VideoFrame::NumPlanes(pixel_format_);
+  CHECK_LE(num_planes, 3u);
+
+  uint8_t* frame_data[3] = {};
+  std::vector<ColorPlaneLayout> planes(num_planes);
+  size_t offset = data_pos_;
+
+  for (size_t i = 0; i < num_planes; i++) {
+    frame_data[i] = reinterpret_cast<uint8_t*>(&aligned_data_[0]) + offset;
+    planes[i].stride =
+        VideoFrame::RowBytes(i, pixel_format_, coded_size_.width());
+    planes[i].offset = offset;
+    planes[i].size = aligned_plane_size_[i];
+    offset += aligned_plane_size_[i];
+  }
+
+  auto layout = VideoFrameLayout::CreateWithPlanes(pixel_format_, coded_size_,
+                                                   std::move(planes));
+  if (!layout) {
+    LOG(ERROR) << "Failed to create VideoFrameLayout";
+    return nullptr;
+  }
+
+  // TODO(crbug.com/1045825): Investigate use of MOJO_SHARED_BUFFER, similar to
+  // changes made in crrev.com/c/2050895.
+  scoped_refptr<VideoFrame> video_frame =
+      VideoFrame::WrapExternalYuvDataWithLayout(
+          *layout, visible_area_, visible_area_.size(), frame_data[0],
+          frame_data[1], frame_data[2], base::TimeTicks::Now().since_origin());
+
+  data_pos_ += static_cast<off_t>(aligned_frame_size_);
+  DCHECK_LE(data_pos_, aligned_data_.size());
+
+  EXPECT_NE(nullptr, video_frame.get());
+  return video_frame;
+}
+
+void AlignedDataHelper::Rewind() {
+  data_pos_ = 0;
+}
+
+bool AlignedDataHelper::AtHeadOfStream() const {
+  return data_pos_ == 0;
+}
+
+bool AlignedDataHelper::AtEndOfStream() const {
+  return data_pos_ == aligned_data_.size();
+}
+
+void AlignedDataHelper::CreateAlignedInputStream(
+    const std::vector<uint8_t>& stream) {
+  ASSERT_NE(pixel_format_, PIXEL_FORMAT_UNKNOWN);
+  size_t num_planes = VideoFrame::NumPlanes(pixel_format_);
+  std::vector<size_t> coded_bpl(num_planes);
+  std::vector<size_t> visible_bpl(num_planes);
+  std::vector<size_t> visible_plane_rows(num_planes);
+
+  // Calculate padding in bytes to be added after each plane required to keep
+  // starting addresses of all planes at a byte boundary required by the
+  // platform. This padding will be added after each plane when copying to the
+  // temporary file.
+  // At the same time we also need to take into account coded_size requested by
+  // the VEA; each row of visible_bpl bytes in the original file needs to be
+  // copied into a row of coded_bpl bytes in the aligned file.
+  for (size_t i = 0; i < num_planes; i++) {
+    coded_bpl[i] = VideoFrame::RowBytes(i, pixel_format_, coded_size_.width());
+    visible_bpl[i] =
+        VideoFrame::RowBytes(i, pixel_format_, visible_area_.width());
+    visible_plane_rows[i] =
+        VideoFrame::Rows(i, pixel_format_, visible_area_.height());
+    size_t coded_area_size =
+        coded_bpl[i] * VideoFrame::Rows(i, pixel_format_, coded_size_.height());
+    const size_t aligned_size = AlignToPlatformRequirements(coded_area_size);
+    aligned_plane_size_.push_back(aligned_size);
+    aligned_frame_size_ += aligned_size;
+  }
+
+  // NOTE: VideoFrame::AllocationSize() cannot used here because the width and
+  // height on each plane is aligned by 2 for YUV format.
+  size_t frame_buffer_size = 0;
+  for (size_t i = 0; i < num_planes; ++i) {
+    size_t row_bytes =
+        VideoFrame::RowBytes(i, pixel_format_, visible_area_.width());
+    size_t rows = VideoFrame::Rows(i, pixel_format_, visible_area_.height());
+    frame_buffer_size += rows * row_bytes;
+  }
+
+  LOG_ASSERT(stream.size() % frame_buffer_size == 0U)
+      << "Stream byte size is not a product of calculated frame byte size";
+
+  LOG_ASSERT(aligned_frame_size_ > 0UL);
+  aligned_data_.resize(aligned_frame_size_ * num_frames_);
+
+  off_t src_offset = 0;
+  off_t dest_offset = 0;
+  for (size_t frame = 0; frame < num_frames_; frame++) {
+    const char* src_ptr = reinterpret_cast<const char*>(&stream[src_offset]);
+
+    for (size_t i = 0; i < num_planes; i++) {
+      // Assert that each plane of frame starts at required byte boundary.
+      ASSERT_EQ(0u, dest_offset & (kPlatformBufferAlignment - 1))
+          << "Planes of frame should be mapped per platform requirements";
+      char* dst_ptr = &aligned_data_[dest_offset];
+      for (size_t j = 0; j < visible_plane_rows[i]; j++) {
+        memcpy(dst_ptr, src_ptr, visible_bpl[i]);
+        src_ptr += visible_bpl[i];
+        dst_ptr += static_cast<off_t>(coded_bpl[i]);
+      }
+      dest_offset += aligned_plane_size_[i];
+    }
+    src_offset += static_cast<off_t>(frame_buffer_size);
+  }
+}
+
 }  // namespace test
 }  // namespace media
diff --git a/media/gpu/test/video_test_helpers.h b/media/gpu/test/video_test_helpers.h
index 5908510..b9d9253 100644
--- a/media/gpu/test/video_test_helpers.h
+++ b/media/gpu/test/video_test_helpers.h
@@ -18,6 +18,10 @@
 #include "build/build_config.h"
 #include "media/base/decoder_buffer.h"
 #include "media/base/video_codecs.h"
+#include "media/base/video_frame.h"
+#include "media/base/video_types.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/size.h"
 
 namespace media {
 namespace test {
@@ -66,6 +70,7 @@
   return ret;
 }
 
+// Helper to extract fragments from encoded video stream.
 class EncodedDataHelper {
  public:
   EncodedDataHelper(const std::vector<uint8_t>& stream,
@@ -155,6 +160,53 @@
   }
 };
 
+// Helper to align data and extract frames from raw video streams.
+// TODO(crbug.com/1045825): Reduces number of data copies performed.
+class AlignedDataHelper {
+ public:
+  AlignedDataHelper(const std::vector<uint8_t>& stream,
+                    uint32_t num_frames,
+                    VideoPixelFormat pixel_format,
+                    const gfx::Rect& visible_area,
+                    const gfx::Size& coded_size);
+  ~AlignedDataHelper();
+
+  // Compute and return the next frame to be sent to the encoder.
+  scoped_refptr<VideoFrame> GetNextFrame();
+
+  // Rewind to the position of the video stream.
+  void Rewind();
+  // Check whether we are at the start of the video stream.
+  bool AtHeadOfStream() const;
+  // Check whether we are at the end of the video stream.
+  bool AtEndOfStream() const;
+
+ private:
+  // Align the video stream to platform requirements.
+  void CreateAlignedInputStream(const std::vector<uint8_t>& stream);
+
+  // Current position in the video stream.
+  size_t data_pos_ = 0;
+  // The number of frames in the video stream.
+  uint32_t num_frames_ = 0;
+  // The video stream's pixel format.
+  VideoPixelFormat pixel_format_ = VideoPixelFormat::PIXEL_FORMAT_UNKNOWN;
+  // The video stream's visible area.
+  gfx::Rect visible_area_;
+  // The video's coded size, as requested by the encoder.
+  gfx::Size coded_size_;
+
+  // Aligned data, each plane is aligned to the specified platform alignment
+  // requirements.
+  std::vector<char, AlignedAllocator<char, kPlatformBufferAlignment>>
+      aligned_data_;
+  // Byte size of each frame in |aligned_data_|.
+  size_t aligned_frame_size_ = 0;
+  // Byte size for each aligned plane in a frame.
+  std::vector<size_t> aligned_plane_size_;
+};
+
 }  // namespace test
 }  // namespace media
+
 #endif  // MEDIA_GPU_TEST_VIDEO_TEST_HELPERS_H_
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
index 56f0f27..3d7dfca 100644
--- a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
@@ -10,6 +10,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/cpu.h"
 #include "base/files/scoped_file.h"
 #include "base/logging.h"
diff --git a/media/gpu/video_encode_accelerator_tests.cc b/media/gpu/video_encode_accelerator_tests.cc
new file mode 100644
index 0000000..272bb07
--- /dev/null
+++ b/media/gpu/video_encode_accelerator_tests.cc
@@ -0,0 +1,143 @@
+// Copyright 2020 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 <limits>
+
+#include "base/command_line.h"
+#include "base/files/file_path.h"
+#include "media/base/test_data_util.h"
+#include "media/gpu/test/video.h"
+#include "media/gpu/test/video_encoder/video_encoder.h"
+#include "media/gpu/test/video_encoder/video_encoder_client.h"
+#include "media/gpu/test/video_encoder/video_encoder_test_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace media {
+namespace test {
+
+namespace {
+
+// Video encoder tests usage message. Make sure to also update the documentation
+// under docs/media/gpu/video_encoder_test_usage.md when making changes here.
+// TODO(dstaessens): Add video_encoder_test_usage.md
+constexpr const char* usage_msg =
+    "usage: video_encode_accelerator_tests\n"
+    "           [-v=<level>] [--vmodule=<config>] [--gtest_help] [--help]\n"
+    "           [<video path>] [<video metadata path>]\n";
+
+// Video encoder tests help message.
+constexpr const char* help_msg =
+    "Run the video encoder accelerator tests on the video specified by\n"
+    "<video path>. If no <video path> is given the default\n"
+    "\"puppets-320x180.nv12.yuv\" video will be used.\n"
+    "\nThe <video metadata path> should specify the location of a json file\n"
+    "containing the video's metadata, such as frame checksums. By default\n"
+    "<video path>.json will be used.\n"
+    "\nThe following arguments are supported:\n"
+    "   -v                  enable verbose mode, e.g. -v=2.\n"
+    "  --vmodule            enable verbose mode for the specified module,\n"
+    "                       e.g. --vmodule=*media/gpu*=2.\n\n"
+    "  --gtest_help         display the gtest help and exit.\n"
+    "  --help               display this help and exit.\n";
+
+// Default video to be used if no test video was specified.
+constexpr base::FilePath::CharType kDefaultTestVideoPath[] =
+    FILE_PATH_LITERAL("puppets-320x180.nv12.yuv");
+
+media::test::VideoEncoderTestEnvironment* g_env;
+
+// Video encode test class. Performs setup and teardown for each single test.
+class VideoEncoderTest : public ::testing::Test {
+ public:
+  std::unique_ptr<VideoEncoder> CreateVideoEncoder(
+      const Video* video,
+      VideoEncoderClientConfig config = VideoEncoderClientConfig()) {
+    LOG_ASSERT(video);
+
+    auto video_encoder = VideoEncoder::Create(config);
+
+    LOG_ASSERT(video_encoder);
+    LOG_ASSERT(video_encoder->Initialize(video));
+
+    return video_encoder;
+  }
+};
+
+}  // namespace
+
+// TODO(dstaessens): Add more test scenarios:
+// - Vary framerate
+// - Vary bitrate
+// - Flush midstream
+// - Forcing key frames
+// - Add support for webm files
+
+// Encode video from start to end. Wait for the kFlushDone event at the end of
+// the stream, that notifies us all frames have been encoded.
+TEST_F(VideoEncoderTest, FlushAtEndOfStream) {
+  VideoEncoderClientConfig config = VideoEncoderClientConfig();
+  config.framerate = g_env->Video()->FrameRate();
+  auto encoder = CreateVideoEncoder(g_env->Video(), config);
+
+  encoder->Encode();
+  EXPECT_TRUE(encoder->WaitForFlushDone());
+
+  EXPECT_EQ(encoder->GetFlushDoneCount(), 1u);
+  EXPECT_EQ(encoder->GetFrameReleasedCount(), g_env->Video()->NumFrames());
+  EXPECT_TRUE(encoder->WaitForBitstreamProcessors());
+}
+
+}  // namespace test
+}  // namespace media
+
+int main(int argc, char** argv) {
+  // Set the default test data path.
+  media::test::Video::SetTestDataPath(media::GetTestDataPath());
+
+  // Print the help message if requested. This needs to be done before
+  // initializing gtest, to overwrite the default gtest help message.
+  base::CommandLine::Init(argc, argv);
+  const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
+  LOG_ASSERT(cmd_line);
+  if (cmd_line->HasSwitch("help")) {
+    std::cout << media::test::usage_msg << "\n" << media::test::help_msg;
+    return 0;
+  }
+
+  // Check if a video was specified on the command line.
+  base::CommandLine::StringVector args = cmd_line->GetArgs();
+  base::FilePath video_path =
+      (args.size() >= 1) ? base::FilePath(args[0])
+                         : base::FilePath(media::test::kDefaultTestVideoPath);
+  base::FilePath video_metadata_path =
+      (args.size() >= 2) ? base::FilePath(args[1]) : base::FilePath();
+
+  // Parse command line arguments.
+  base::CommandLine::SwitchMap switches = cmd_line->GetSwitches();
+  for (base::CommandLine::SwitchMap::const_iterator it = switches.begin();
+       it != switches.end(); ++it) {
+    if (it->first.find("gtest_") == 0 ||               // Handled by GoogleTest
+        it->first == "v" || it->first == "vmodule") {  // Handled by Chrome
+      continue;
+    }
+
+    std::cout << "unknown option: --" << it->first << "\n"
+              << media::test::usage_msg;
+    return EXIT_FAILURE;
+  }
+
+  testing::InitGoogleTest(&argc, argv);
+
+  // Set up our test environment.
+  media::test::VideoEncoderTestEnvironment* test_environment =
+      media::test::VideoEncoderTestEnvironment::Create(
+          video_path, video_metadata_path, base::FilePath());
+  if (!test_environment)
+    return EXIT_FAILURE;
+
+  media::test::g_env = static_cast<media::test::VideoEncoderTestEnvironment*>(
+      testing::AddGlobalTestEnvironment(test_environment));
+
+  return RUN_ALL_TESTS();
+}
diff --git a/media/gpu/windows/d3d11_video_decoder_unittest.cc b/media/gpu/windows/d3d11_video_decoder_unittest.cc
index 83ff6aba..4941e930 100644
--- a/media/gpu/windows/d3d11_video_decoder_unittest.cc
+++ b/media/gpu/windows/d3d11_video_decoder_unittest.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
diff --git a/media/mojo/mojom/video_frame_mojom_traits.cc b/media/mojo/mojom/video_frame_mojom_traits.cc
index 0bdd279..464be5d 100644
--- a/media/mojo/mojom/video_frame_mojom_traits.cc
+++ b/media/mojo/mojom/video_frame_mojom_traits.cc
@@ -7,6 +7,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "build/build_config.h"
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
diff --git a/media/mojo/mojom/video_frame_mojom_traits_unittest.cc b/media/mojo/mojom/video_frame_mojom_traits_unittest.cc
index 567673c..329fbcb7 100644
--- a/media/mojo/mojom/video_frame_mojom_traits_unittest.cc
+++ b/media/mojo/mojom/video_frame_mojom_traits_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "media/mojo/mojom/video_frame_mojom_traits.h"
 
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/test/task_environment.h"
diff --git a/media/mojo/services/mojo_audio_input_stream_unittest.cc b/media/mojo/services/mojo_audio_input_stream_unittest.cc
index 6a782ec..45f13d9 100644
--- a/media/mojo/services/mojo_audio_input_stream_unittest.cc
+++ b/media/mojo/services/mojo_audio_input_stream_unittest.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/read_only_shared_memory_region.h"
 #include "base/run_loop.h"
 #include "base/sync_socket.h"
diff --git a/media/mojo/services/mojo_audio_output_stream_unittest.cc b/media/mojo/services/mojo_audio_output_stream_unittest.cc
index be194c1c..b6d724f 100644
--- a/media/mojo/services/mojo_audio_output_stream_unittest.cc
+++ b/media/mojo/services/mojo_audio_output_stream_unittest.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/run_loop.h"
 #include "base/sync_socket.h"
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc b/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc
index ed9ff8c..6dd97f0f 100644
--- a/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc
+++ b/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "gpu/config/gpu_preferences.h"
diff --git a/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc b/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc
index 0c3040b..3e3aa03 100644
--- a/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc
+++ b/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc
@@ -6,6 +6,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/run_loop.h"
 #include "base/test/gtest_util.h"
diff --git a/mojo/public/cpp/bindings/lib/message.cc b/mojo/public/cpp/bindings/lib/message.cc
index 46b4d8b74..a3c4a180 100644
--- a/mojo/public/cpp/bindings/lib/message.cc
+++ b/mojo/public/cpp/bindings/lib/message.cc
@@ -15,6 +15,7 @@
 #include "base/bind.h"
 #include "base/lazy_instance.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/numerics/safe_math.h"
 #include "base/strings/stringprintf.h"
 #include "base/threading/sequence_local_storage_slot.h"
diff --git a/mojo/public/cpp/bindings/tests/idle_tracking_unittest.cc b/mojo/public/cpp/bindings/tests/idle_tracking_unittest.cc
index ed0935d..30a5b04 100644
--- a/mojo/public/cpp/bindings/tests/idle_tracking_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/idle_tracking_unittest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 3c206f2b..c75f0f3 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -4568,16 +4568,16 @@
 
   if (is_linux || is_mac || is_win || is_fuchsia) {
     deps += [
-      "//third_party/pywebsocket/",
+      "//third_party/pywebsocket3/",
       "//third_party/tlslite/",
     ]
     data_deps += [
-      "//third_party/pywebsocket/",
+      "//third_party/pywebsocket3/",
       "//third_party/tlslite/",
     ]
     data += [
       "tools/testserver/",
-      "//third_party/pywebsocket/src/mod_pywebsocket/",
+      "//third_party/pywebsocket3/src/mod_pywebsocket/",
       "//third_party/tlslite/",
     ]
   }
diff --git a/net/OWNERS b/net/OWNERS
index d38b5188..46e4d5e 100644
--- a/net/OWNERS
+++ b/net/OWNERS
@@ -13,8 +13,7 @@
 rsleevi@chromium.org
 zhongyi@chromium.org
 
-# For QUICHE rolls only.
-bnc@chromium.org
+file://net/quic/OWNERS # For QUICHE rolls only.
 
 per-file BUILD.gn=file://net/nqe/OWNERS
 per-file BUILD.gn=file://net/websockets/OWNERS
diff --git a/net/data/websocket/header-continuation_wsh.py b/net/data/websocket/header-continuation_wsh.py
index afd2051..67be0a7 100644
--- a/net/data/websocket/header-continuation_wsh.py
+++ b/net/data/websocket/header-continuation_wsh.py
@@ -7,12 +7,11 @@
 # It is used by test case WebSocketEndToEndTest.HeaderContinuations.
 
 from mod_pywebsocket import handshake
-from mod_pywebsocket.handshake.hybi import compute_accept
+from mod_pywebsocket.handshake.hybi import compute_accept_from_unicode
 
 
 def web_socket_do_extra_handshake(request):
-  accept = compute_accept(
-      request.headers_in['Sec-WebSocket-Key'].encode('UTF-8'))[0]
+  accept = compute_accept_from_unicode(request.headers_in['Sec-WebSocket-Key'])
   message = (b'HTTP/1.1 101 Switching Protocols\r\n'
              b'Upgrade: websocket\r\n'
              b'Connection: Upgrade\r\n'
diff --git a/net/data/websocket/trailing-whitespace_wsh.py b/net/data/websocket/trailing-whitespace_wsh.py
index 86e41a46..02543f4 100644
--- a/net/data/websocket/trailing-whitespace_wsh.py
+++ b/net/data/websocket/trailing-whitespace_wsh.py
@@ -7,12 +7,11 @@
 # It is used by test case WebSocketEndToEndTest.TrailingWhitespace.
 
 from mod_pywebsocket import handshake
-from mod_pywebsocket.handshake.hybi import compute_accept
+from mod_pywebsocket.handshake.hybi import compute_accept_from_unicode
 
 
 def web_socket_do_extra_handshake(request):
-  accept = compute_accept(
-      request.headers_in['Sec-WebSocket-Key'].encode('UTF-8'))[0]
+  accept = compute_accept_from_unicode(request.headers_in['Sec-WebSocket-Key'])
   message = (b'HTTP/1.1 101 Switching Protocols\r\n'
              b'Upgrade: websocket\r\n'
              b'Connection: Upgrade\r\n'
diff --git a/net/disk_cache/simple/simple_backend_impl.cc b/net/disk_cache/simple/simple_backend_impl.cc
index ecdd336..e5f0609 100644
--- a/net/disk_cache/simple/simple_backend_impl.cc
+++ b/net/disk_cache/simple/simple_backend_impl.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "net/disk_cache/simple/simple_backend_impl.h"
+#include "base/callback_helpers.h"
 #include "base/task/thread_pool.h"
 
 #include <algorithm>
@@ -47,8 +48,6 @@
 #include "net/disk_cache/simple/simple_util.h"
 #include "net/disk_cache/simple/simple_version_upgrade.h"
 
-using base::Callback;
-using base::Closure;
 using base::FilePath;
 using base::Time;
 using base::DirectoryExists;
diff --git a/net/disk_cache/simple/simple_backend_impl.h b/net/disk_cache/simple/simple_backend_impl.h
index e966c0f2f..8602ea2 100644
--- a/net/disk_cache/simple/simple_backend_impl.h
+++ b/net/disk_cache/simple/simple_backend_impl.h
@@ -150,9 +150,6 @@
 
   using EntryMap = std::unordered_map<uint64_t, SimpleEntryImpl*>;
 
-  using InitializeIndexCallback =
-      base::Callback<void(base::Time mtime, uint64_t max_size, int result)>;
-
   class ActiveEntryProxy;
   friend class ActiveEntryProxy;
 
@@ -276,9 +273,9 @@
 
   // The set of all entries which are currently being doomed. To avoid races,
   // these entries cannot have Doom/Create/Open operations run until the doom
-  // is complete. The base::Closure |SimplePostDoomWaiter::run_post_doom| field
-  // is used to store deferred operations to be run at the completion of the
-  // Doom.
+  // is complete. The base::OnceClosure |SimplePostDoomWaiter::run_post_doom|
+  // field is used to store deferred operations to be run at the completion of
+  // the Doom.
   scoped_refptr<SimplePostDoomWaiterTable> post_doom_waiting_;
 
   net::NetLog* const net_log_;
diff --git a/net/disk_cache/simple/simple_entry_impl.cc b/net/disk_cache/simple/simple_entry_impl.cc
index 6f814ce..e59b6073 100644
--- a/net/disk_cache/simple/simple_entry_impl.cc
+++ b/net/disk_cache/simple/simple_entry_impl.cc
@@ -121,7 +121,6 @@
 
 }  // namespace
 
-using base::Closure;
 using base::OnceClosure;
 using base::FilePath;
 using base::Time;
diff --git a/net/http/http_response_info.cc b/net/http/http_response_info.cc
index 22b30a542..0c31a13 100644
--- a/net/http/http_response_info.cc
+++ b/net/http/http_response_info.cc
@@ -161,6 +161,7 @@
     case CONNECTION_INFO_QUIC_T099:
     case CONNECTION_INFO_QUIC_999:
     case CONNECTION_INFO_QUIC_DRAFT_25:
+    case CONNECTION_INFO_QUIC_DRAFT_27:
       return CONNECTION_INFO_COARSE_QUIC;
 
     case CONNECTION_INFO_UNKNOWN:
@@ -495,6 +496,7 @@
     case CONNECTION_INFO_QUIC_T099:
     case CONNECTION_INFO_QUIC_999:
     case CONNECTION_INFO_QUIC_DRAFT_25:
+    case CONNECTION_INFO_QUIC_DRAFT_27:
       return true;
     case NUM_OF_CONNECTION_INFOS:
       NOTREACHED();
@@ -575,9 +577,10 @@
       return "h3-Q099";
     case CONNECTION_INFO_QUIC_DRAFT_25:
       return "h3-25";
+    case CONNECTION_INFO_QUIC_DRAFT_27:
+      return "h3-27";
     case CONNECTION_INFO_QUIC_T099:
-      return quic::AlpnForVersion(quic::ParsedQuicVersion(
-          quic::PROTOCOL_TLS1_3, quic::QUIC_VERSION_99));
+      return "h3-T099";
     case CONNECTION_INFO_HTTP0_9:
       return "http/0.9";
     case CONNECTION_INFO_HTTP1_0:
diff --git a/net/http/http_response_info.h b/net/http/http_response_info.h
index f6bdf50..445dd63 100644
--- a/net/http/http_response_info.h
+++ b/net/http/http_response_info.h
@@ -72,6 +72,7 @@
     CONNECTION_INFO_QUIC_T050 = 33,
     CONNECTION_INFO_QUIC_T099 = 34,
     CONNECTION_INFO_QUIC_DRAFT_25 = 35,
+    CONNECTION_INFO_QUIC_DRAFT_27 = 36,
     NUM_OF_CONNECTION_INFOS,
   };
 
diff --git a/net/http/http_server_properties_manager_unittest.cc b/net/http/http_server_properties_manager_unittest.cc
index 71303c4..ca7b3a2 100644
--- a/net/http/http_server_properties_manager_unittest.cc
+++ b/net/http/http_server_properties_manager_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/net/http/http_stream_factory_unittest.cc b/net/http/http_stream_factory_unittest.cc
index f4d3fda..ebf39bd 100644
--- a/net/http/http_stream_factory_unittest.cc
+++ b/net/http/http_stream_factory_unittest.cc
@@ -2328,11 +2328,22 @@
   HttpNetworkSession::Params params_;
 };
 
-INSTANTIATE_TEST_SUITE_P(
-    VersionIncludeStreamDependencySequence,
-    HttpStreamFactoryBidirectionalQuicTest,
-    ::testing::Combine(::testing::ValuesIn(quic::AllVersionsExcept99()),
-                       ::testing::Bool()));
+quic::ParsedQuicVersionVector TestVersions() {
+  quic::ParsedQuicVersionVector versions;
+  for (const quic::ParsedQuicVersion& version : quic::AllSupportedVersions()) {
+    if (version.HasIetfQuicFrames()) {
+      // TODO(crbug.com/1059073) test all versions.
+      continue;
+    }
+    versions.push_back(version);
+  }
+  return versions;
+}
+
+INSTANTIATE_TEST_SUITE_P(VersionIncludeStreamDependencySequence,
+                         HttpStreamFactoryBidirectionalQuicTest,
+                         ::testing::Combine(::testing::ValuesIn(TestVersions()),
+                                            ::testing::Bool()));
 
 TEST_P(HttpStreamFactoryBidirectionalQuicTest,
        RequestBidirectionalStreamImplQuicAlternative) {
@@ -3539,7 +3550,7 @@
       session_.get(), network_isolation_key, headers.get(), origin);
 
   quic::ParsedQuicVersionVector versions = {
-      {quic::PROTOCOL_TLS1_3, quic::QUIC_VERSION_99},
+      {quic::PROTOCOL_TLS1_3, quic::QUIC_VERSION_IETF_DRAFT_27},
       {quic::PROTOCOL_TLS1_3, quic::QUIC_VERSION_IETF_DRAFT_25},
       {quic::PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_50},
       {quic::PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_49},
diff --git a/net/log/file_net_log_observer.cc b/net/log/file_net_log_observer.cc
index 714e0eb..722f95af 100644
--- a/net/log/file_net_log_observer.cc
+++ b/net/log/file_net_log_observer.cc
@@ -15,6 +15,7 @@
 #include "base/files/file_util.h"
 #include "base/json/json_writer.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/numerics/clamped_math.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc b/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc
index 5d7f98f..4753d02 100644
--- a/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc
+++ b/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/task/post_task.h"
diff --git a/net/proxy_resolution/pac_file_fetcher_impl.cc b/net/proxy_resolution/pac_file_fetcher_impl.cc
index b566b8c6..cedd678 100644
--- a/net/proxy_resolution/pac_file_fetcher_impl.cc
+++ b/net/proxy_resolution/pac_file_fetcher_impl.cc
@@ -8,6 +8,7 @@
 #include "base/compiler_specific.h"
 #include "base/location.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
diff --git a/net/quic/OWNERS b/net/quic/OWNERS
index 9027f5a..9db36fa2 100644
--- a/net/quic/OWNERS
+++ b/net/quic/OWNERS
@@ -2,5 +2,6 @@
 nharper@chromium.org
 rch@chromium.org
 zhongyi@chromium.org
+bnc@chromium.org
 
 # COMPONENT: Internals>Network>QUIC
diff --git a/net/quic/bidirectional_stream_quic_impl_unittest.cc b/net/quic/bidirectional_stream_quic_impl_unittest.cc
index 5e8209b..5d0b64d 100644
--- a/net/quic/bidirectional_stream_quic_impl_unittest.cc
+++ b/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -809,7 +809,7 @@
   }
 
   std::string ConstructDataHeader(size_t body_len) {
-    if (version_.transport_version != quic::QUIC_VERSION_99) {
+    if (!version_.UsesHttp3()) {
       return "";
     }
     std::unique_ptr<char[]> buffer;
@@ -1065,7 +1065,7 @@
   AddWrite(ConstructRequestHeadersPacketInner(
       GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
       &spdy_request_headers_frame_length));
-  if (version_.transport_version != quic::QUIC_VERSION_99) {
+  if (!version_.UsesHttp3()) {
     AddWrite(
         ConstructClientDataPacket(kIncludeVersion, !kFin, kBody1 + kBody2));
   } else {
@@ -1081,7 +1081,7 @@
   std::string header3 = ConstructDataHeader(kBody3.length());
   std::string header4 = ConstructDataHeader(kBody4.length());
   std::string header5 = ConstructDataHeader(kBody5.length());
-  if (version_.transport_version != quic::QUIC_VERSION_99) {
+  if (!version_.UsesHttp3()) {
     AddWrite(ConstructClientDataPacket(!kIncludeVersion, kFin,
                                        kBody3 + kBody4 + kBody5));
   } else {
@@ -1206,7 +1206,7 @@
   client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
   const char kBody1[] = "here are some data";
   std::string header = ConstructDataHeader(strlen(kBody1));
-  if (version_.transport_version == quic::QUIC_VERSION_99) {
+  if (version_.UsesHttp3()) {
     AddWrite(ConstructRequestHeadersAndMultipleDataFramesPacket(
         !kFin, DEFAULT_PRIORITY, &spdy_request_headers_frame_length,
         {header, kBody1}));
@@ -1219,7 +1219,7 @@
   AddWrite(ConstructClientAckPacket(3, 1, 2));
   const char kBody2[] = "really small";
   std::string header2 = ConstructDataHeader(strlen(kBody2));
-  if (version_.transport_version == quic::QUIC_VERSION_99) {
+  if (version_.UsesHttp3()) {
     AddWrite(ConstructClientDataPacket(!kIncludeVersion, kFin,
                                        header2 + std::string(kBody2)));
   } else {
@@ -1330,7 +1330,7 @@
   std::string header = ConstructDataHeader(kBody1.length());
   std::string header2 = ConstructDataHeader(kBody2.length());
 
-  if (version_.transport_version == quic::QUIC_VERSION_99) {
+  if (version_.UsesHttp3()) {
     AddWrite(ConstructRequestHeadersAndMultipleDataFramesPacket(
         !kFin, DEFAULT_PRIORITY, &spdy_request_headers_frame_length,
         {header + kBody1 + header2 + kBody2}));
@@ -1348,7 +1348,7 @@
   std::string header3 = ConstructDataHeader(kBody3.length());
   std::string header4 = ConstructDataHeader(kBody4.length());
   std::string header5 = ConstructDataHeader(kBody5.length());
-  if (version_.transport_version == quic::QUIC_VERSION_99) {
+  if (version_.UsesHttp3()) {
     AddWrite(ConstructClientDataPacket(
         !kIncludeVersion, kFin,
         header3 + kBody3 + header4 + kBody4 + header5 + kBody5));
@@ -1554,7 +1554,7 @@
       GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
       &spdy_request_headers_frame_length));
   std::string header = ConstructDataHeader(strlen(kUploadData));
-  if (version_.transport_version == quic::QUIC_VERSION_99) {
+  if (version_.UsesHttp3()) {
     AddWrite(ConstructClientDataPacket(kIncludeVersion, kFin,
                                        header + std::string(kUploadData)));
   } else {
@@ -1654,7 +1654,7 @@
       GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
       &spdy_request_headers_frame_length));
   std::string header = ConstructDataHeader(strlen(kUploadData));
-  if (version_.transport_version == quic::QUIC_VERSION_99) {
+  if (version_.UsesHttp3()) {
     AddWrite(ConstructClientDataPacket(kIncludeVersion, kFin,
                                        header + std::string(kUploadData)));
   } else {
@@ -1756,7 +1756,7 @@
       &spdy_request_headers_frame_length));
 
   std::string header = ConstructDataHeader(strlen(kUploadData));
-  if (version_.transport_version != quic::QUIC_VERSION_99) {
+  if (!version_.UsesHttp3()) {
     AddWrite(ConstructAckAndDataPacket(++packet_number_, !kIncludeVersion, 2, 1,
                                        2, !kFin, kUploadData, &client_maker_));
     AddWrite(ConstructAckAndDataPacket(++packet_number_, !kIncludeVersion, 3, 3,
@@ -2364,7 +2364,7 @@
       GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
       &spdy_request_headers_frame_length));
   std::string header = ConstructDataHeader(strlen(kBody));
-  if (version_.transport_version == quic::QUIC_VERSION_99) {
+  if (version_.UsesHttp3()) {
     AddWrite(ConstructClientDataPacket(kIncludeVersion, kFin, header + kBody));
   } else {
     AddWrite(ConstructClientDataPacket(kIncludeVersion, kFin, kBody));
diff --git a/net/quic/platform/impl/quic_test_impl.cc b/net/quic/platform/impl/quic_test_impl.cc
index 073817d8..9feb757 100644
--- a/net/quic/platform/impl/quic_test_impl.cc
+++ b/net/quic/platform/impl/quic_test_impl.cc
@@ -28,16 +28,3 @@
   return path.MaybeAsASCII();
 }
 
-namespace quic {
-ParsedQuicVersionVector AllVersionsExcept99() {
-  ParsedQuicVersionVector result;
-  // TODO(dschinazi): Remove QUIC_VERSION_IETF_DRAFT_25 from below.
-  for (const ParsedQuicVersion& version : AllSupportedVersions()) {
-    if (version.transport_version != QUIC_VERSION_99 &&
-        version.transport_version != QUIC_VERSION_IETF_DRAFT_25) {
-      result.push_back(version);
-    }
-  }
-  return result;
-}
-}  // namespace quic
diff --git a/net/quic/platform/impl/quic_test_impl.h b/net/quic/platform/impl/quic_test_impl.h
index 8549f9070..98bc7b2 100644
--- a/net/quic/platform/impl/quic_test_impl.h
+++ b/net/quic/platform/impl/quic_test_impl.h
@@ -66,16 +66,6 @@
 
 std::string QuicGetTestMemoryCachePathImpl();
 
-namespace quic {
-// A utility function that returns all versions except v99.  Intended to be a
-// drop-in replacement for quic::AllSupportedVersion() when disabling v99 in a
-// large test file is required.
-//
-// TODO(vasilvv): all of the tests should be fixed for v99, so that this
-// function can be removed.
-ParsedQuicVersionVector AllVersionsExcept99();
-}  // namespace quic
-
 #if GTEST_HAS_DEATH_TEST && !defined(NDEBUG)
 #define EXPECT_QUIC_DEBUG_DEATH_IMPL(condition, message) \
   EXPECT_DEBUG_DEATH(condition, message)
diff --git a/net/quic/quic_chromium_client_stream.cc b/net/quic/quic_chromium_client_stream.cc
index a61c76e..01f0a1d 100644
--- a/net/quic/quic_chromium_client_stream.cc
+++ b/net/quic/quic_chromium_client_stream.cc
@@ -10,6 +10,7 @@
 #include "base/bind_helpers.h"
 #include "base/callback_helpers.h"
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/base/io_buffer.h"
 #include "net/base/net_errors.h"
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h
index 380e1bb1..6699d6f 100644
--- a/net/quic/quic_flags_list.h
+++ b/net/quic/quic_flags_list.h
@@ -255,17 +255,9 @@
 // If true, enable QUIC version T050.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_t050, true)
 
-// If true, enable QUIC version T099.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_t099, true)
-
 // A testonly reloadable flag that will always default to false.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_testonly_default_false, false)
 
-// If true, the QUIC dispatcher will drop INITIAL packets that are too small.
-QUIC_FLAG(bool,
-          FLAGS_quic_reloadable_flag_quic_drop_small_initial_packets,
-          true)
-
 // In BBR, slow pacing rate if it is likely causing overshoot.
 QUIC_FLAG(
     bool,
@@ -275,12 +267,6 @@
 // The default initial value of the max ack height filter's window length.
 QUIC_FLAG(int32_t, FLAGS_quic_bbr2_default_initial_ack_height_filter_window, 10)
 
-// If true, QUIC BBRv2 will always count the number of loss events in a round,
-// instead of just counting it in STARTUP.
-QUIC_FLAG(bool,
-          FLAGS_quic_reloadable_flag_quic_bbr2_always_count_loss_events,
-          true)
-
 // The default minimum number of loss marking events to exit PROBE_UP phase.
 QUIC_FLAG(double, FLAGS_quic_bbr2_default_probe_bw_full_loss_count, 2)
 
@@ -294,17 +280,6 @@
 // reordering.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_one_immediate_ack, true)
 
-// If true, instead of getting handshake state from sent packet manager, ask
-// session for current handshake state.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_use_get_handshake_state, true)
-
-// If true, in QuicPacketReader, replace the use of QuicSocketUtils by
-// equivalent QuicUdpSocketApi or QuicLinuxSocketUtils functions."
-QUIC_FLAG(
-    bool,
-    FLAGS_quic_restart_flag_quic_remove_quic_socket_utils_from_packet_reader,
-    true)
-
 // If true, QuicSentPacketManager::SetSendAlgorithm(CongestionControlType) will
 // become a no-op if the current and the requested cc_type are the same.
 QUIC_FLAG(
@@ -346,19 +321,22 @@
 // WallNow().
 QUIC_FLAG(bool,
           FLAGS_quic_reloadable_flag_quic_use_quic_time_for_received_timestamp2,
-          false)
+          true)
 
 // If true, enable QUIC version h3-25.
 QUIC_FLAG(bool,
           FLAGS_quic_reloadable_flag_quic_enable_version_draft_25_v3,
-          false)
+          true)
+
+// If true, enable QUIC version h3-27.
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_draft_27, true)
 
 // If true, fix QUIC bandwidth sampler to avoid over estimating bandwidth in
 // the presence of ack aggregation.
 QUIC_FLAG(
     bool,
     FLAGS_quic_reloadable_flag_quic_avoid_overestimate_bandwidth_with_aggregation,
-    false)
+    true)
 
 // If true, emit more granular errors instead of
 // SpdyFramerError::SPDY_DECOMPRESS_FAILURE in Http2DecoderAdapter.
diff --git a/net/quic/quic_http_stream.cc b/net/quic/quic_http_stream.cc
index 0dd599b..2107b89 100644
--- a/net/quic/quic_http_stream.cc
+++ b/net/quic/quic_http_stream.cc
@@ -108,10 +108,9 @@
     case quic::QUIC_VERSION_IETF_DRAFT_25:
       DCHECK(quic_version.handshake_protocol == quic::PROTOCOL_TLS1_3);
       return HttpResponseInfo::CONNECTION_INFO_QUIC_DRAFT_25;
-    case quic::QUIC_VERSION_99:
-      return quic_version.handshake_protocol == quic::PROTOCOL_TLS1_3
-                 ? HttpResponseInfo::CONNECTION_INFO_QUIC_T099
-                 : HttpResponseInfo::CONNECTION_INFO_QUIC_Q099;
+    case quic::QUIC_VERSION_IETF_DRAFT_27:
+      DCHECK(quic_version.handshake_protocol == quic::PROTOCOL_TLS1_3);
+      return HttpResponseInfo::CONNECTION_INFO_QUIC_DRAFT_27;
     case quic::QUIC_VERSION_RESERVED_FOR_NEGOTIATION:
       return HttpResponseInfo::CONNECTION_INFO_QUIC_999;
   }
diff --git a/net/socket/socks5_client_socket_unittest.cc b/net/socket/socks5_client_socket_unittest.cc
index 51e10310..8765731 100644
--- a/net/socket/socks5_client_socket_unittest.cc
+++ b/net/socket/socks5_client_socket_unittest.cc
@@ -11,6 +11,7 @@
 
 #include "base/containers/span.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "base/sys_byteorder.h"
 #include "build/build_config.h"
diff --git a/net/socket/transport_client_socket_pool.cc b/net/socket/transport_client_socket_pool.cc
index 67da4cd4..c7d64949 100644
--- a/net/socket/transport_client_socket_pool.cc
+++ b/net/socket/transport_client_socket_pool.cc
@@ -12,6 +12,7 @@
 #include "base/format_macros.h"
 #include "base/location.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
diff --git a/net/test/spawned_test_server/local_test_server.cc b/net/test/spawned_test_server/local_test_server.cc
index fca9136d..3f46015 100644
--- a/net/test/spawned_test_server/local_test_server.cc
+++ b/net/test/spawned_test_server/local_test_server.cc
@@ -177,7 +177,7 @@
 
   std::vector<base::FilePath> ret = {
       third_party_dir.AppendASCII("tlslite"),
-      third_party_dir.AppendASCII("pywebsocket").AppendASCII("src"),
+      third_party_dir.AppendASCII("pywebsocket3").AppendASCII("src"),
   };
 
   // Locate the Python code generated by the protocol buffers compiler.
diff --git a/net/tools/quic/quic_http_proxy_backend.cc b/net/tools/quic/quic_http_proxy_backend.cc
index fc4bf25..3223e6f 100644
--- a/net/tools/quic/quic_http_proxy_backend.cc
+++ b/net/tools/quic/quic_http_proxy_backend.cc
@@ -14,6 +14,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_pump_type.h"
 #include "build/build_config.h"
 #include "net/base/load_flags.h"
diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py
index 92727e9d..e90b1c1 100755
--- a/net/tools/testserver/testserver.py
+++ b/net/tools/testserver/testserver.py
@@ -42,7 +42,7 @@
 # Insert at the beginning of the path, we want to use our copies of the library
 # unconditionally (since they contain modifications from anything that might be
 # obtained from e.g. PyPi).
-sys.path.insert(0, os.path.join(ROOT_DIR, 'third_party', 'pywebsocket', 'src'))
+sys.path.insert(0, os.path.join(ROOT_DIR, 'third_party', 'pywebsocket3', 'src'))
 sys.path.insert(0, os.path.join(ROOT_DIR, 'third_party', 'tlslite'))
 
 import mod_pywebsocket.standalone
@@ -89,17 +89,15 @@
     self.websock_handlers_map_file = None
     self.cgi_directories = []
     self.is_executable_method = None
-    self.allow_draft75 = False
-    self.strict = True
 
     self.use_tls = False
     self.private_key = None
     self.certificate = None
     self.tls_client_auth = False
     self.tls_client_ca = None
-    self.tls_module = 'ssl'
     self.use_basic_auth = False
-    self.basic_auth_credential = 'Basic ' + base64.b64encode('test:test')
+    self.basic_auth_credential = 'Basic ' + base64.b64encode(
+        'test:test').decode()
 
 
 class RecordingSSLSessionCache(object):
diff --git a/net/tools/testserver/testserver.pydeps b/net/tools/testserver/testserver.pydeps
index ce20245..eb133f34 100644
--- a/net/tools/testserver/testserver.pydeps
+++ b/net/tools/testserver/testserver.pydeps
@@ -1,24 +1,22 @@
 # Generated by running:
 #   build/print_python_deps.py --root net/tools/testserver --output net/tools/testserver/testserver.pydeps --whitelist third_party/tlslite/tlslite/utils net/tools/testserver/testserver.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/__init__.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/_stream_base.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/_stream_hixie75.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/_stream_hybi.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/common.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/dispatch.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/extensions.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/handshake/__init__.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/handshake/_base.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/handshake/hybi.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/handshake/hybi00.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/http_header_util.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/memorizingfile.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/msgutil.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/mux.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/standalone.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/stream.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/util.py
-../../../third_party/pywebsocket/src/mod_pywebsocket/xhr_benchmark_handler.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/__init__.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/_stream_exceptions.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/common.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/dispatch.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/extensions.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/handshake/__init__.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/handshake/_base.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/handshake/hybi.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/http_header_util.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/memorizingfile.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/msgutil.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/request_handler.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/server_util.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/standalone.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/stream.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/util.py
+../../../third_party/pywebsocket3/src/mod_pywebsocket/websocket_server.py
 ../../../third_party/tlslite/tlslite/__init__.py
 ../../../third_party/tlslite/tlslite/api.py
 ../../../third_party/tlslite/tlslite/basedb.py
diff --git a/net/url_request/url_request_context_builder_unittest.cc b/net/url_request/url_request_context_builder_unittest.cc
index 93e72315..d1ab79b 100644
--- a/net/url_request/url_request_context_builder_unittest.cc
+++ b/net/url_request/url_request_context_builder_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "net/url_request/url_request_context_builder.h"
 
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "base/task/thread_pool.h"
 #include "build/build_config.h"
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index 622478f..fd0d2b3 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -7,6 +7,7 @@
 
 // This must be before Windows headers
 #include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "build/build_config.h"
 
 #if defined(OS_WIN)
diff --git a/net/websockets/websocket_stream_test.cc b/net/websockets/websocket_stream_test.cc
index 8a9cde5..f8ebd56 100644
--- a/net/websockets/websocket_stream_test.cc
+++ b/net/websockets/websocket_stream_test.cc
@@ -11,6 +11,7 @@
 
 #include "base/compiler_specific.h"
 #include "base/containers/span.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/histogram_samples.h"
 #include "base/metrics/statistics_recorder.h"
diff --git a/remoting/host/mac/permission_wizard.mm b/remoting/host/mac/permission_wizard.mm
index 60a043e..2a20559 100644
--- a/remoting/host/mac/permission_wizard.mm
+++ b/remoting/host/mac/permission_wizard.mm
@@ -7,6 +7,7 @@
 #import <Cocoa/Cocoa.h>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/memory/weak_ptr.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/sys_string_conversions.h"
diff --git a/remoting/signaling/ftl_message_reception_channel_unittest.cc b/remoting/signaling/ftl_message_reception_channel_unittest.cc
index 00353c0..34d281a 100644
--- a/remoting/signaling/ftl_message_reception_channel_unittest.cc
+++ b/remoting/signaling/ftl_message_reception_channel_unittest.cc
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/memory/weak_ptr.h"
 #include "base/run_loop.h"
diff --git a/services/audio/public/cpp/fake_system_info.cc b/services/audio/public/cpp/fake_system_info.cc
index e7a25e2..1d7184bb 100644
--- a/services/audio/public/cpp/fake_system_info.cc
+++ b/services/audio/public/cpp/fake_system_info.cc
@@ -5,6 +5,7 @@
 #include "services/audio/public/cpp/fake_system_info.h"
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "services/audio/service.h"
 
 namespace audio {
diff --git a/services/audio/public/cpp/output_device_unittest.cc b/services/audio/public/cpp/output_device_unittest.cc
index 605325b..877a6b74 100644
--- a/services/audio/public/cpp/output_device_unittest.cc
+++ b/services/audio/public/cpp/output_device_unittest.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "build/build_config.h"
diff --git a/services/audio/public/cpp/sounds/sounds_manager_unittest.cc b/services/audio/public/cpp/sounds/sounds_manager_unittest.cc
index 95ec58f..fb83e85 100644
--- a/services/audio/public/cpp/sounds/sounds_manager_unittest.cc
+++ b/services/audio/public/cpp/sounds/sounds_manager_unittest.cc
@@ -6,6 +6,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/run_loop.h"
diff --git a/services/data_decoder/public/cpp/decode_image.cc b/services/data_decoder/public/cpp/decode_image.cc
index fe18c258..b395086 100644
--- a/services/data_decoder/public/cpp/decode_image.cc
+++ b/services/data_decoder/public/cpp/decode_image.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/data_decoder/public/cpp/data_decoder.h"
 #include "third_party/skia/include/core/SkBitmap.h"
diff --git a/services/device/fingerprint/fingerprint_chromeos.cc b/services/device/fingerprint/fingerprint_chromeos.cc
index 8bf25ca2..c9b0f15 100644
--- a/services/device/fingerprint/fingerprint_chromeos.cc
+++ b/services/device/fingerprint/fingerprint_chromeos.cc
@@ -7,6 +7,8 @@
 #include <string.h>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "chromeos/dbus/biod/biod_client.h"
 #include "dbus/object_path.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/services/device/fingerprint/fingerprint_chromeos_unittest.cc b/services/device/fingerprint/fingerprint_chromeos_unittest.cc
index 23e49682..c3b1abd 100644
--- a/services/device/fingerprint/fingerprint_chromeos_unittest.cc
+++ b/services/device/fingerprint/fingerprint_chromeos_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "chromeos/dbus/biod/fake_biod_client.h"
diff --git a/services/device/generic_sensor/generic_sensor_service_unittest.cc b/services/device/generic_sensor/generic_sensor_service_unittest.cc
index 0829cac..5e670db 100644
--- a/services/device/generic_sensor/generic_sensor_service_unittest.cc
+++ b/services/device/generic_sensor/generic_sensor_service_unittest.cc
@@ -6,6 +6,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/test/scoped_feature_list.h"
 #include "mojo/public/cpp/bindings/receiver.h"
diff --git a/services/device/generic_sensor/platform_sensor_and_provider_unittest_win.cc b/services/device/generic_sensor/platform_sensor_and_provider_unittest_win.cc
index c671635..a0a51cfe 100644
--- a/services/device/generic_sensor/platform_sensor_and_provider_unittest_win.cc
+++ b/services/device/generic_sensor/platform_sensor_and_provider_unittest_win.cc
@@ -7,6 +7,7 @@
 #include <wrl/implements.h>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/metrics/statistics_recorder.h"
 #include "base/numerics/math_constants.h"
 #include "base/run_loop.h"
diff --git a/services/device/geolocation/public_ip_address_geolocator_unittest.cc b/services/device/geolocation/public_ip_address_geolocator_unittest.cc
index a53cef4..258ce53 100644
--- a/services/device/geolocation/public_ip_address_geolocator_unittest.cc
+++ b/services/device/geolocation/public_ip_address_geolocator_unittest.cc
@@ -5,6 +5,7 @@
 #include "services/device/geolocation/public_ip_address_geolocator.h"
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "base/strings/string_util.h"
 #include "base/test/task_environment.h"
diff --git a/services/device/hid/hid_service_linux.cc b/services/device/hid/hid_service_linux.cc
index 35b97a4..55c636fa 100644
--- a/services/device/hid/hid_service_linux.cc
+++ b/services/device/hid/hid_service_linux.cc
@@ -13,6 +13,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
diff --git a/services/device/public/cpp/test/scoped_geolocation_overrider.cc b/services/device/public/cpp/test/scoped_geolocation_overrider.cc
index 987c87e..624edbc 100644
--- a/services/device/public/cpp/test/scoped_geolocation_overrider.cc
+++ b/services/device/public/cpp/test/scoped_geolocation_overrider.cc
@@ -4,6 +4,7 @@
 
 #include <vector>
 
+#include "base/bind_helpers.h"
 #include "base/containers/unique_ptr_adapters.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
diff --git a/services/device/screen_orientation/screen_orientation_listener_android.cc b/services/device/screen_orientation/screen_orientation_listener_android.cc
index c3e2344..0b36405e 100644
--- a/services/device/screen_orientation/screen_orientation_listener_android.cc
+++ b/services/device/screen_orientation/screen_orientation_listener_android.cc
@@ -5,6 +5,7 @@
 #include "services/device/screen_orientation/screen_orientation_listener_android.h"
 
 #include "base/android/jni_android.h"
+#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop_current.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "services/device/screen_orientation/screen_orientation_jni_headers/ScreenOrientationListener_jni.h"
diff --git a/services/device/time_zone_monitor/time_zone_monitor_fuchsia.cc b/services/device/time_zone_monitor/time_zone_monitor_fuchsia.cc
index 4a7b6f8..fb508ea 100644
--- a/services/device/time_zone_monitor/time_zone_monitor_fuchsia.cc
+++ b/services/device/time_zone_monitor/time_zone_monitor_fuchsia.cc
@@ -10,6 +10,7 @@
 #include "base/fuchsia/fuchsia_logging.h"
 #include "base/fuchsia/intl_profile_watcher.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/string_piece.h"
 #include "third_party/icu/source/common/unicode/unistr.h"
 #include "third_party/icu/source/i18n/unicode/timezone.h"
diff --git a/services/device/usb/mojo/device_manager_impl.cc b/services/device/usb/mojo/device_manager_impl.cc
index b41fa6e..2c7b79af 100644
--- a/services/device/usb/mojo/device_manager_impl.cc
+++ b/services/device/usb/mojo/device_manager_impl.cc
@@ -12,6 +12,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/memory/ptr_util.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
 #include "services/device/public/cpp/usb/usb_utils.h"
diff --git a/services/device/usb/usb_device_linux.cc b/services/device/usb/usb_device_linux.cc
index 06f2262..070cdd5 100644
--- a/services/device/usb/usb_device_linux.cc
+++ b/services/device/usb/usb_device_linux.cc
@@ -10,6 +10,7 @@
 #include <algorithm>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/location.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/sequenced_task_runner.h"
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn
index 10d3554..02e7c9d 100644
--- a/services/network/BUILD.gn
+++ b/services/network/BUILD.gn
@@ -366,7 +366,7 @@
     data = [
       "//net/tools/testserver/",
       "//services/test/data",
-      "//third_party/pywebsocket/src/mod_pywebsocket/",
+      "//third_party/pywebsocket3/src/mod_pywebsocket/",
       "//third_party/tlslite/",
     ]
   }
diff --git a/services/network/dhcp_pac_file_fetcher_mojo_unittest.cc b/services/network/dhcp_pac_file_fetcher_mojo_unittest.cc
index bbf13ff..992e4d5e 100644
--- a/services/network/dhcp_pac_file_fetcher_mojo_unittest.cc
+++ b/services/network/dhcp_pac_file_fetcher_mojo_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "services/network/dhcp_pac_file_fetcher_mojo.h"
 
+#include "base/memory/ptr_util.h"
 #include "net/base/test_completion_callback.h"
 #include "net/proxy_resolution/mock_pac_file_fetcher.h"
 #include "net/test/gtest_util.h"
diff --git a/services/network/expect_ct_reporter_unittest.cc b/services/network/expect_ct_reporter_unittest.cc
index aca56de..452e8a9b 100644
--- a/services/network/expect_ct_reporter_unittest.cc
+++ b/services/network/expect_ct_reporter_unittest.cc
@@ -8,6 +8,7 @@
 
 #include "base/base64.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/json/json_reader.h"
 #include "base/run_loop.h"
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index 4f37aaed..7ce55da 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -15,6 +15,7 @@
 #include "base/containers/unique_ptr_adapters.h"
 #include "base/feature_list.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/message_loop/message_loop_current.h"
 #include "base/metrics/histogram_functions.h"
diff --git a/services/network/origin_policy/origin_policy_parser.cc b/services/network/origin_policy/origin_policy_parser.cc
index f00df11d..18b688a 100644
--- a/services/network/origin_policy/origin_policy_parser.cc
+++ b/services/network/origin_policy/origin_policy_parser.cc
@@ -35,6 +35,10 @@
   if (!json || !json->is_dict())
     return;
 
+  if (!ParseIds(*json)) {
+    return;
+  }
+
   if (base::Value* content_security = json->FindDictKey("content_security")) {
     ParseContentSecurity(*content_security);
   }
@@ -52,6 +56,23 @@
   }
 }
 
+bool OriginPolicyParser::ParseIds(const base::Value& json) {
+  const base::Value* raw_ids = json.FindListKey("ids");
+  if (!raw_ids) {
+    return false;
+  }
+  for (const auto& id : raw_ids->GetList()) {
+    if (id.is_string()) {
+      const std::string& id_string = id.GetString();
+      if (IsValidOriginPolicyId(id_string)) {
+        policy_contents_->ids.push_back(id_string);
+      }
+    }
+  }
+
+  return !policy_contents_->ids.empty();
+}
+
 void OriginPolicyParser::ParseContentSecurity(
     const base::Value& content_security) {
   const base::Value* policies = content_security.FindListKey("policies");
@@ -103,4 +124,11 @@
   policy_contents_->isolation_optin_hints = hints;
 }
 
+// https://wicg.github.io/origin-policy/#valid-origin-policy-id
+bool OriginPolicyParser::IsValidOriginPolicyId(const std::string& id) {
+  return !id.empty() && std::none_of(id.begin(), id.end(), [](char ch) {
+    return ch < 0x20 || ch > 0x7E;
+  });
+}
+
 }  // namespace network
diff --git a/services/network/origin_policy/origin_policy_parser.h b/services/network/origin_policy/origin_policy_parser.h
index 3e960210..6aa027b 100644
--- a/services/network/origin_policy/origin_policy_parser.h
+++ b/services/network/origin_policy/origin_policy_parser.h
@@ -31,10 +31,17 @@
 
   void DoParse(base::StringPiece);
 
+  // Only parsing IDs can cause a parsing failure (i.e. returning the empty
+  // policy from Parse()), so only it gets a bool return value. Failures parsing
+  // the others will just result in not filling out their piece of
+  // policy_contents_.
+  bool ParseIds(const base::Value&);
   void ParseContentSecurity(const base::Value&);
   void ParseFeatures(const base::Value&);
   void ParseIsolation(const base::Value&);
 
+  static bool IsValidOriginPolicyId(const std::string&);
+
   OriginPolicyContentsPtr policy_contents_;
 
   DISALLOW_COPY_AND_ASSIGN(OriginPolicyParser);
diff --git a/services/network/origin_policy/origin_policy_parser_unittest.cc b/services/network/origin_policy/origin_policy_parser_unittest.cc
index 6ec5c3d..a9284a2 100644
--- a/services/network/origin_policy/origin_policy_parser_unittest.cc
+++ b/services/network/origin_policy/origin_policy_parser_unittest.cc
@@ -20,6 +20,7 @@
     const network::OriginPolicyContentsPtr& policy_contents) {
   ASSERT_FALSE(policy_contents->feature_policy.has_value());
   ASSERT_FALSE(policy_contents->isolation_optin_hints.has_value());
+  ASSERT_EQ(0u, policy_contents->ids.size());
   ASSERT_EQ(0u, policy_contents->content_security_policies.size());
   ASSERT_EQ(0u, policy_contents->content_security_policies_report_only.size());
 }
@@ -49,17 +50,166 @@
   AssertEmptyPolicy(policy_contents);
 }
 
-TEST(OriginPolicyParser, ValidButEmpty) {
+TEST(OriginPolicyParser, EmptyObject) {
   auto policy_contents = OriginPolicyParser::Parse("{}");
   AssertEmptyPolicy(policy_contents);
 }
 
+TEST(OriginPolicyParser, ValidOtherFieldsButNoIDs) {
+  auto policy_contents = OriginPolicyParser::Parse(R"(
+      {
+        "content_security": {
+          "policies": ["script-src 'self' 'unsafe-inline'"],
+          "policies_report_only": ["script-src 'self' 'https://example.com/'"]
+        },
+        "features": {
+          "policy": "geolocation 'self' http://maps.google.com"
+        },
+        "isolation": true
+      }
+  )");
+
+  AssertEmptyPolicy(policy_contents);
+}
+
+TEST(OriginPolicyParser, ValidOtherFieldsButEmptyIDs) {
+  auto policy_contents = OriginPolicyParser::Parse(R"(
+      {
+        "ids": [],
+        "content_security": {
+          "policies": ["script-src 'self' 'unsafe-inline'"],
+          "policies_report_only": ["script-src 'self' 'https://example.com/'"]
+        },
+        "features": {
+          "policy": "geolocation 'self' http://maps.google.com"
+        },
+        "isolation": true
+      }
+  )");
+
+  AssertEmptyPolicy(policy_contents);
+}
+
+TEST(OriginPolicyParser, ValidOtherFieldsButEmptyIDsAfterNonemptyIDs) {
+  auto policy_contents = OriginPolicyParser::Parse(R"(
+      {
+        "ids": ["my-policy"],
+        "ids": [],
+        "content_security": {
+          "policies": ["script-src 'self' 'unsafe-inline'"],
+          "policies_report_only": ["script-src 'self' 'https://example.com/'"]
+        },
+        "features": {
+          "policy": "geolocation 'self' http://maps.google.com"
+        },
+        "isolation": true
+      }
+  )");
+
+  AssertEmptyPolicy(policy_contents);
+}
+
+TEST(OriginPolicyParser, ValidOtherFieldsButNonArrayID) {
+  auto policy_contents = OriginPolicyParser::Parse(R"(
+      {
+        "ids": "banana",
+        "content_security": {
+          "policies": ["script-src 'self' 'unsafe-inline'"],
+          "policies_report_only": ["script-src 'self' 'https://example.com/'"]
+        },
+        "features": {
+          "policy": "geolocation 'self' http://maps.google.com"
+        },
+        "isolation": true
+      }
+  )");
+
+  AssertEmptyPolicy(policy_contents);
+}
+
+TEST(OriginPolicyParser, MultipleIDs) {
+  auto policy_contents = OriginPolicyParser::Parse(R"(
+    {
+      "ids": ["my-policy-1", "my policy 2"]
+    }
+  )");
+
+  ASSERT_EQ(policy_contents->ids.size(), 2U);
+  ASSERT_EQ(policy_contents->ids[0], "my-policy-1");
+  ASSERT_EQ(policy_contents->ids[1], "my policy 2");
+}
+
+TEST(OriginPolicyParser, SkipNonStringIDs) {
+  auto policy_contents = OriginPolicyParser::Parse(R"(
+    {
+      "ids": [
+        "my-policy-1",
+        ["my-policy-array"],
+        5,
+        null,
+        { "id": "my-policy-object" },
+        "my-policy-2",
+        true
+      ]
+    }
+  )");
+
+  ASSERT_EQ(policy_contents->ids.size(), 2U);
+  ASSERT_EQ(policy_contents->ids[0], "my-policy-1");
+  ASSERT_EQ(policy_contents->ids[1], "my-policy-2");
+}
+
+TEST(OriginPolicyParser, IDsWithVariousCharacters) {
+  auto policy_contents = OriginPolicyParser::Parse(R"(
+    {
+      "ids": [
+        "~",
+        " ",
+        "\u0000",
+        "\t",
+        "my\tpolicy",
+        "!\"#$%&'()*+,-./:;<=>?@{|}~",
+        "my\u007Fpolicy",
+        "azAZ",
+        "my\u0080policy",
+        "my~policy",
+        "my\u1234policy"
+      ]
+    }
+  )");
+
+  ASSERT_EQ(policy_contents->ids.size(), 5U);
+  ASSERT_EQ(policy_contents->ids[0], "~");
+  ASSERT_EQ(policy_contents->ids[1], " ");
+  ASSERT_EQ(policy_contents->ids[2], "!\"#$%&'()*+,-./:;<=>?@{|}~");
+  ASSERT_EQ(policy_contents->ids[3], "azAZ");
+  ASSERT_EQ(policy_contents->ids[4], "my~policy");
+}
+
+TEST(OriginPolicyParser, SecondIDsWins) {
+  auto policy_contents = OriginPolicyParser::Parse(R"(
+    {
+      "ids": ["1", "2"],
+      "ids": ["3", "4", "5"]
+    }
+  )");
+
+  ASSERT_EQ(policy_contents->ids.size(), 3U);
+  ASSERT_EQ(policy_contents->ids[0], "3");
+  ASSERT_EQ(policy_contents->ids[1], "4");
+  ASSERT_EQ(policy_contents->ids[2], "5");
+}
+
 TEST(OriginPolicyParser, SimpleCSP) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "content_security": {
+      {
+        "ids": ["my-policy"],
+        "content_security": {
           "policies": ["script-src 'self' 'unsafe-inline'"]
-      } }
+        }
+      }
   )");
+
   ASSERT_EQ(policy_contents->content_security_policies.size(), 1U);
   ASSERT_EQ(policy_contents->content_security_policies[0],
             "script-src 'self' 'unsafe-inline'");
@@ -67,11 +217,15 @@
 
 TEST(OriginPolicyParser, CSPIncludingReportOnly) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "content_security": {
+      {
+        "ids": ["my-policy"],
+        "content_security": {
           "policies": ["script-src 'self' 'unsafe-inline'"],
           "policies_report_only": ["script-src 'self' 'https://example.com/'"]
-      } }
+        }
+      }
   )");
+
   ASSERT_EQ(policy_contents->content_security_policies.size(), 1U);
   ASSERT_EQ(policy_contents->content_security_policies_report_only.size(), 1U);
 
@@ -83,7 +237,9 @@
 
 TEST(OriginPolicyParser, CSPMultiItemArrays) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "content_security": {
+      {
+        "ids": ["my-policy"],
+        "content_security": {
           "policies": [
             "script-src 'self' 'unsafe-inline'",
             "frame-ancestors 'none'",
@@ -93,8 +249,10 @@
             "script-src 'self' 'https://example.com/'",
             "object-src 'none'"
           ]
-      } }
+        }
+      }
   )");
+
   ASSERT_EQ(policy_contents->content_security_policies.size(), 3U);
   ASSERT_EQ(policy_contents->content_security_policies_report_only.size(), 2U);
 
@@ -112,14 +270,18 @@
 
 TEST(OriginPolicyParser, CSPTwoContentSecurity) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "content_security": {
+      {
+        "ids": ["my-policy"],
+        "content_security": {
           "policies": ["frame-ancestors 'none'", "object-src 'none'"],
           "policies_report_only": ["script-src 'self' https://cdn.example.com/js/"]
-      }, "content_security": {
+        }, "content_security": {
           "policies": ["script-src 'self' 'unsafe-inline'"],
           "policies_report_only": ["script-src 'self' 'https://example.com/'"]
-      } }
+        }
+      }
   )");
+
   ASSERT_EQ(policy_contents->content_security_policies.size(), 1U);
   ASSERT_EQ(policy_contents->content_security_policies_report_only.size(), 1U);
 
@@ -131,13 +293,17 @@
 
 TEST(OriginPolicyParser, CSPTwoContentSecurityNoReportOnly) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "content_security": {
+      {
+        "ids": ["my-policy"],
+        "content_security": {
           "policies": ["script-src 'self' 'unsafe-inline'"]
-      },
-      "content_security": {
+        },
+        "content_security": {
           "policies": ["img-src 'none'"]
-      } }
+        }
+      }
   )");
+
   ASSERT_EQ(policy_contents->content_security_policies.size(), 1U);
   ASSERT_EQ(policy_contents->content_security_policies_report_only.size(), 0U);
 
@@ -146,13 +312,17 @@
 
 TEST(OriginPolicyParser, CSPTwoPolicies) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "content_security": {
+      {
+        "ids": ["my-policy"],
+        "content_security": {
           "policies": ["frame-ancestors 'none'", "object-src 'none'"],
           "policies": ["script-src 'self' 'unsafe-inline'"],
           "policies_report_only": ["script-src 'self' https://cdn.example.com/js/"],
           "policies_report_only": ["script-src 'self' 'https://example.com/'"]
-      } }
+        }
+      }
   )");
+
   ASSERT_EQ(policy_contents->content_security_policies.size(), 1U);
   ASSERT_EQ(policy_contents->content_security_policies_report_only.size(), 1U);
 
@@ -164,21 +334,29 @@
 
 TEST(OriginPolicyParser, CSPWithoutCSP) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "content_security": {
+      {
+        "ids": ["my-policy"],
+        "content_security": {
           "police": ["frame-ancestors 'none'", "object-src 'none'"]
-      } }
+        }
+      }
   )");
-  AssertEmptyPolicy(policy_contents);
+
+  ASSERT_EQ(policy_contents->content_security_policies.size(), 0U);
 }
 
 TEST(OriginPolicyParser, ExtraFieldsDontBreakParsing) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "content_security": {
+      {
+        "ids": ["my-policy"],
+        "content_security": {
           "policies": ["script-src 'self' 'unsafe-inline'"],
           "policies_report_only": ["script-src 'self' 'https://example.com/'"],
           "potatoes": "are best"
-      } }
+        }
+      }
   )");
+
   ASSERT_EQ(policy_contents->content_security_policies.size(), 1U);
   ASSERT_EQ(policy_contents->content_security_policies_report_only.size(), 1U);
 
@@ -193,10 +371,13 @@
 // though.
 TEST(OriginPolicyParser, CSPComma) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "content_security": {
+      {
+        "ids": ["my-policy"],
+        "content_security": {
           "policies": ["script-src 'self' 'unsafe-inline', script-src 'self' 'https://example.com/'"],
           "policies_report_only": ["script-src 'self' 'https://example.com/', frame-ancestors 'none', object-src 'none'"]
-      } }
+        }
+      }
   )");
 
   ASSERT_EQ(policy_contents->content_security_policies.size(), 1U);
@@ -213,10 +394,13 @@
 // Similarly, complete garbage will be passed through; this is expected.
 TEST(OriginPolicyParser, CSPGarbage) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "content_security": {
+      {
+        "ids": ["my-policy"],
+        "content_security": {
           "policies": ["potato potato potato"],
           "policies_report_only": ["tomato tomato tomato"]
-      } }
+        }
+      }
   )");
 
   ASSERT_EQ(policy_contents->content_security_policies.size(), 1U);
@@ -230,40 +414,58 @@
 
 TEST(OriginPolicyParser, CSPNonDict) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "content_security": "script-src 'self' 'unsafe-inline'"
+      {
+        "ids": ["my-policy"],
+        "content_security": "script-src 'self' 'unsafe-inline'"
       } )");
-  AssertEmptyPolicy(policy_contents);
+
+  ASSERT_EQ(policy_contents->content_security_policies.size(), 0U);
 }
 
 TEST(OriginPolicyParser, CSPNonArray) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "content_security": { "policies": "script-src 'self' 'unsafe-inline'" }
+      {
+        "ids": ["my-policy"],
+        "content_security": { "policies": "script-src 'self' 'unsafe-inline'" }
       } )");
-  AssertEmptyPolicy(policy_contents);
+
+  ASSERT_EQ(policy_contents->content_security_policies.size(), 0U);
 }
 
 TEST(OriginPolicyParser, CSPNonString) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "content_security": { "policies":
-        [["script-src 'self' 'unsafe-inline'"]]
-      } } )");
-  AssertEmptyPolicy(policy_contents);
+      {
+        "ids": ["my-policy"],
+        "content_security": {
+          "policies": [["script-src 'self' 'unsafe-inline'"]]
+        }
+      } )");
+
+  ASSERT_EQ(policy_contents->content_security_policies.size(), 0U);
 }
 
 TEST(OriginPolicyParser, FeatureOne) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "features": { "policy":
-        "geolocation 'self' http://maps.google.com"
-      } } )");
+      {
+        "ids": ["my-policy"],
+        "features": {
+          "policy": "geolocation 'self' http://maps.google.com"
+        }
+      } )");
+
   ASSERT_EQ("geolocation 'self' http://maps.google.com",
             policy_contents->feature_policy);
 }
 
 TEST(OriginPolicyParser, FeatureTwo) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "features": { "policy":
-        "geolocation 'self' http://maps.google.com; camera https://example.com"
-      } } )");
+      {
+        "ids": ["my-policy"],
+        "features": {
+          "policy": "geolocation 'self' http://maps.google.com; camera https://example.com"
+        }
+      } )");
+
   ASSERT_EQ(
       "geolocation 'self' http://maps.google.com; camera https://example.com",
       policy_contents->feature_policy);
@@ -271,8 +473,10 @@
 
 TEST(OriginPolicyParser, FeatureTwoFeatures) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "features": { "policy": "geolocation 'self' http://maps.google.com" },
-        "features": { "policy": "camera https://example.com"}
+      {
+        "ids": ["my-policy"],
+        "features": { "policy": "geolocation 'self' http://maps.google.com" },
+        "features": { "policy": "camera https://example.com" }
       } )");
 
   ASSERT_EQ("camera https://example.com", policy_contents->feature_policy);
@@ -280,9 +484,13 @@
 
 TEST(OriginPolicyParser, FeatureTwoPolicy) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "features": { "policy": "geolocation 'self' http://maps.google.com",
-                      "policy": "camera https://example.com"
-      } } )");
+      {
+        "ids": ["my-policy"],
+        "features": {
+          "policy": "geolocation 'self' http://maps.google.com",
+          "policy": "camera https://example.com"
+        }
+      } )");
 
   ASSERT_EQ("camera https://example.com", policy_contents->feature_policy);
 }
@@ -292,9 +500,12 @@
 // though.
 TEST(OriginPolicyParser, FeatureComma) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "features": { "policy":
-        "geolocation 'self' http://maps.google.com, camera https://example.com"
-      } } )");
+      {
+        "ids": ["my-policy"],
+        "features": {
+          "policy": "geolocation 'self' http://maps.google.com, camera https://example.com"
+        }
+      } )");
 
   ASSERT_EQ(
       "geolocation 'self' http://maps.google.com, camera https://example.com",
@@ -304,25 +515,36 @@
 // Similarly, complete garbage will be passed through; this is expected.
 TEST(OriginPolicyParser, FeatureGarbage) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "features": { "policy":
-        "Lorem ipsum! dolor sit amet"
-      } } )");
+      {
+        "ids": ["my-policy"],
+        "features": {
+          "policy": "Lorem ipsum! dolor sit amet"
+        }
+      } )");
 
   ASSERT_EQ("Lorem ipsum! dolor sit amet", policy_contents->feature_policy);
 }
 
 TEST(OriginPolicyParser, FeatureNonDict) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "features": "geolocation 'self' http://maps.google.com"
+      {
+        "ids": ["my-policy"],
+        "features": "geolocation 'self' http://maps.google.com"
       } )");
-  AssertEmptyPolicy(policy_contents);
+
+  ASSERT_FALSE(policy_contents->feature_policy.has_value());
 }
 
 TEST(OriginPolicyParser, FeatureNonString) {
   auto policy_contents = OriginPolicyParser::Parse(R"(
-      { "features": { "policy": ["geolocation 'self' http://maps.google.com"]
+      {
+        "ids": ["my-policy"],
+        "features": {
+          "policy": ["geolocation 'self' http://maps.google.com"]
+        }
       } )");
-  AssertEmptyPolicy(policy_contents);
+
+  ASSERT_FALSE(policy_contents->feature_policy.has_value());
 }
 
 namespace {
@@ -335,7 +557,8 @@
                                        hint_str.c_str());
   }
   std::string manifest_string =
-      base::StringPrintf("{ \"isolation\": { %s }}", hints_substr.c_str());
+      base::StringPrintf("{ \"ids\": [\"my-policy\"], \"isolation\": { %s }}",
+                         hints_substr.c_str());
   auto policy_contents = OriginPolicyParser::Parse(manifest_string);
 
   ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value());
@@ -350,15 +573,26 @@
 }  // namespace
 
 TEST(OriginPolicyParser, IsolationOptInNoIsolationKey) {
-  auto policy_contents = OriginPolicyParser::Parse(R"({})");
+  auto policy_contents =
+      OriginPolicyParser::Parse(R"({ "ids": ["my-policy"] })");
   ASSERT_FALSE(policy_contents->isolation_optin_hints.has_value());
 }
 
-TEST(OriginPolicyParser, IsolationOptInNoDict) {
-  auto policy_contents = OriginPolicyParser::Parse(R"({ "isolation": true })");
+TEST(OriginPolicyParser, IsolationOptInNoDictTrue) {
+  auto policy_contents = OriginPolicyParser::Parse(R"({
+    "ids": ["my-policy"],
+    "isolation": true
+  })");
   ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value());
   EXPECT_EQ(IsolationOptInHints::NO_HINTS,
             policy_contents->isolation_optin_hints.value());
+}
+
+TEST(OriginPolicyParser, IsolationOptInNoDictFalse) {
+  auto policy_contents = OriginPolicyParser::Parse(R"({
+    "ids": ["my-policy"],
+    "isolation": false
+  })");
 
   ASSERT_FALSE(OriginPolicyParser::Parse(R"({ "isolation": false })")
                    ->isolation_optin_hints.has_value());
@@ -391,9 +625,12 @@
 }
 
 TEST(OriginPolicyParser, IsolationOptInIgnoreUnrecognisedKeys) {
-  std::string manifest_string = R"( { "isolation": {
-    "prefer_isolated_event_loop": true,
-    "foo": true }
+  std::string manifest_string = R"( {
+    "ids": ["my-policy"],
+    "isolation": {
+      "prefer_isolated_event_loop": true,
+      "foo": true
+    }
   } )";
   auto policy_contents = OriginPolicyParser::Parse(manifest_string);
   ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value());
@@ -402,8 +639,10 @@
 }
 
 TEST(OriginPolicyParser, IsolationOptInIgnoreFalseValues) {
-  std::string manifest_string = R"( { "isolation": {
-    "prefer_isolated_event_loop": false
+  std::string manifest_string = R"( {
+    "ids": ["my-policy"],
+    "isolation": {
+      "prefer_isolated_event_loop": false
     }
   } )";
   auto policy_contents = OriginPolicyParser::Parse(manifest_string);
diff --git a/services/network/proxy_resolver_factory_mojo_unittest.cc b/services/network/proxy_resolver_factory_mojo_unittest.cc
index 56074444..c863ee06 100644
--- a/services/network/proxy_resolver_factory_mojo_unittest.cc
+++ b/services/network/proxy_resolver_factory_mojo_unittest.cc
@@ -12,6 +12,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/containers/queue.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
diff --git a/services/network/public/cpp/cross_thread_pending_shared_url_loader_factory.cc b/services/network/public/cpp/cross_thread_pending_shared_url_loader_factory.cc
index 87007de3..89f797c 100644
--- a/services/network/public/cpp/cross_thread_pending_shared_url_loader_factory.cc
+++ b/services/network/public/cpp/cross_thread_pending_shared_url_loader_factory.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/memory/ptr_util.h"
 #include "base/sequenced_task_runner.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/services/network/public/cpp/origin_policy.cc b/services/network/public/cpp/origin_policy.cc
index fd8481ce..4ecc285 100644
--- a/services/network/public/cpp/origin_policy.cc
+++ b/services/network/public/cpp/origin_policy.cc
@@ -23,11 +23,13 @@
     default;
 
 OriginPolicyContents::OriginPolicyContents(
+    const std::vector<std::string>& ids,
     const base::Optional<std::string>& feature_policy,
     const std::vector<std::string>& content_security_policies,
     const std::vector<std::string>& content_security_policies_report_only,
     const base::Optional<IsolationOptInHints>& isolation_optin_hints)
-    : feature_policy(feature_policy),
+    : ids(ids),
+      feature_policy(feature_policy),
       content_security_policies(content_security_policies),
       content_security_policies_report_only(
           content_security_policies_report_only),
@@ -37,7 +39,7 @@
     const OriginPolicyContents& other) = default;
 
 bool OriginPolicyContents::operator==(const OriginPolicyContents& other) const {
-  return feature_policy == other.feature_policy &&
+  return ids == other.ids && feature_policy == other.feature_policy &&
          content_security_policies == other.content_security_policies &&
          content_security_policies_report_only ==
              other.content_security_policies_report_only &&
diff --git a/services/network/public/cpp/origin_policy.h b/services/network/public/cpp/origin_policy.h
index 8e7c6b19..95c974f 100644
--- a/services/network/public/cpp/origin_policy.h
+++ b/services/network/public/cpp/origin_policy.h
@@ -45,6 +45,7 @@
   OriginPolicyContents();
   ~OriginPolicyContents();
   OriginPolicyContents(
+      const std::vector<std::string>& ids,
       const base::Optional<std::string>& feature_policy,
       const std::vector<std::string>& content_security_policies,
       const std::vector<std::string>& content_security_policies_report_only,
@@ -56,6 +57,18 @@
 
   OriginPolicyContentsPtr ClonePtr();
 
+  // The origin policy's IDs, which are compared with the requested ID values
+  // from the Origin-Policy HTTP header to determine whether this origin policy
+  // can apply or not. For more information see:
+  // - https://wicg.github.io/origin-policy/#origin-policy-ids
+  // - https://wicg.github.io/origin-policy/#manifest-ids
+  // - https://github.com/WICG/origin-policy/blob/master/version-negotiation.md
+  // - https://wicg.github.io/origin-policy/#examples
+  //
+  // By the time it is stored in this structure, the vector is guaranteed to be
+  // non-empty and to contain only valid origin policy IDs.
+  std::vector<std::string> ids;
+
   // The feature policy that is dictated by the origin policy, if any.
   // https://w3c.github.io/webappsec-feature-policy/
   // This is stored as a raw string, so it is not guaranteed to be an actual
diff --git a/services/network/udp_socket_unittest.cc b/services/network/udp_socket_unittest.cc
index d7a9f51..75f2ac9 100644
--- a/services/network/udp_socket_unittest.cc
+++ b/services/network/udp_socket_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "build/build_config.h"
diff --git a/services/tracing/perfetto/privacy_filtered_fields-inl.h b/services/tracing/perfetto/privacy_filtered_fields-inl.h
index 827056e..2c5713c 100644
--- a/services/tracing/perfetto/privacy_filtered_fields-inl.h
+++ b/services/tracing/perfetto/privacy_filtered_fields-inl.h
@@ -144,9 +144,27 @@
 constexpr MessageInfo kChromeHistogramSample = {kChromeHistogramSampleIndices,
                                                 nullptr};
 
+// Proto Message: ComponentInfo
+constexpr int kComponentInfoIndices[] = {1, 2, -1};
+constexpr MessageInfo kComponentInfo = {
+    kComponentInfoIndices,
+    nullptr};
+
+// Proto Message: ChromeLatencyInfo
+constexpr int kChromeLatencyInfoIndices[] = {1, 2, 3, 4, 5, -1};
+constexpr MessageInfo const* kChromeLatencyInfoComplexMessages[] = {
+    nullptr,
+    nullptr,
+    nullptr,
+    &kComponentInfo,
+    nullptr};
+constexpr MessageInfo kChromeLatencyInfo = {kChromeLatencyInfoIndices,
+                                            kChromeLatencyInfoComplexMessages};
+
 // Proto Message: TrackEvent
+// EDIT: Manually whitelisted: 29 (chrome_latency_info).
 constexpr int kTrackEventIndices[] = {1,  2,  3,  5,  6,  9,  10, 11,
-                                      16, 17, 24, 25, 27, 28, -1};
+                                      16, 17, 24, 25, 27, 28, 29, -1};
 constexpr MessageInfo const* kTrackEventComplexMessages[] = {
     nullptr,
     nullptr,
@@ -161,7 +179,8 @@
     &kChromeCompositorSchedulerState,
     &kChromeUserEvent,
     &kChromeLegacyIpc,
-    &kChromeHistogramSample};
+    &kChromeHistogramSample,
+    &kChromeLatencyInfo};
 constexpr MessageInfo kTrackEvent = {kTrackEventIndices,
                                      kTrackEventComplexMessages};
 
diff --git a/services/tracing/public/cpp/perfetto/perfetto_traced_process.cc b/services/tracing/public/cpp/perfetto/perfetto_traced_process.cc
index d9aded1..a8047b2 100644
--- a/services/tracing/public/cpp/perfetto/perfetto_traced_process.cc
+++ b/services/tracing/public/cpp/perfetto/perfetto_traced_process.cc
@@ -4,6 +4,7 @@
 
 #include "services/tracing/public/cpp/perfetto/perfetto_traced_process.h"
 
+#include "base/bind_helpers.h"
 #include "base/feature_list.h"
 #include "base/no_destructor.h"
 #include "base/run_loop.h"
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
index 3cd3af6..efb8bf6 100644
--- a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
+++ b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
@@ -16,6 +16,7 @@
 #include "base/command_line.h"
 #include "base/debug/leak_annotations.h"
 #include "base/json/json_writer.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/metrics/histogram_samples.h"
 #include "base/metrics/metrics_hashes.h"
diff --git a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
index 6e3e5fb..d4980cd 100644
--- a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
+++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
@@ -7,6 +7,7 @@
 #include <limits>
 #include <set>
 
+#include "base/bind_helpers.h"
 #include "base/debug/leak_annotations.h"
 #include "base/hash/hash.h"
 #include "base/memory/ptr_util.h"
diff --git a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc
index 137c8809..2c5e61bc 100644
--- a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc
+++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc
@@ -8,6 +8,7 @@
 
 #include "base/at_exit.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/json/json_reader.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/run_loop.h"
diff --git a/services/viz/privileged/mojom/gl/gpu_service.mojom b/services/viz/privileged/mojom/gl/gpu_service.mojom
index 4185b49..bce36eb 100644
--- a/services/viz/privileged/mojom/gl/gpu_service.mojom
+++ b/services/viz/privileged/mojom/gl/gpu_service.mojom
@@ -19,6 +19,7 @@
 import "gpu/ipc/common/device_perf_info.mojom";
 import "gpu/ipc/common/dx_diag_node.mojom";
 import "gpu/ipc/common/gpu_info.mojom";
+import "gpu/ipc/common/gpu_peak_memory.mojom";
 import "gpu/ipc/common/memory_stats.mojom";
 import "gpu/ipc/common/surface_handle.mojom";
 import "gpu/ipc/common/sync_token.mojom";
@@ -97,7 +98,9 @@
 
   // Ends tracking the peak GPU memory for the associated |sequence_num|.
   // Returning the value of the peak seen since StartPeakMemoryMonitorProcess.
-  GetPeakMemoryUsage(uint32 sequence_num) => (uint64 memory_usage);
+  GetPeakMemoryUsage(uint32 sequence_num) => (uint64 memory_usage,
+      map<gpu.mojom.GpuPeakMemoryAllocationSource, uint64>
+          memory_per_allocation_source);
 
   [EnableIf=is_win]
   RequestCompleteGpuInfo() => (gpu.mojom.DxDiagNode dx_diagnostics);
diff --git a/services/viz/public/cpp/gpu/gpu_unittest.cc b/services/viz/public/cpp/gpu/gpu_unittest.cc
index 0feed0f..a746b20 100644
--- a/services/viz/public/cpp/gpu/gpu_unittest.cc
+++ b/services/viz/public/cpp/gpu/gpu_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_pump_type.h"
 #include "base/run_loop.h"
 #include "base/synchronization/waitable_event.h"
diff --git a/storage/browser/blob/blob_data_builder.cc b/storage/browser/blob/blob_data_builder.cc
index c748dec..a429d7b 100644
--- a/storage/browser/blob/blob_data_builder.cc
+++ b/storage/browser/blob/blob_data_builder.cc
@@ -11,6 +11,7 @@
 #include <utility>
 
 #include "base/files/file.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/numerics/safe_math.h"
diff --git a/storage/browser/file_system/copy_or_move_operation_delegate.cc b/storage/browser/file_system/copy_or_move_operation_delegate.cc
index 66b09bd9..91e146d 100644
--- a/storage/browser/file_system/copy_or_move_operation_delegate.cc
+++ b/storage/browser/file_system/copy_or_move_operation_delegate.cc
@@ -11,6 +11,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "net/base/io_buffer.h"
diff --git a/storage/browser/file_system/file_system_context.cc b/storage/browser/file_system/file_system_context.cc
index 20236b3..84774d80 100644
--- a/storage/browser/file_system/file_system_context.cc
+++ b/storage/browser/file_system/file_system_context.cc
@@ -11,6 +11,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
diff --git a/storage/browser/file_system/file_system_operation_impl.cc b/storage/browser/file_system/file_system_operation_impl.cc
index 6496354..fa2d53b9 100644
--- a/storage/browser/file_system/file_system_operation_impl.cc
+++ b/storage/browser/file_system/file_system_operation_impl.cc
@@ -12,6 +12,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
diff --git a/storage/browser/file_system/obfuscated_file_util.cc b/storage/browser/file_system/obfuscated_file_util.cc
index 11cd552..17b5d9f 100644
--- a/storage/browser/file_system/obfuscated_file_util.cc
+++ b/storage/browser/file_system/obfuscated_file_util.cc
@@ -16,6 +16,7 @@
 #include "base/files/file_util.h"
 #include "base/format_macros.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
diff --git a/storage/browser/quota/client_usage_tracker.cc b/storage/browser/quota/client_usage_tracker.cc
index c94e8a8..fd812aa 100644
--- a/storage/browser/quota/client_usage_tracker.cc
+++ b/storage/browser/quota/client_usage_tracker.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
 #include "net/base/url_util.h"
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 9c421fec..9fa25373 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -4223,6 +4223,7 @@
                     "name": "EnableWithAdaptiveActivation",
                     "params": {
                         "availability": "any",
+                        "crowd_deny_hold_back_chance": "0.3",
                         "enable_adaptive_activation": "true",
                         "enable_crowd_deny_triggering": "true",
                         "event_trigger": "name:tabgroups_dummy;comparator:any;window:1;storage:1",
diff --git a/third_party/blink/common/feature_policy/document_policy.cc b/third_party/blink/common/feature_policy/document_policy.cc
index 96ae844..f5191e2 100644
--- a/third_party/blink/common/feature_policy/document_policy.cc
+++ b/third_party/blink/common/feature_policy/document_policy.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/public/common/feature_policy/document_policy.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
 #include "net/http/structured_headers.h"
 #include "third_party/blink/public/common/feature_policy/document_policy_features.h"
diff --git a/third_party/blink/common/loader/mime_sniffing_url_loader.cc b/third_party/blink/common/loader/mime_sniffing_url_loader.cc
index 944e217..d83bb7b 100644
--- a/third_party/blink/common/loader/mime_sniffing_url_loader.cc
+++ b/third_party/blink/common/loader/mime_sniffing_url_loader.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/public/common/loader/mime_sniffing_url_loader.h"
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "net/base/mime_sniffer.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
diff --git a/third_party/blink/common/loader/throttling_url_loader_unittest.cc b/third_party/blink/common/loader/throttling_url_loader_unittest.cc
index 0240330..2b36b03d 100644
--- a/third_party/blink/common/loader/throttling_url_loader_unittest.cc
+++ b/third_party/blink/common/loader/throttling_url_loader_unittest.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/task_environment.h"
diff --git a/third_party/blink/common/user_agent/user_agent_mojom_traits.cc b/third_party/blink/common/user_agent/user_agent_mojom_traits.cc
index 7110906..c7d695e 100644
--- a/third_party/blink/common/user_agent/user_agent_mojom_traits.cc
+++ b/third_party/blink/common/user_agent/user_agent_mojom_traits.cc
@@ -29,6 +29,10 @@
     return false;
   out->platform = string;
 
+  if (!data.ReadPlatformVersion(&string))
+    return false;
+  out->platform_version = string;
+
   if (!data.ReadArchitecture(&string))
     return false;
   out->architecture = string;
diff --git a/third_party/blink/public/common/user_agent/user_agent_metadata.h b/third_party/blink/public/common/user_agent/user_agent_metadata.h
index 476f931..2e0edda0 100644
--- a/third_party/blink/public/common/user_agent/user_agent_metadata.h
+++ b/third_party/blink/public/common/user_agent/user_agent_metadata.h
@@ -16,6 +16,7 @@
   std::string full_version;
   std::string major_version;
   std::string platform;
+  std::string platform_version;
   std::string architecture;
   std::string model;
   bool mobile = false;
diff --git a/third_party/blink/public/common/user_agent/user_agent_mojom_traits.h b/third_party/blink/public/common/user_agent/user_agent_mojom_traits.h
index ad8cafd..0a94c56 100644
--- a/third_party/blink/public/common/user_agent/user_agent_mojom_traits.h
+++ b/third_party/blink/public/common/user_agent/user_agent_mojom_traits.h
@@ -32,6 +32,10 @@
   static const std::string& platform(const ::blink::UserAgentMetadata& data) {
     return data.platform;
   }
+  static const std::string& platform_version(
+      const ::blink::UserAgentMetadata& data) {
+    return data.platform_version;
+  }
   static const std::string& architecture(
       const ::blink::UserAgentMetadata& data) {
     return data.architecture;
diff --git a/third_party/blink/public/mojom/user_agent/user_agent_metadata.mojom b/third_party/blink/public/mojom/user_agent/user_agent_metadata.mojom
index a7d4a22..32c3dcf 100644
--- a/third_party/blink/public/mojom/user_agent/user_agent_metadata.mojom
+++ b/third_party/blink/public/mojom/user_agent/user_agent_metadata.mojom
@@ -9,6 +9,7 @@
   string full_version;
   string major_version;
   string platform;
+  string platform_version;
   string architecture;
   string model;
   bool mobile;
diff --git a/third_party/blink/renderer/bindings/core/v8/BUILD.gn b/third_party/blink/renderer/bindings/core/v8/BUILD.gn
index 2aa350e..a51d875 100644
--- a/third_party/blink/renderer/bindings/core/v8/BUILD.gn
+++ b/third_party/blink/renderer/bindings/core/v8/BUILD.gn
@@ -112,6 +112,19 @@
   sources = generated_core_testing_dictionary_files +
             generated_core_testing_callback_function_files
 
+  testing_idl_interface_files =
+      webcore_testing_idl_files + generated_webcore_testing_idl_files +
+      webcore_testing_idl_with_modules_dependency_files
+  if (!use_v8_bind_gen_for_dictionary) {
+    testing_idl_interface_files += core_testing_dictionary_idl_files
+  }
+  sources += process_file_template(
+          testing_idl_interface_files,
+          [
+            "$bindings_core_v8_output_dir/v8_{{source_name_part}}.cc",
+            "$bindings_core_v8_output_dir/v8_{{source_name_part}}.h",
+          ])
+
   configs -= core_config_remove
   configs += core_config_add + [ "//third_party/blink/renderer:inside_blink" ] -
              [ "//third_party/blink/renderer/core:config" ]
diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.cc b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.cc
index aef07a0d..8aa7e32 100644
--- a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.cc
+++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.cc
@@ -264,6 +264,25 @@
       isolate, argument_index, value, exception_state);
 }
 
+DOMArrayBuffer* NativeValueTraits<IDLNullable<DOMArrayBuffer>>::NativeValue(
+    v8::Isolate* isolate,
+    v8::Local<v8::Value> value,
+    ExceptionState& exception_state) {
+  return NativeValueTraitsBufferSourcePtrNativeValue<
+      DOMArrayBuffer, V8ArrayBuffer, IDLBufferSourceTypeConvMode::kNullable>(
+      isolate, value, exception_state);
+}
+
+DOMArrayBuffer* NativeValueTraits<IDLNullable<DOMArrayBuffer>>::ArgumentValue(
+    v8::Isolate* isolate,
+    int argument_index,
+    v8::Local<v8::Value> value,
+    ExceptionState& exception_state) {
+  return NativeValueTraitsBufferSourcePtrArgumentValue<
+      DOMArrayBuffer, V8ArrayBuffer, IDLBufferSourceTypeConvMode::kNullable>(
+      isolate, argument_index, value, exception_state);
+}
+
 #define DEFINE_NATIVE_VALUE_TRAITS_BUFFER_SOURCE_TYPE_NOT_SHARED(T, V8T)    \
   template <>                                                               \
   CORE_EXPORT NotShared<T> NativeValueTraits<NotShared<T>>::NativeValue(    \
diff --git a/third_party/blink/renderer/bindings/core/v8/script_controller.cc b/third_party/blink/renderer/bindings/core/v8/script_controller.cc
index 9927b3f5..aa5720bd 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_controller.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_controller.cc
@@ -35,6 +35,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "third_party/blink/public/web/web_settings.h"
 #include "third_party/blink/renderer/bindings/core/v8/referrer_script_info.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_source_code.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc b/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc
index 6665790..6023c25e 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc
@@ -322,7 +322,10 @@
     return;
   }
 
-  if (response->MimeType() != "application/wasm") {
+  // The spec explicitly disallows any extras on the Content-Type header,
+  // so we check against ContentType() rather than MimeType(), which
+  // implicitly strips extras.
+  if (response->ContentType().LowerASCII() != "application/wasm") {
     exception_state.ThrowTypeError(
         "Incorrect response MIME type. Expected 'application/wasm'.");
     return;
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni
index 94cb282..f2a666d2 100644
--- a/third_party/blink/renderer/bindings/idl_in_core.gni
+++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -261,6 +261,8 @@
           "//third_party/blink/renderer/core/frame/navigator_language.idl",
           "//third_party/blink/renderer/core/frame/navigator_on_line.idl",
           "//third_party/blink/renderer/core/frame/navigator_scheduling.idl",
+          "//third_party/blink/renderer/core/frame/navigator_ua_brand_version.idl",
+          "//third_party/blink/renderer/core/frame/navigator_ua_data.idl",
           "//third_party/blink/renderer/core/frame/navigator_user_activation.idl",
           "//third_party/blink/renderer/core/frame/navigator_user_agent.idl",
           "//third_party/blink/renderer/core/frame/report.idl",
@@ -274,7 +276,7 @@
           "//third_party/blink/renderer/core/frame/scroll_to_options.idl",
           "//third_party/blink/renderer/core/frame/test_report_body.idl",
           "//third_party/blink/renderer/core/frame/user_activation.idl",
-          "//third_party/blink/renderer/core/frame/user_agent.idl",
+          "//third_party/blink/renderer/core/frame/ua_data_values.idl",
           "//third_party/blink/renderer/core/frame/visual_viewport.idl",
           "//third_party/blink/renderer/core/frame/window.idl",
           "//third_party/blink/renderer/core/frame/window_event_handlers.idl",
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index f35d5f86..58549df 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -314,19 +314,6 @@
     "timing/internals_profiler.cc",
     "timing/internals_profiler.h",
   ]
-
-  # Compile the sources produced by these IDL file lists.
-  testing_idl_files =
-      webcore_testing_idl_files + core_testing_dictionary_idl_files +
-      generated_webcore_testing_idl_files +
-      webcore_testing_idl_with_modules_dependency_files
-
-  sources += process_file_template(
-          testing_idl_files,
-          [
-            "$bindings_core_v8_output_dir/v8_{{source_name_part}}.cc",
-            "$bindings_core_v8_output_dir/v8_{{source_name_part}}.h",
-          ])
 }
 
 # core_bindings_generated ------------------------------------------------------
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc
index 0821853..03d3ee7 100644
--- a/third_party/blink/renderer/core/animation/animation.cc
+++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -261,7 +261,7 @@
          (EffectivePlaybackRate() > 0 && current_time >= EffectEnd());
 }
 
-Document* Animation::GetDocument() {
+Document* Animation::GetDocument() const {
   return document_;
 }
 
@@ -389,6 +389,10 @@
              : CalculateCurrentTime();
 }
 
+String Animation::playState() const {
+  return PlayStateString();
+}
+
 bool Animation::PreCommit(
     int compositor_group,
     const PaintArtifactCompositor* paint_artifact_compositor,
@@ -797,6 +801,10 @@
   NotifyProbe();
 }
 
+String Animation::PlayStateString() const {
+  return PlayStateString(CalculateAnimationPlayState());
+}
+
 const char* Animation::PlayStateString(AnimationPlayState play_state) {
   switch (play_state) {
     case kIdle:
diff --git a/third_party/blink/renderer/core/animation/animation.h b/third_party/blink/renderer/core/animation/animation.h
index 1dff25ee..99db170 100644
--- a/third_party/blink/renderer/core/animation/animation.h
+++ b/third_party/blink/renderer/core/animation/animation.h
@@ -147,16 +147,20 @@
   base::Optional<double> UnlimitedCurrentTime() const;
 
   // https://drafts.csswg.org/web-animations/#play-states
+  String PlayStateString() const;
   static const char* PlayStateString(AnimationPlayState);
   AnimationPlayState CalculateAnimationPlayState() const;
-  String playState() const {
-    return PlayStateString(CalculateAnimationPlayState());
-  }
+
+  // Do not call this method directly except via the v8 bindings. Depending on
+  // the type of animation a style flush is required to ensure that pending
+  // style changes that affect play state are resolved. Instead call
+  // PlayStateString directly.
+  virtual String playState() const;
 
   bool pending() const;
 
-  void pause(ExceptionState& = ASSERT_NO_EXCEPTION);
-  void play(ExceptionState& = ASSERT_NO_EXCEPTION);
+  virtual void pause(ExceptionState& = ASSERT_NO_EXCEPTION);
+  virtual void play(ExceptionState& = ASSERT_NO_EXCEPTION);
   void reverse(ExceptionState& = ASSERT_NO_EXCEPTION);
   void finish(ExceptionState& = ASSERT_NO_EXCEPTION);
   void updatePlaybackRate(double playback_rate,
@@ -189,7 +193,7 @@
   double playbackRate() const;
   void setPlaybackRate(double, ExceptionState& = ASSERT_NO_EXCEPTION);
   AnimationTimeline* timeline() { return timeline_; }
-  Document* GetDocument();
+  Document* GetDocument() const;
 
   double startTime(bool& is_null) const;
   base::Optional<double> startTime() const;
diff --git a/third_party/blink/renderer/core/animation/css/css_animation.cc b/third_party/blink/renderer/core/animation/css/css_animation.cc
index 62de5d5..7e888e16 100644
--- a/third_party/blink/renderer/core/animation/css/css_animation.cc
+++ b/third_party/blink/renderer/core/animation/css/css_animation.cc
@@ -4,6 +4,9 @@
 
 #include "third_party/blink/renderer/core/animation/css/css_animation.h"
 
+#include "third_party/blink/renderer/core/animation/animation.h"
+#include "third_party/blink/renderer/core/dom/document.h"
+
 namespace blink {
 
 CSSAnimation::CSSAnimation(ExecutionContext* execution_context,
@@ -11,6 +14,23 @@
                            AnimationEffect* content,
                            const String& animation_name)
     : Animation(execution_context, timeline, content),
-      animation_name_(animation_name) {}
+      animation_name_(animation_name),
+      sticky_play_state_(Animation::kUnset) {}
+
+String CSSAnimation::playState() const {
+  if (GetDocument())
+    GetDocument()->UpdateStyleAndLayoutTree();
+  return Animation::playState();
+}
+
+void CSSAnimation::pause(ExceptionState& exception_state) {
+  sticky_play_state_ = kPaused;
+  Animation::pause(exception_state);
+}
+
+void CSSAnimation::play(ExceptionState& exception_state) {
+  sticky_play_state_ = kRunning;
+  Animation::play(exception_state);
+}
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/animation/css/css_animation.h b/third_party/blink/renderer/core/animation/css/css_animation.h
index 480ee97..e7a1c73 100644
--- a/third_party/blink/renderer/core/animation/css/css_animation.h
+++ b/third_party/blink/renderer/core/animation/css/css_animation.h
@@ -24,8 +24,35 @@
 
   const String& animationName() const { return animation_name_; }
 
+  // Animation overrides.
+  // Various operations may affect the computed values of properties on
+  // elements. User agents may, as an optimization, defer recomputing these
+  // values until it becomes necessary; however, all operations included in the
+  // programming interfaces defined in the web-animations and css-animations
+  // specifications, must produce a result consistent with having fully
+  // processed any such pending changes to computed values.  Notably, changes
+  // to animation-play-state and display:none must update the play state.
+  // https://drafts.csswg.org/css-animations-2/#requirements-on-pending-style-changes
+  String playState() const override;
+
+  // Explicit calls to the web-animation API that update the play state are
+  // conditionally sticky and override the animation-play-state style.
+  void pause(ExceptionState& = ASSERT_NO_EXCEPTION) override;
+  void play(ExceptionState& = ASSERT_NO_EXCEPTION) override;
+
+  // When set, the override takes precedence over animation-play-state.
+  // https://drafts.csswg.org/css-animations-2/#interaction-between-animation-play-state-and-web-animations-API
+  AnimationPlayState getWebAnimationOverriddenPlayState() {
+    return sticky_play_state_;
+  }
+  void ResetWebAnimationOverriddenPlayState() { sticky_play_state_ = kUnset; }
+
  private:
   String animation_name_;
+
+  // When set, the web-animation API is overruling the animation-play-state
+  // style.
+  AnimationPlayState sticky_play_state_;
 };
 
 template <>
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.cc b/third_party/blink/renderer/core/animation/css/css_animations.cc
index 8f4982a..71139bb 100644
--- a/third_party/blink/renderer/core/animation/css/css_animations.cc
+++ b/third_party/blink/renderer/core/animation/css/css_animations.cc
@@ -388,12 +388,30 @@
       if (existing_animation) {
         cancel_running_animation_flags[existing_animation_index] = false;
 
-        Animation* animation = existing_animation->animation.Get();
+        CSSAnimation* animation =
+            DynamicTo<CSSAnimation>(existing_animation->animation.Get());
 
         const bool was_paused =
             CSSTimingData::GetRepeated(existing_animation->play_state_list,
                                        i) == EAnimPlayState::kPaused;
 
+        // Explicit calls to web-animation play controls override changes to
+        // play state via the animation-play-state style. Ensure that the new
+        // play state based on animation-play-state differs from the current
+        // play state and that the change is not blocked by a sticky state.
+        Animation::AnimationPlayState sticky_override =
+            animation->getWebAnimationOverriddenPlayState();
+        bool toggle_pause_state = false;
+        if (is_paused != was_paused) {
+          if (animation->Paused() && sticky_override != Animation::kPaused &&
+              !is_paused) {
+            toggle_pause_state = true;
+          } else if (animation->Playing() &&
+                     sticky_override != Animation::kRunning && is_paused) {
+            toggle_pause_state = true;
+          }
+        }
+
         if (keyframes_rule != existing_animation->style_rule ||
             keyframes_rule->Version() !=
                 existing_animation->style_rule_version ||
@@ -409,7 +427,7 @@
                   timing, is_paused, animation->UnlimitedCurrentTime()),
               specified_timing, keyframes_rule,
               animation_data->PlayStateList());
-          if (is_paused != was_paused)
+          if (toggle_pause_state)
             update.ToggleAnimationIndexPaused(existing_animation_index);
         }
       } else {
@@ -481,13 +499,18 @@
 
   for (wtf_size_t paused_index :
        pending_update_.AnimationIndicesWithPauseToggled()) {
-    Animation& animation = *running_animations_[paused_index]->animation;
-    if (animation.Paused())
-      animation.Unpause();
-    else
-      animation.pause();
-    if (animation.Outdated())
-      animation.Update(kTimingUpdateOnDemand);
+    CSSAnimation* animation = DynamicTo<CSSAnimation>(
+        running_animations_[paused_index]->animation.Get());
+
+    if (animation->Paused()) {
+      animation->Unpause();
+      animation->ResetWebAnimationOverriddenPlayState();
+    } else {
+      animation->pause();
+      animation->ResetWebAnimationOverriddenPlayState();
+    }
+    if (animation->Outdated())
+      animation->Update(kTimingUpdateOnDemand);
   }
 
   for (const auto& animation : pending_update_.UpdatedCompositorKeyframes())
@@ -529,6 +552,7 @@
     animation->play();
     if (inert_animation->Paused())
       animation->pause();
+    animation->ResetWebAnimationOverriddenPlayState();
     animation->Update(kTimingUpdateOnDemand);
 
     running_animations_.push_back(
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect_test.cc b/third_party/blink/renderer/core/animation/keyframe_effect_test.cc
index b7f9aa3..6c17ea8 100644
--- a/third_party/blink/renderer/core/animation/keyframe_effect_test.cc
+++ b/third_party/blink/renderer/core/animation/keyframe_effect_test.cc
@@ -163,9 +163,8 @@
   SetV8ObjectPropertyAsString(scope.GetIsolate(), effect_options, "composite",
                               "add");
   KeyframeEffectOptions* effect_options_dictionary =
-      KeyframeEffectOptions::Create();
-  V8KeyframeEffectOptions::ToImpl(scope.GetIsolate(), effect_options,
-                                  effect_options_dictionary, exception_state);
+      NativeValueTraits<KeyframeEffectOptions>::NativeValue(
+          scope.GetIsolate(), effect_options, exception_state);
   EXPECT_FALSE(exception_state.HadException());
 
   ScriptValue js_keyframes = ScriptValue::CreateNull(scope.GetIsolate());
@@ -189,9 +188,8 @@
   SetV8ObjectPropertyAsString(scope.GetIsolate(), effect_options, "composite",
                               "add");
   KeyframeEffectOptions* effect_options_dictionary =
-      KeyframeEffectOptions::Create();
-  V8KeyframeEffectOptions::ToImpl(scope.GetIsolate(), effect_options,
-                                  effect_options_dictionary, exception_state);
+      NativeValueTraits<KeyframeEffectOptions>::NativeValue(
+          scope.GetIsolate(), effect_options, exception_state);
   EXPECT_FALSE(exception_state.HadException());
 
   HeapVector<ScriptValue> blink_keyframes = {
@@ -258,11 +256,10 @@
                               "reverse");
   SetV8ObjectPropertyAsString(scope.GetIsolate(), timing_input, "easing",
                               "ease-in-out");
-  KeyframeEffectOptions* timing_input_dictionary =
-      KeyframeEffectOptions::Create();
   DummyExceptionStateForTesting exception_state;
-  V8KeyframeEffectOptions::ToImpl(scope.GetIsolate(), timing_input,
-                                  timing_input_dictionary, exception_state);
+  KeyframeEffectOptions* timing_input_dictionary =
+      NativeValueTraits<KeyframeEffectOptions>::NativeValue(
+          scope.GetIsolate(), timing_input, exception_state);
   EXPECT_FALSE(exception_state.HadException());
 
   KeyframeEffect* animation = CreateAnimationFromOption(
@@ -287,12 +284,10 @@
       v8::Object::New(scope.GetIsolate());
   SetV8ObjectPropertyAsNumber(scope.GetIsolate(), timing_input_with_duration,
                               "duration", 2.5);
-  KeyframeEffectOptions* timing_input_dictionary_with_duration =
-      KeyframeEffectOptions::Create();
   DummyExceptionStateForTesting exception_state;
-  V8KeyframeEffectOptions::ToImpl(
-      scope.GetIsolate(), timing_input_with_duration,
-      timing_input_dictionary_with_duration, exception_state);
+  KeyframeEffectOptions* timing_input_dictionary_with_duration =
+      NativeValueTraits<KeyframeEffectOptions>::NativeValue(
+          scope.GetIsolate(), timing_input_with_duration, exception_state);
   EXPECT_FALSE(exception_state.HadException());
 
   KeyframeEffect* animation_with_duration =
@@ -308,10 +303,8 @@
   v8::Local<v8::Object> timing_input_no_duration =
       v8::Object::New(scope.GetIsolate());
   KeyframeEffectOptions* timing_input_dictionary_no_duration =
-      KeyframeEffectOptions::Create();
-  V8KeyframeEffectOptions::ToImpl(scope.GetIsolate(), timing_input_no_duration,
-                                  timing_input_dictionary_no_duration,
-                                  exception_state);
+      NativeValueTraits<KeyframeEffectOptions>::NativeValue(
+          scope.GetIsolate(), timing_input_no_duration, exception_state);
   EXPECT_FALSE(exception_state.HadException());
 
   KeyframeEffect* animation_no_duration =
@@ -334,11 +327,10 @@
   ScriptState* script_state = scope.GetScriptState();
   ScriptValue js_keyframes = ScriptValue::CreateNull(scope.GetIsolate());
   v8::Local<v8::Object> timing_input = v8::Object::New(scope.GetIsolate());
-  KeyframeEffectOptions* timing_input_dictionary =
-      KeyframeEffectOptions::Create();
   DummyExceptionStateForTesting exception_state;
-  V8KeyframeEffectOptions::ToImpl(scope.GetIsolate(), timing_input,
-                                  timing_input_dictionary, exception_state);
+  KeyframeEffectOptions* timing_input_dictionary =
+      NativeValueTraits<KeyframeEffectOptions>::NativeValue(
+          scope.GetIsolate(), timing_input, exception_state);
   ASSERT_FALSE(exception_state.HadException());
 
   // Since there are no CSS-targeting keyframes, we can create a KeyframeEffect
diff --git a/third_party/blink/renderer/core/animation/timing_input_test.cc b/third_party/blink/renderer/core/animation/timing_input_test.cc
index dd5c65b..3ab2944 100644
--- a/third_party/blink/renderer/core/animation/timing_input_test.cc
+++ b/third_party/blink/renderer/core/animation/timing_input_test.cc
@@ -83,18 +83,16 @@
   Timing result;
   if (is_keyframeeffectoptions) {
     KeyframeEffectOptions* timing_input_dictionary =
-        KeyframeEffectOptions::Create();
-    V8KeyframeEffectOptions::ToImpl(isolate, timing_input,
-                                    timing_input_dictionary, exception_state);
+        NativeValueTraits<KeyframeEffectOptions>::NativeValue(
+            isolate, timing_input, exception_state);
     UnrestrictedDoubleOrKeyframeEffectOptions timing_input =
         UnrestrictedDoubleOrKeyframeEffectOptions::FromKeyframeEffectOptions(
             timing_input_dictionary);
     result = TimingInput::Convert(timing_input, GetDocument(), exception_state);
   } else {
     KeyframeAnimationOptions* timing_input_dictionary =
-        KeyframeAnimationOptions::Create();
-    V8KeyframeAnimationOptions::ToImpl(
-        isolate, timing_input, timing_input_dictionary, exception_state);
+        NativeValueTraits<KeyframeAnimationOptions>::NativeValue(
+            isolate, timing_input, exception_state);
     UnrestrictedDoubleOrKeyframeAnimationOptions timing_input =
         UnrestrictedDoubleOrKeyframeAnimationOptions::
             FromKeyframeAnimationOptions(timing_input_dictionary);
diff --git a/third_party/blink/renderer/core/core_idl_files.gni b/third_party/blink/renderer/core/core_idl_files.gni
index 2e21438c..1b36b3c0 100644
--- a/third_party/blink/renderer/core/core_idl_files.gni
+++ b/third_party/blink/renderer/core/core_idl_files.gni
@@ -193,6 +193,7 @@
                     "frame/history.idl",
                     "frame/intervention_report_body.idl",
                     "frame/location.idl",
+                    "frame/navigator_ua_data.idl",
                     "frame/report.idl",
                     "frame/report_body.idl",
                     "frame/reporting_observer.idl",
@@ -662,11 +663,11 @@
                     "fetch/response_init.idl",
                     "fileapi/blob_property_bag.idl",
                     "fileapi/file_property_bag.idl",
+                    "frame/navigator_ua_brand_version.idl",
                     "frame/reporting_observer_options.idl",
                     "frame/scroll_into_view_options.idl",
                     "frame/scroll_options.idl",
                     "frame/scroll_to_options.idl",
-                    "frame/user_agent.idl",
                     "frame/window_post_message_options.idl",
                     "fullscreen/fullscreen_options.idl",
                     "geometry/dom_matrix_2d_init.idl",
@@ -689,6 +690,7 @@
                     "input/input_device_capabilities_init.idl",
                     "input/touch_init.idl",
                     "intersection_observer/intersection_observer_init.idl",
+                    "frame/ua_data_values.idl",
                     "layout/ng/custom/custom_layout_constraints_options.idl",
                     "layout/ng/custom/fragment_result_options.idl",
                     "layout/ng/custom/intrinsic_sizes_result_options.idl",
diff --git a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
index 007a8d9..d525ce5 100644
--- a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
+++ b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
@@ -3115,18 +3115,15 @@
   const NamedGridAreaMap& new_named_grid_areas =
       grid_template_areas_value.GridAreaMap();
 
-  NamedGridLinesMap named_grid_column_lines;
-  NamedGridLinesMap named_grid_row_lines;
-  StyleBuilderConverter::ConvertOrderedNamedGridLinesMapToNamedGridLinesMap(
-      state.Style()->OrderedNamedGridColumnLines(), named_grid_column_lines);
-  StyleBuilderConverter::ConvertOrderedNamedGridLinesMapToNamedGridLinesMap(
-      state.Style()->OrderedNamedGridRowLines(), named_grid_row_lines);
+  NamedGridLinesMap implicit_named_grid_column_lines;
+  NamedGridLinesMap implicit_named_grid_row_lines;
   StyleBuilderConverter::CreateImplicitNamedGridLinesFromGridArea(
-      new_named_grid_areas, named_grid_column_lines, kForColumns);
+      new_named_grid_areas, implicit_named_grid_column_lines, kForColumns);
   StyleBuilderConverter::CreateImplicitNamedGridLinesFromGridArea(
-      new_named_grid_areas, named_grid_row_lines, kForRows);
-  state.Style()->SetNamedGridColumnLines(named_grid_column_lines);
-  state.Style()->SetNamedGridRowLines(named_grid_row_lines);
+      new_named_grid_areas, implicit_named_grid_row_lines, kForRows);
+  state.Style()->SetImplicitNamedGridColumnLines(
+      implicit_named_grid_column_lines);
+  state.Style()->SetImplicitNamedGridRowLines(implicit_named_grid_row_lines);
 
   state.Style()->SetNamedGridArea(new_named_grid_areas);
   state.Style()->SetNamedGridAreaRowCount(grid_template_areas_value.RowCount());
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
index a9756df..d5d60ff 100644
--- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
@@ -939,28 +939,6 @@
   DCHECK(!track_sizes.IsEmpty() || !auto_repeat_track_sizes.IsEmpty());
 }
 
-void StyleBuilderConverter::ConvertOrderedNamedGridLinesMapToNamedGridLinesMap(
-    const OrderedNamedGridLines& ordered_named_grid_lines,
-    NamedGridLinesMap& named_grid_lines) {
-  DCHECK_EQ(named_grid_lines.size(), 0u);
-
-  if (ordered_named_grid_lines.size() == 0)
-    return;
-
-  for (auto& ordered_named_grid_line : ordered_named_grid_lines) {
-    for (auto& line_name : ordered_named_grid_line.value) {
-      NamedGridLinesMap::AddResult start_result =
-          named_grid_lines.insert(line_name, Vector<size_t>());
-      start_result.stored_value->value.push_back(ordered_named_grid_line.key);
-    }
-  }
-
-  for (auto& named_grid_line : named_grid_lines) {
-    Vector<size_t>& grid_line_indexes = named_grid_line.value;
-    std::sort(grid_line_indexes.begin(), grid_line_indexes.end());
-  }
-}
-
 void StyleBuilderConverter::CreateImplicitNamedGridLinesFromGridArea(
     const NamedGridAreaMap& named_grid_areas,
     NamedGridLinesMap& named_grid_lines,
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.h b/third_party/blink/renderer/core/css/resolver/style_builder_converter.h
index f2ae707..695c1fa 100644
--- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.h
+++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.h
@@ -231,9 +231,6 @@
       const NamedGridAreaMap&,
       NamedGridLinesMap&,
       GridTrackSizingDirection);
-  static void ConvertOrderedNamedGridLinesMapToNamedGridLinesMap(
-      const OrderedNamedGridLines&,
-      NamedGridLinesMap&);
 
   static cc::ScrollSnapType ConvertSnapType(StyleResolverState&,
                                             const CSSValue&);
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc
index 76d8a4d..094c7ef 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/display_lock/display_lock_budget.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/test/test_mock_time_task_runner.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_function.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
index 05a56013..bb6f3e1 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc
index 19a1a6f..22448ea9 100644
--- a/third_party/blink/renderer/core/exported/web_frame_test.cc
+++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -34,6 +34,7 @@
 #include <limits>
 #include <memory>
 
+#include "base/bind_helpers.h"
 #include "base/stl_util.h"
 #include "build/build_config.h"
 #include "cc/input/overscroll_behavior.h"
diff --git a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
index 91f1afa..15870ba 100644
--- a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
@@ -31,6 +31,7 @@
 #include "third_party/blink/renderer/core/exported/web_shared_worker_impl.h"
 
 #include <memory>
+#include "base/memory/ptr_util.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/network/public/mojom/fetch_api.mojom-shared.h"
 #include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink.h"
diff --git a/third_party/blink/renderer/core/exported/web_view_test.cc b/third_party/blink/renderer/core/exported/web_view_test.cc
index c93e8f9..b852f86 100644
--- a/third_party/blink/renderer/core/exported/web_view_test.cc
+++ b/third_party/blink/renderer/core/exported/web_view_test.cc
@@ -34,6 +34,7 @@
 #include <memory>
 #include <string>
 
+#include "base/bind_helpers.h"
 #include "base/stl_util.h"
 #include "base/test/test_mock_time_task_runner.h"
 #include "base/time/time.h"
diff --git a/third_party/blink/renderer/core/frame/BUILD.gn b/third_party/blink/renderer/core/frame/BUILD.gn
index ff8838d5..fe63de1 100644
--- a/third_party/blink/renderer/core/frame/BUILD.gn
+++ b/third_party/blink/renderer/core/frame/BUILD.gn
@@ -122,6 +122,8 @@
     "navigator_on_line.h",
     "navigator_scheduling.cc",
     "navigator_scheduling.h",
+    "navigator_ua_data.cc",
+    "navigator_ua_data.h",
     "navigator_user_activation.cc",
     "navigator_user_activation.h",
     "navigator_user_agent.cc",
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
index f3ba9e91..5bbb21a 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -34,6 +34,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "cc/test/test_ukm_recorder_factory.h"
 #include "cc/trees/layer_tree_host.h"
 #include "cc/trees/layer_tree_settings.h"
diff --git a/third_party/blink/renderer/core/frame/mhtml_loading_test.cc b/third_party/blink/renderer/core/frame/mhtml_loading_test.cc
index dd78fcaf..b73fafe 100644
--- a/third_party/blink/renderer/core/frame/mhtml_loading_test.cc
+++ b/third_party/blink/renderer/core/frame/mhtml_loading_test.cc
@@ -28,6 +28,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include "base/bind_helpers.h"
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/platform/web_string.h"
diff --git a/third_party/blink/renderer/core/frame/navigator.h b/third_party/blink/renderer/core/frame/navigator.h
index fd0f531..5e77142 100644
--- a/third_party/blink/renderer/core/frame/navigator.h
+++ b/third_party/blink/renderer/core/frame/navigator.h
@@ -71,6 +71,9 @@
 
   void Trace(Visitor*) override;
 
+ protected:
+  LocalFrame* GetLocalFrame() const override { return GetFrame(); }
+
  private:
   UserAgentMetadata metadata_;
 };
diff --git a/third_party/blink/renderer/core/frame/navigator_ua_brand_version.idl b/third_party/blink/renderer/core/frame/navigator_ua_brand_version.idl
new file mode 100644
index 0000000..f19769b
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/navigator_ua_brand_version.idl
@@ -0,0 +1,10 @@
+// Copyright 2020 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://github.com/WICG/ua-client-hints
+
+dictionary NavigatorUABrandVersion {
+  DOMString brand;
+  DOMString version;
+};
diff --git a/third_party/blink/renderer/core/frame/navigator_ua_data.cc b/third_party/blink/renderer/core/frame/navigator_ua_data.cc
new file mode 100644
index 0000000..8285c79d
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/navigator_ua_data.cc
@@ -0,0 +1,87 @@
+// Copyright 2020 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/core/frame/navigator_ua_data.h"
+#include "third_party/blink/renderer/core/frame/ua_data_values.h"
+
+#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
+#include "third_party/blink/renderer/core/page/page.h"
+
+namespace blink {
+
+NavigatorUAData::NavigatorUAData(LocalFrame* frame) : DOMWindowClient(frame) {
+  NavigatorUABrandVersion* dict = NavigatorUABrandVersion::Create();
+  dict->setBrand("");
+  dict->setVersion("");
+  empty_brand_set_.push_back(dict);
+}
+
+void NavigatorUAData::AddBrand(const String& brand, const String& version) {
+  NavigatorUABrandVersion* dict = NavigatorUABrandVersion::Create();
+  dict->setBrand(brand);
+  dict->setVersion(version);
+  brand_set_.push_back(dict);
+}
+
+void NavigatorUAData::SetMobile(bool mobile) {
+  is_mobile_ = mobile;
+}
+
+void NavigatorUAData::SetPlatform(const String& brand, const String& version) {
+  platform_ = brand;
+  platform_version_ = version;
+}
+
+void NavigatorUAData::SetArchitecture(const String& architecture) {
+  architecture_ = architecture;
+}
+
+void NavigatorUAData::SetModel(const String& model) {
+  model_ = model;
+}
+
+bool NavigatorUAData::mobile() const {
+  if (GetFrame() && GetFrame()->GetPage()) {
+    return is_mobile_;
+  }
+  return false;
+}
+
+const HeapVector<Member<NavigatorUABrandVersion>>& NavigatorUAData::uaList()
+    const {
+  if (!GetFrame() || !GetFrame()->GetPage()) {
+    return empty_brand_set_;
+  }
+  return brand_set_;
+}
+
+ScriptPromise NavigatorUAData::getHighEntropyValues(
+    ScriptState* script_state,
+    Vector<String>& hints) const {
+  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
+  ScriptPromise promise = resolver->Promise();
+  UADataValues* values = MakeGarbageCollected<UADataValues>();
+  for (const String& hint : hints) {
+    if (hint == "platform") {
+      values->setPlatform(platform_);
+    } else if (hint == "platformVersion") {
+      values->setPlatformVersion(platform_version_);
+    } else if (hint == "architecture") {
+      values->setArchitecture(architecture_);
+    } else if (hint == "model") {
+      values->setModel(model_);
+    }
+  }
+  resolver->Resolve(values);
+  return promise;
+}
+
+void NavigatorUAData::Trace(Visitor* visitor) {
+  visitor->Trace(brand_set_);
+  visitor->Trace(empty_brand_set_);
+  ScriptWrappable::Trace(visitor);
+  DOMWindowClient::Trace(visitor);
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/navigator_ua_data.h b/third_party/blink/renderer/core/frame/navigator_ua_data.h
new file mode 100644
index 0000000..6a93503b
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/navigator_ua_data.h
@@ -0,0 +1,54 @@
+// Copyright 2020 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_CORE_FRAME_NAVIGATOR_UA_DATA_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_NAVIGATOR_UA_DATA_H_
+
+#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
+#include "third_party/blink/renderer/core/frame/navigator_ua_brand_version.h"
+#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+
+namespace blink {
+
+class ScriptState;
+
+class NavigatorUAData : public ScriptWrappable, DOMWindowClient {
+  DEFINE_WRAPPERTYPEINFO();
+  USING_GARBAGE_COLLECTED_MIXIN(NavigatorUAData);
+
+ public:
+  static NavigatorUAData* Create(LocalFrame* frame) {
+    return MakeGarbageCollected<NavigatorUAData>(frame);
+  }
+
+  explicit NavigatorUAData(LocalFrame* frame);
+
+  void AddBrand(const String& brand, const String& version);
+  void SetMobile(bool mobile);
+  void SetPlatform(const String& brand, const String& version);
+  void SetArchitecture(const String& architecture);
+  void SetModel(const String& model);
+
+  // IDL implementation
+  const HeapVector<Member<NavigatorUABrandVersion>>& uaList() const;
+  bool mobile() const;
+  ScriptPromise getHighEntropyValues(ScriptState*, Vector<String>&) const;
+
+  void Trace(Visitor* visitor) final;
+
+ private:
+  HeapVector<Member<NavigatorUABrandVersion>> brand_set_;
+  HeapVector<Member<NavigatorUABrandVersion>> empty_brand_set_;
+  bool is_mobile_ = false;
+  String platform_;
+  String platform_version_;
+  String architecture_;
+  String model_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_NAVIGATOR_UA_DATA_H_
diff --git a/third_party/blink/renderer/core/frame/navigator_ua_data.idl b/third_party/blink/renderer/core/frame/navigator_ua_data.idl
new file mode 100644
index 0000000..c92c894
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/navigator_ua_data.idl
@@ -0,0 +1,13 @@
+// Copyright 2020 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://github.com/WICG/ua-client-hints
+
+[
+    RuntimeEnabled=UserAgentClientHint
+] interface NavigatorUAData {
+  readonly attribute FrozenArray<NavigatorUABrandVersion> uaList;
+  readonly attribute boolean mobile;
+  [CallWith=ScriptState] Promise<UADataValues> getHighEntropyValues(sequence<DOMString> hints);
+};
diff --git a/third_party/blink/renderer/core/frame/navigator_user_agent.cc b/third_party/blink/renderer/core/frame/navigator_user_agent.cc
index baed2eea..e6e6c2d 100644
--- a/third_party/blink/renderer/core/frame/navigator_user_agent.cc
+++ b/third_party/blink/renderer/core/frame/navigator_user_agent.cc
@@ -4,27 +4,23 @@
 
 #include "third_party/blink/renderer/core/frame/navigator_user_agent.h"
 
-#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
-#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_user_agent.h"
 
 namespace blink {
 
-ScriptPromise NavigatorUserAgent::getUserAgent(ScriptState* script_state) {
-  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
-  ScriptPromise promise = resolver->Promise();
+NavigatorUAData* NavigatorUserAgent::userAgentData() {
+  blink::NavigatorUAData* ua_data =
+      blink::NavigatorUAData::Create(GetLocalFrame());
 
   blink::UserAgentMetadata metadata = GetUserAgentMetadata();
-  blink::UserAgent* idl_metadata = blink::UserAgent::Create();
+  ua_data->AddBrand(String::FromUTF8(metadata.brand),
+                    String::FromUTF8(metadata.full_version));
+  ua_data->SetMobile(metadata.mobile);
+  ua_data->SetPlatform(String::FromUTF8(metadata.platform),
+                       String::FromUTF8(metadata.platform_version));
+  ua_data->SetArchitecture(String::FromUTF8(metadata.architecture));
+  ua_data->SetModel(String::FromUTF8(metadata.model));
 
-  idl_metadata->setBrand(String::FromUTF8(metadata.brand));
-  idl_metadata->setVersion(String::FromUTF8(metadata.full_version));
-  idl_metadata->setPlatform(String::FromUTF8(metadata.platform));
-  idl_metadata->setArchitecture(String::FromUTF8(metadata.architecture));
-  idl_metadata->setModel(String::FromUTF8(metadata.model));
-  resolver->Resolve(idl_metadata);
-
-  return promise;
+  return ua_data;
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/navigator_user_agent.h b/third_party/blink/renderer/core/frame/navigator_user_agent.h
index def5dda..21f7807 100644
--- a/third_party/blink/renderer/core/frame/navigator_user_agent.h
+++ b/third_party/blink/renderer/core/frame/navigator_user_agent.h
@@ -7,17 +7,18 @@
 
 #include "third_party/blink/public/common/user_agent/user_agent_metadata.h"
 #include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/core/frame/navigator_ua_data.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
 
-class ScriptPromise;
-class ScriptState;
 class CORE_EXPORT NavigatorUserAgent {
  public:
-  ScriptPromise getUserAgent(ScriptState*);
+  NavigatorUAData* userAgentData();
 
+ protected:
   virtual UserAgentMetadata GetUserAgentMetadata() const = 0;
+  virtual LocalFrame* GetLocalFrame() const = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/navigator_user_agent.idl b/third_party/blink/renderer/core/frame/navigator_user_agent.idl
index a7bbe07..49f6658 100644
--- a/third_party/blink/renderer/core/frame/navigator_user_agent.idl
+++ b/third_party/blink/renderer/core/frame/navigator_user_agent.idl
@@ -8,5 +8,5 @@
     RuntimeEnabled=UserAgentClientHint,
     Exposed=Window
 ] interface mixin NavigatorUserAgent {
-  [SecureContext, CallWith=ScriptState] Promise<UserAgent> getUserAgent();
+  [SecureContext] readonly attribute NavigatorUAData userAgentData;
 };
diff --git a/third_party/blink/renderer/core/frame/user_agent.idl b/third_party/blink/renderer/core/frame/ua_data_values.idl
similarity index 79%
rename from third_party/blink/renderer/core/frame/user_agent.idl
rename to third_party/blink/renderer/core/frame/ua_data_values.idl
index 7aa6b6f..655b597 100644
--- a/third_party/blink/renderer/core/frame/user_agent.idl
+++ b/third_party/blink/renderer/core/frame/ua_data_values.idl
@@ -3,10 +3,10 @@
 // found in the LICENSE file.
 
 // https://github.com/WICG/ua-client-hints
-dictionary UserAgent {
-  DOMString brand = "";
-  DOMString version = "";
+
+dictionary UADataValues {
   DOMString platform = "";
+  DOMString platformVersion = "";
   DOMString architecture = "";
   DOMString model = "";
 };
diff --git a/third_party/blink/renderer/core/html/html_marquee_element.cc b/third_party/blink/renderer/core/html/html_marquee_element.cc
index daf22347..3aeb5a5 100644
--- a/third_party/blink/renderer/core/html/html_marquee_element.cc
+++ b/third_party/blink/renderer/core/html/html_marquee_element.cc
@@ -270,7 +270,7 @@
   if (!ShouldContinue())
     return;
 
-  if (player_ && player_->playState() == "paused") {
+  if (player_ && player_->PlayStateString() == "paused") {
     player_->play();
     return;
   }
diff --git a/third_party/blink/renderer/core/inspector/devtools_agent.cc b/third_party/blink/renderer/core/inspector/devtools_agent.cc
index 6959f9c9..fa18c9b 100644
--- a/third_party/blink/renderer/core/inspector/devtools_agent.cc
+++ b/third_party/blink/renderer/core/inspector/devtools_agent.cc
@@ -7,6 +7,7 @@
 #include <v8-inspector.h>
 #include <memory>
 
+#include "base/bind_helpers.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
diff --git a/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc b/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc
index 676f518..7267727 100644
--- a/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc
@@ -190,7 +190,7 @@
           .setId(id)
           .setName(AnimationDisplayName(animation))
           .setPausedState(animation.Paused())
-          .setPlayState(animation.playState())
+          .setPlayState(animation.PlayStateString())
           .setPlaybackRate(animation.playbackRate())
           .setStartTime(NormalizedStartTime(animation))
           .setCurrentTime(animation.currentTime())
diff --git a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
index beb9679..d535db2 100644
--- a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
@@ -1400,7 +1400,7 @@
     const Animation& animation) {
   auto value = std::make_unique<TracedValue>();
   value->SetString("id", String::Number(animation.SequenceNumber()));
-  value->SetString("state", animation.playState());
+  value->SetString("state", animation.PlayStateString());
   if (const AnimationEffect* effect = animation.effect()) {
     value->SetString("name", animation.id());
     if (auto* frame_effect = DynamicTo<KeyframeEffect>(effect)) {
@@ -1414,7 +1414,7 @@
 std::unique_ptr<TracedValue> inspector_animation_state_event::Data(
     const Animation& animation) {
   auto value = std::make_unique<TracedValue>();
-  value->SetString("state", animation.playState());
+  value->SetString("state", animation.PlayStateString());
   return value;
 }
 
diff --git a/third_party/blink/renderer/core/layout/grid.cc b/third_party/blink/renderer/core/layout/grid.cc
index f13eca09..d86bcfc 100644
--- a/third_party/blink/renderer/core/layout/grid.cc
+++ b/third_party/blink/renderer/core/layout/grid.cc
@@ -8,6 +8,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "third_party/blink/renderer/core/layout/layout_grid.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/layout/grid_test.cc b/third_party/blink/renderer/core/layout/grid_test.cc
index 65bdebf..e977990 100644
--- a/third_party/blink/renderer/core/layout/grid_test.cc
+++ b/third_party/blink/renderer/core/layout/grid_test.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/layout/grid.h"
 #include "third_party/blink/renderer/core/layout/layout_grid.h"
 
+#include "base/memory/ptr_util.h"
 #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
index fb56c5b..49e474e 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
@@ -187,6 +187,24 @@
 }
 
 // Simple function to add quotes to make headers strings.
+const AtomicString AddBrandVersionQuotes(const std::string& brand,
+                                         const std::string& version) {
+  if (brand.empty())
+    return AtomicString("");
+
+  StringBuilder quoted_string;
+  quoted_string.Append("\"");
+  quoted_string.Append(brand.data());
+  quoted_string.Append("\"");
+  if (!version.empty()) {
+    quoted_string.Append(";v=\"");
+    quoted_string.Append(version.data());
+    quoted_string.Append("\"");
+  }
+  return quoted_string.ToAtomicString();
+}
+
+// Simple function to add quotes to make headers strings.
 const AtomicString AddQuotes(std::string str) {
   if (str.empty())
     return AtomicString("");
@@ -537,17 +555,11 @@
       ShouldSendClientHint(mojom::WebClientHintsType::kUA, hints_preferences,
                            enabled_hints);
   if (RuntimeEnabledFeatures::UserAgentClientHintEnabled()) {
-    StringBuilder result;
-    result.Append(ua.brand.data());
-    const auto& version = use_full_ua ? ua.full_version : ua.major_version;
-    if (!version.empty()) {
-      result.Append(' ');
-      result.Append(version.data());
-    }
     request.SetHttpHeaderField(
         blink::kClientHintsHeaderMapping[static_cast<size_t>(
             mojom::WebClientHintsType::kUA)],
-        AddQuotes(result.ToString().Ascii()));
+        AddBrandVersionQuotes(
+            ua.brand, use_full_ua ? ua.full_version : ua.major_version));
 
     // We also send Sec-CH-UA-Mobile to all hints. It is a one-bit header
     // identifying if the browser has opted for a "mobile" experience
@@ -743,7 +755,7 @@
     request.SetHttpHeaderField(
         blink::kClientHintsHeaderMapping[static_cast<size_t>(
             mojom::WebClientHintsType::kUAPlatform)],
-        AddQuotes(ua.platform));
+        AddBrandVersionQuotes(ua.platform, ua.platform_version));
   }
 
   if ((can_always_send_hints ||
diff --git a/third_party/blink/renderer/core/loader/interactive_detector_test.cc b/third_party/blink/renderer/core/loader/interactive_detector_test.cc
index 81767b6..19ac39d 100644
--- a/third_party/blink/renderer/core/loader/interactive_detector_test.cc
+++ b/third_party/blink/renderer/core/loader/interactive_detector_test.cc
@@ -4,6 +4,7 @@
 #include "components/ukm/test_ukm_recorder.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 
+#include "base/bind_helpers.h"
 #include "third_party/blink/renderer/core/loader/interactive_detector.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/third_party/blink/renderer/core/style/computed_style_diff_functions.json5 b/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
index 68e18f2..c7c36fe 100644
--- a/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
+++ b/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
@@ -98,7 +98,8 @@
                 "NamedGridColumnLines", "NamedGridRowLines", "OrderedNamedGridColumnLines", 
                 "OrderedNamedGridRowLines", "AutoRepeatNamedGridColumnLines", 
                 "AutoRepeatNamedGridRowLines", "AutoRepeatOrderedNamedGridColumnLines", 
-                "AutoRepeatOrderedNamedGridRowLines", "NamedGridArea", "grid-auto-rows", 
+                "AutoRepeatOrderedNamedGridRowLines", "ImplicitNamedGridColumnLines", 
+                "ImplicitNamedGridRowLines", "NamedGridArea", "grid-auto-rows", 
                 "grid-template-rows", "grid-template-columns", "grid-auto-columns", "row-gap",
                 "NamedGridAreaRowCount", "NamedGridAreaColumnCount", 
                 "GridAutoRepeatColumns", "GridAutoRepeatRows", "GridAutoRepeatColumnsInsertionPoint", 
diff --git a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
index b8ba270..c3815d7 100644
--- a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
+++ b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
@@ -879,6 +879,22 @@
       include_paths: ["third_party/blink/renderer/core/style/ordered_named_grid_lines.h"],
     },
     {
+      name: "ImplicitNamedGridColumnLines",
+      field_template: "external",
+      type_name: "NamedGridLinesMap",
+      field_group: "*->grid",
+      default_value: "NamedGridLinesMap()",
+      include_paths: ["third_party/blink/renderer/core/style/named_grid_lines_map.h"],
+    },
+    {
+      name: "ImplicitNamedGridRowLines",
+      field_template: "external",
+      type_name: "NamedGridLinesMap",
+      field_group: "*->grid",
+      default_value: "NamedGridLinesMap()",
+      include_paths: ["third_party/blink/renderer/core/style/named_grid_lines_map.h"],
+    },
+    {
       name: "NamedGridArea",
       field_template: "external",
       type_name: "NamedGridAreaMap",
diff --git a/third_party/blink/renderer/core/style/grid_positions_resolver.cc b/third_party/blink/renderer/core/style/grid_positions_resolver.cc
index 246d5f63..5b373f5 100644
--- a/third_party/blink/renderer/core/style/grid_positions_resolver.cc
+++ b/third_party/blink/renderer/core/style/grid_positions_resolver.cc
@@ -38,6 +38,9 @@
   const NamedGridLinesMap& auto_repeat_grid_line_names =
       is_row_axis ? grid_container_style.AutoRepeatNamedGridColumnLines()
                   : grid_container_style.AutoRepeatNamedGridRowLines();
+  const NamedGridLinesMap& implicit_grid_line_names =
+      is_row_axis ? grid_container_style.ImplicitNamedGridColumnLines()
+                  : grid_container_style.ImplicitNamedGridRowLines();
 
   if (!grid_line_names.IsEmpty()) {
     auto it = grid_line_names.find(named_line);
@@ -50,6 +53,12 @@
         it == auto_repeat_grid_line_names.end() ? nullptr : &it->value;
   }
 
+  if (!implicit_grid_line_names.IsEmpty()) {
+    auto it = implicit_grid_line_names.find(named_line);
+    implicit_named_lines_indexes_ =
+        it == implicit_grid_line_names.end() ? nullptr : &it->value;
+  }
+
   insertion_point_ =
       is_row_axis ? grid_container_style.GridAutoRepeatColumnsInsertionPoint()
                   : grid_container_style.GridAutoRepeatRowsInsertionPoint();
@@ -59,58 +68,63 @@
                   : grid_container_style.GridAutoRepeatRows().size();
 }
 
-bool NamedLineCollection::HasNamedLines() {
+bool NamedLineCollection::HasExplicitNamedLines() {
   return named_lines_indexes_ || auto_repeat_named_lines_indexes_;
 }
 
-size_t NamedLineCollection::Find(size_t line) {
-  if (line > last_line_)
-    return kNotFound;
-
-  if (!auto_repeat_named_lines_indexes_ || line < insertion_point_)
-    return named_lines_indexes_ ? named_lines_indexes_->Find(line) : kNotFound;
-
-  if (line <= (insertion_point_ + auto_repeat_total_tracks_)) {
-    size_t local_index = line - insertion_point_;
-
-    size_t index_in_first_repetition =
-        local_index % auto_repeat_track_list_length_;
-    if (index_in_first_repetition)
-      return auto_repeat_named_lines_indexes_->Find(index_in_first_repetition);
-
-    // The line names defined in the last line are also present in the first
-    // line of the next repetition (if any). Same for the line names defined in
-    // the first line.
-    if (local_index == auto_repeat_total_tracks_)
-      return auto_repeat_named_lines_indexes_->Find(
-          auto_repeat_track_list_length_);
-    size_t position =
-        auto_repeat_named_lines_indexes_->Find(static_cast<size_t>(0));
-    if (position != kNotFound)
-      return position;
-    return local_index == 0 ? kNotFound
-                            : auto_repeat_named_lines_indexes_->Find(
-                                  auto_repeat_track_list_length_);
-  }
-
-  return named_lines_indexes_ ? named_lines_indexes_->Find(
-                                    line - (auto_repeat_total_tracks_ - 1))
-                              : kNotFound;
+bool NamedLineCollection::HasNamedLines() {
+  return HasExplicitNamedLines() || implicit_named_lines_indexes_;
 }
 
 bool NamedLineCollection::Contains(size_t line) {
   CHECK(HasNamedLines());
-  return Find(line) != kNotFound;
+
+  if (line > last_line_)
+    return false;
+
+  auto find = [](const Vector<size_t>* indexes, size_t line) {
+    return indexes && indexes->Find(line) != kNotFound;
+  };
+
+  if (find(implicit_named_lines_indexes_, line))
+    return true;
+
+  if (auto_repeat_track_list_length_ == 0LU || line < insertion_point_)
+    return find(named_lines_indexes_, line);
+
+  DCHECK(auto_repeat_total_tracks_);
+
+  if (line > insertion_point_ + auto_repeat_total_tracks_)
+    return find(named_lines_indexes_, line - (auto_repeat_total_tracks_ - 1));
+
+  if (line == insertion_point_) {
+    return find(named_lines_indexes_, line) ||
+           find(auto_repeat_named_lines_indexes_, 0);
+  }
+
+  if (line == insertion_point_ + auto_repeat_total_tracks_) {
+    return find(auto_repeat_named_lines_indexes_,
+                auto_repeat_track_list_length_) ||
+           find(named_lines_indexes_, insertion_point_ + 1);
+  }
+
+  size_t auto_repeat_index_in_first_repetition =
+      (line - insertion_point_) % auto_repeat_track_list_length_;
+  if (!auto_repeat_index_in_first_repetition &&
+      find(auto_repeat_named_lines_indexes_, auto_repeat_track_list_length_))
+    return true;
+  return find(auto_repeat_named_lines_indexes_,
+              auto_repeat_index_in_first_repetition);
 }
 
-size_t NamedLineCollection::FirstPosition() {
-  CHECK(HasNamedLines());
+size_t NamedLineCollection::FirstExplicitPosition() {
+  DCHECK(HasExplicitNamedLines());
 
   size_t first_line = 0;
 
   // If there is no auto repeat(), there must be some named line outside, return
   // the 1st one. Also return it if it precedes the auto-repeat().
-  if (auto_repeat_total_tracks_ == 0 ||
+  if (auto_repeat_track_list_length_ == 0 ||
       (named_lines_indexes_ &&
        named_lines_indexes_->at(first_line) <= insertion_point_))
     return named_lines_indexes_->at(first_line);
@@ -123,6 +137,21 @@
   return named_lines_indexes_->at(first_line) + auto_repeat_total_tracks_ - 1;
 }
 
+size_t NamedLineCollection::FirstPosition() {
+  CHECK(HasNamedLines());
+
+  size_t first_line = 0;
+
+  if (!implicit_named_lines_indexes_)
+    return FirstExplicitPosition();
+
+  if (!HasExplicitNamedLines())
+    return implicit_named_lines_indexes_->at(first_line);
+
+  return std::min(FirstExplicitPosition(),
+                  implicit_named_lines_indexes_->at(first_line));
+}
+
 GridPositionSide GridPositionsResolver::InitialPositionSide(
     GridTrackSizingDirection direction) {
   return (direction == kForColumns) ? kColumnStartSide : kRowStartSide;
diff --git a/third_party/blink/renderer/core/style/grid_positions_resolver.h b/third_party/blink/renderer/core/style/grid_positions_resolver.h
index 475819d..bf67244 100644
--- a/third_party/blink/renderer/core/style/grid_positions_resolver.h
+++ b/third_party/blink/renderer/core/style/grid_positions_resolver.h
@@ -38,9 +38,11 @@
   bool Contains(size_t line);
 
  private:
-  size_t Find(size_t line);
+  bool HasExplicitNamedLines();
+  size_t FirstExplicitPosition();
   const Vector<size_t>* named_lines_indexes_ = nullptr;
   const Vector<size_t>* auto_repeat_named_lines_indexes_ = nullptr;
+  const Vector<size_t>* implicit_named_lines_indexes_ = nullptr;
 
   size_t insertion_point_;
   size_t last_line_;
diff --git a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
index 4bed5879..7496d77 100644
--- a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
+++ b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
@@ -703,10 +703,6 @@
                                    SMILTime time) const {
   const Vector<SMILTimeWithOrigin>& list =
       begin_or_end == kBegin ? begin_times_ : end_times_;
-  if (list.IsEmpty()) {
-    return begin_or_end == kBegin ? SMILTime::Unresolved()
-                                  : SMILTime::Indefinite();
-  }
   // Find the value in |list| that is strictly greater than |time|.
   auto* next_item = std::lower_bound(
       list.begin(), list.end(), time,
@@ -740,11 +736,16 @@
 }
 
 SMILTime SVGSMILElement::ResolveActiveEnd(SMILTime resolved_begin) const {
-  SMILTime resolved_end = NextAfter(kEnd, resolved_begin);
-  if (resolved_end.IsUnresolved()) {
-    // If we have no pending end conditions, don't generate a new interval.
-    if (!end_times_.IsEmpty() && !has_end_event_conditions_)
-      return SMILTime::Unresolved();
+  SMILTime resolved_end = SMILTime::Indefinite();
+  if (!end_times_.IsEmpty()) {
+    SMILTime next_end = NextAfter(kEnd, resolved_begin);
+    if (next_end.IsUnresolved()) {
+      // If we have no pending end conditions, don't generate a new interval.
+      if (!has_end_event_conditions_)
+        return SMILTime::Unresolved();
+    } else {
+      resolved_end = next_end;
+    }
   }
   // Computing the active duration
   // http://www.w3.org/TR/SMIL2/smil-timing.html#Timing-ComputingActiveDur
diff --git a/third_party/blink/renderer/core/testing/dummy_page_holder.h b/third_party/blink/renderer/core/testing/dummy_page_holder.h
index 67e7845..1a10044 100644
--- a/third_party/blink/renderer/core/testing/dummy_page_holder.h
+++ b/third_party/blink/renderer/core/testing/dummy_page_holder.h
@@ -33,6 +33,7 @@
 
 #include <memory>
 
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/time/default_tick_clock.h"
diff --git a/third_party/blink/renderer/core/typed_arrays/dom_array_buffer.cc b/third_party/blink/renderer/core/typed_arrays/dom_array_buffer.cc
index 524bb4d..5950734a 100644
--- a/third_party/blink/renderer/core/typed_arrays/dom_array_buffer.cc
+++ b/third_party/blink/renderer/core/typed_arrays/dom_array_buffer.cc
@@ -60,6 +60,15 @@
   return true;
 }
 
+DOMArrayBuffer* DOMArrayBuffer::CreateOrNull(size_t num_elements,
+                                             size_t element_byte_size) {
+  scoped_refptr<ArrayBuffer> buffer =
+      ArrayBuffer::CreateOrNull(num_elements, element_byte_size);
+  if (!buffer)
+    return nullptr;
+  return Create(std::move(buffer));
+}
+
 DOMArrayBuffer* DOMArrayBuffer::CreateUninitializedOrNull(
     size_t num_elements,
     size_t element_byte_size) {
diff --git a/third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h b/third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h
index 1aa9b01..34662b1 100644
--- a/third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h
+++ b/third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h
@@ -32,6 +32,9 @@
   static DOMArrayBuffer* Create(scoped_refptr<SharedBuffer>);
   static DOMArrayBuffer* Create(const Vector<base::span<const char>>&);
 
+  static DOMArrayBuffer* CreateOrNull(size_t num_elements,
+                                      size_t element_byte_size);
+
   // Only for use by XMLHttpRequest::responseArrayBuffer,
   // Internals::serializeObject, and
   // FetchDataLoaderAsArrayBuffer::OnStateChange.
diff --git a/third_party/blink/renderer/core/typed_arrays/dom_array_buffer_view.h b/third_party/blink/renderer/core/typed_arrays/dom_array_buffer_view.h
index ccc0c0d2..62def2a 100644
--- a/third_party/blink/renderer/core/typed_arrays/dom_array_buffer_view.h
+++ b/third_party/blink/renderer/core/typed_arrays/dom_array_buffer_view.h
@@ -33,17 +33,13 @@
 
   DOMArrayBuffer* buffer() const {
     DCHECK(!IsShared());
-    if (!dom_array_buffer_)
-      dom_array_buffer_ = DOMArrayBuffer::Create(View()->Buffer());
-
+    DCHECK(dom_array_buffer_);
     return static_cast<DOMArrayBuffer*>(dom_array_buffer_.Get());
   }
 
   DOMSharedArrayBuffer* BufferShared() const {
     DCHECK(IsShared());
-    if (!dom_array_buffer_)
-      dom_array_buffer_ = DOMSharedArrayBuffer::Create(View()->Buffer());
-
+    DCHECK(dom_array_buffer_);
     return static_cast<DOMSharedArrayBuffer*>(dom_array_buffer_.Get());
   }
 
@@ -92,10 +88,6 @@
   }
 
  protected:
-  explicit DOMArrayBufferView(scoped_refptr<ArrayBufferView> buffer_view)
-      : buffer_view_(std::move(buffer_view)) {
-    DCHECK(buffer_view_);
-  }
   DOMArrayBufferView(scoped_refptr<ArrayBufferView> buffer_view,
                      DOMArrayBufferBase* dom_array_buffer)
       : buffer_view_(std::move(buffer_view)),
diff --git a/third_party/blink/renderer/core/typed_arrays/dom_typed_array.h b/third_party/blink/renderer/core/typed_arrays/dom_typed_array.h
index ae55a68..45b6eb15 100644
--- a/third_party/blink/renderer/core/typed_arrays/dom_typed_array.h
+++ b/third_party/blink/renderer/core/typed_arrays/dom_typed_array.h
@@ -22,20 +22,11 @@
  public:
   typedef typename TypedArray::ValueType ValueType;
 
-  static ThisType* Create(scoped_refptr<TypedArray> buffer_view) {
-    return MakeGarbageCollected<ThisType>(std::move(buffer_view));
+  static ThisType* Create(scoped_refptr<TypedArray> buffer_view,
+                          DOMArrayBufferBase* buffer) {
+    return MakeGarbageCollected<ThisType>(std::move(buffer_view), buffer);
   }
-  static ThisType* Create(size_t length) {
-    return Create(TypedArray::Create(length));
-  }
-  static ThisType* Create(const ValueType* array, size_t length) {
-    return Create(TypedArray::Create(array, length));
-  }
-  static ThisType* Create(scoped_refptr<ArrayBuffer> buffer,
-                          size_t byte_offset,
-                          size_t length) {
-    return Create(TypedArray::Create(std::move(buffer), byte_offset, length));
-  }
+
   static ThisType* Create(DOMArrayBufferBase* buffer,
                           size_t byte_offset,
                           size_t length) {
@@ -44,20 +35,29 @@
     return MakeGarbageCollected<ThisType>(std::move(buffer_view), buffer);
   }
 
+  static ThisType* Create(size_t length) {
+    DOMArrayBuffer* buffer = DOMArrayBuffer::Create(length, sizeof(ValueType));
+    return Create(buffer, 0, length);
+  }
+
+  static ThisType* Create(const ValueType* array, size_t length) {
+    DOMArrayBuffer* buffer =
+        DOMArrayBuffer::Create(array, length * sizeof(ValueType));
+    return Create(buffer, 0, length);
+  }
+
   static ThisType* CreateOrNull(size_t length) {
-    scoped_refptr<ArrayBuffer> buffer =
-        ArrayBuffer::CreateOrNull(length, sizeof(ValueType));
+    DOMArrayBuffer* buffer =
+        DOMArrayBuffer::CreateOrNull(length, sizeof(ValueType));
     return buffer ? Create(std::move(buffer), 0, length) : nullptr;
   }
 
   static ThisType* CreateUninitializedOrNull(size_t length) {
-    scoped_refptr<ArrayBuffer> buffer =
-        ArrayBuffer::CreateOrNull(length, sizeof(ValueType));
-    return buffer ? Create(std::move(buffer), 0, length) : nullptr;
+    DOMArrayBuffer* buffer =
+        DOMArrayBuffer::CreateUninitializedOrNull(length, sizeof(ValueType));
+    return buffer ? Create(buffer, 0, length) : nullptr;
   }
 
-  explicit DOMTypedArray(scoped_refptr<TypedArray> buffer_view)
-      : DOMArrayBufferView(std::move(buffer_view)) {}
   DOMTypedArray(scoped_refptr<TypedArray> buffer_view,
                 DOMArrayBufferBase* dom_array_buffer)
       : DOMArrayBufferView(std::move(buffer_view), dom_array_buffer) {}
diff --git a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
index 7c956749..d1a9de4 100644
--- a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
@@ -95,9 +95,21 @@
 
   // Step 12.6. "Execute the Initialize a global object's CSP list algorithm
   // on worker global scope and response. [CSP]"
+  // SharedWorkerGlobalScope inherits the outside's CSP instead of the response
+  // CSP headers when the response's url's scheme is a local scheme. Otherwise,
+  // use the response CSP headers. Here a local scheme is defined as follows:
+  // "A local scheme is a scheme that is "about", "blob", or "data"."
+  // https://fetch.spec.whatwg.org/#local-scheme
+  //
+  // https://w3c.github.io/webappsec-csp/#initialize-global-object-csp
   // These should be called after SetAddressSpace() to correctly override the
   // address space by the "treat-as-public-address" CSP directive.
-  InitContentSecurityPolicyFromVector(response_csp_headers);
+  Vector<CSPHeaderAndType> csp_headers =
+      response_url.ProtocolIsAbout() || response_url.ProtocolIsData() ||
+              response_url.ProtocolIs("blob")
+          ? OutsideContentSecurityPolicyHeaders()
+          : response_csp_headers;
+  InitContentSecurityPolicyFromVector(csp_headers);
   BindContentSecurityPolicyToExecutionContext();
 
   OriginTrialContext::AddTokens(this, response_origin_trial_tokens);
diff --git a/third_party/blink/renderer/core/workers/worker_backing_thread.cc b/third_party/blink/renderer/core/workers/worker_backing_thread.cc
index d18082b..ea7ba504 100644
--- a/third_party/blink/renderer/core/workers/worker_backing_thread.cc
+++ b/third_party/blink/renderer/core/workers/worker_backing_thread.cc
@@ -83,8 +83,13 @@
   V8PerIsolateData::From(isolate_)->SetThreadDebugger(
       std::make_unique<WorkerThreadDebugger>(isolate_));
 
-  // Optimize for memory usage instead of latency for the worker isolate.
-  isolate_->IsolateInBackgroundNotification();
+  if (!RuntimeEnabledFeatures::V8OptimizeWorkersForPerformanceEnabled()) {
+    // Optimize for memory usage instead of latency for the worker isolate.
+    // Service Workers that have the fetch event handler run with the Isolate
+    // in foreground notification regardless of this configuration.
+    // See ServiceWorkerGlobalScope::SetFetchHandlerExistence().
+    isolate_->IsolateInBackgroundNotification();
+  }
 
   if (startup_data.heap_limit_mode ==
       WorkerBackingThreadStartupData::HeapLimitMode::kIncreasedForDebugging) {
diff --git a/third_party/blink/renderer/modules/encryptedmedia/media_key_system_access.cc b/third_party/blink/renderer/modules/encryptedmedia/media_key_system_access.cc
index 2c5dabc..1bd3ef9 100644
--- a/third_party/blink/renderer/modules/encryptedmedia/media_key_system_access.cc
+++ b/third_party/blink/renderer/modules/encryptedmedia/media_key_system_access.cc
@@ -98,7 +98,7 @@
         // accumulated configuration MUST still contain a encryptionScheme
         // field with a value of null, so that polyfills can detect the user
         // agent's support for the field without specifying specific values."
-        capability->setEncryptionSchemeToNull();
+        capability->setEncryptionScheme(String());
         break;
       case WebMediaKeySystemMediaCapability::EncryptionScheme::kCenc:
         capability->setEncryptionScheme("cenc");
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc b/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
index 4d06f1b..3599319 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
@@ -28,6 +28,7 @@
 #include <memory>
 
 #include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/numerics/safe_conversions.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.cc b/third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.cc
index b99decb0..0ac1b13 100644
--- a/third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.cc
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.h"
 
 #include "base/format_macros.h"
+#include "base/memory/ptr_util.h"
 #include "mojo/public/cpp/bindings/self_owned_associated_receiver.h"
 #include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_database_error.h"
diff --git a/third_party/blink/renderer/modules/mediacapturefromelement/canvas_capture_handler.cc b/third_party/blink/renderer/modules/mediacapturefromelement/canvas_capture_handler.cc
index 9fad65a8..ddd73e3 100644
--- a/third_party/blink/renderer/modules/mediacapturefromelement/canvas_capture_handler.cc
+++ b/third_party/blink/renderer/modules/mediacapturefromelement/canvas_capture_handler.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/rand_util.h"
 #include "gpu/command_buffer/client/raster_interface.h"
 #include "media/base/limits.h"
diff --git a/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.cc b/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.cc
index 0b870607..03ba6823 100644
--- a/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.cc
+++ b/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.h"
 
+#include "base/memory/ptr_util.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/public/platform/web_media_stream.h"
diff --git a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc
index 676810c..4d44191 100644
--- a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/location.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "media/base/video_codecs.h"
 #include "media/base/video_frame.h"
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc
index 4e4a456e..91400ad 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc
@@ -10,6 +10,7 @@
 #include <string>
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/stl_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_utils.cc b/third_party/blink/renderer/modules/mediastream/media_stream_utils.cc
index c8f392a4c..52957cc 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_utils.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_utils.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/modules/mediastream/media_stream_utils.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
 #include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h"
 #include "third_party/blink/public/web/modules/mediastream/media_stream_video_track.h"
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source_test.cc
index c653e92..87fab68 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_capturer_source_test.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "media/base/bind_to_current_loop.h"
 #include "mojo/public/cpp/bindings/remote.h"
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_renderer_sink_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_renderer_sink_test.cc
index 69d4a697..ce9215d 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_renderer_sink_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_renderer_sink_test.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "media/base/video_frame.h"
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_source_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_source_test.cc
index 3f1b005..b855dc1b 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_source_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_source_test.cc
@@ -5,6 +5,7 @@
 #include <string>
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc
index c217cfe..cea546b 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/callback.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind_test_util.h"
diff --git a/third_party/blink/renderer/modules/mediastream/mock_media_stream_registry.cc b/third_party/blink/renderer/modules/mediastream/mock_media_stream_registry.cc
index f3b62ce..1d451a6d 100644
--- a/third_party/blink/renderer/modules/mediastream/mock_media_stream_registry.cc
+++ b/third_party/blink/renderer/modules/mediastream/mock_media_stream_registry.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
 #include "third_party/blink/public/platform/web_media_stream_source.h"
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_client_test.cc b/third_party/blink/renderer/modules/mediastream/user_media_client_test.cc
index 3e9b7bfb..a2ee8157 100644
--- a/third_party/blink/renderer/modules/mediastream/user_media_client_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/user_media_client_test.cc
@@ -12,6 +12,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "media/audio/audio_device_description.h"
diff --git a/third_party/blink/renderer/modules/mediastream/video_track_adapter_unittest.cc b/third_party/blink/renderer/modules/mediastream/video_track_adapter_unittest.cc
index 579cbd4..c842b1a 100644
--- a/third_party/blink/renderer/modules/mediastream/video_track_adapter_unittest.cc
+++ b/third_party/blink/renderer/modules/mediastream/video_track_adapter_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <limits>
 
+#include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/test/bind_test_util.h"
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/dtls_transport_proxy.cc b/third_party/blink/renderer/modules/peerconnection/adapters/dtls_transport_proxy.cc
index 775a7bab..928bb4a 100644
--- a/third_party/blink/renderer/modules/peerconnection/adapters/dtls_transport_proxy.cc
+++ b/third_party/blink/renderer/modules/peerconnection/adapters/dtls_transport_proxy.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/modules/peerconnection/adapters/dtls_transport_proxy.h"
 
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/modules/peerconnection/adapters/web_rtc_cross_thread_copier.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.cc b/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.cc
index f602a2d..8b4cd82 100644
--- a/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.cc
+++ b/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/modules/peerconnection/adapters/web_rtc_cross_thread_copier.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
diff --git a/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source.cc b/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source.cc
index 8e9bf23..9ccc5663 100644
--- a/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source.cc
+++ b/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source.cc
@@ -7,6 +7,7 @@
 #include <stdint.h>
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/location.h"
 #include "base/single_thread_task_runner.h"
 #include "base/trace_event/trace_event.h"
diff --git a/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source_test.cc b/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source_test.cc
index 3fc2400..89b73eb 100644
--- a/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source_test.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/waitable_event.h"
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc
index 6a6a09d..d2e4202 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc
@@ -15,7 +15,9 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/waitable_event.h"
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_test.cc
index be5675b8..4fed7a75 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_test.cc
@@ -814,8 +814,7 @@
     return CallbackType::Create(v8_function);
   }
 
-  ScriptValue ToScriptValue(V8TestingScope& scope,
-                            const IDLDictionaryBase* value) {
+  ScriptValue ToScriptValue(V8TestingScope& scope, RTCOfferOptions* value) {
     v8::Isolate* isolate = scope.GetIsolate();
     return ScriptValue(isolate,
                        ToV8(value, scope.GetContext()->Global(), isolate));
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender_impl_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender_impl_test.cc
index 7407fccb..8d180e74 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender_impl_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender_impl_test.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver_impl_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver_impl_test.cc
index b524abf..7553443 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver_impl_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver_impl_test.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/optional.h"
 #include "base/run_loop.h"
diff --git a/third_party/blink/renderer/modules/peerconnection/transceiver_state_surfacer_test.cc b/third_party/blink/renderer/modules/peerconnection/transceiver_state_surfacer_test.cc
index 51c0ea50..d70aefb0 100644
--- a/third_party/blink/renderer/modules/peerconnection/transceiver_state_surfacer_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/transceiver_state_surfacer_test.cc
@@ -8,6 +8,7 @@
 #include <tuple>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map.cc
index 2f75f4e..36cab7d 100644
--- a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map.cc
+++ b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
 #include "third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h"
 
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map_test.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map_test.cc
index 4bb8b85..b1f4af0 100644
--- a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map_test.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_test.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_test.cc
index d49bee0..18ea868f 100644
--- a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_test.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_set_description_observer_test.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_set_description_observer_test.cc
index 91c550cc..1d81066 100644
--- a/third_party/blink/renderer/modules/peerconnection/webrtc_set_description_observer_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/webrtc_set_description_observer_test.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
index f4bd3fc3..af8e587 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
@@ -33,6 +33,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
diff --git a/third_party/blink/renderer/modules/webtransport/outgoing_stream_test.cc b/third_party/blink/renderer/modules/webtransport/outgoing_stream_test.cc
index 3e299bd..956f8ac 100644
--- a/third_party/blink/renderer/modules/webtransport/outgoing_stream_test.cc
+++ b/third_party/blink/renderer/modules/webtransport/outgoing_stream_test.cc
@@ -144,7 +144,7 @@
   auto* script_state = scope.GetScriptState();
   auto* writer =
       outgoing_stream->writable()->getWriter(script_state, ASSERT_NO_EXCEPTION);
-  auto buffer = ArrayBuffer::Create("*B", 2);
+  auto* buffer = DOMArrayBuffer::Create("*B", 2);
   // Create a view into the buffer with offset 1, ie. "B".
   auto* chunk = DOMUint8Array::Create(buffer, 1, 1);
   ScriptPromise result =
diff --git a/third_party/blink/renderer/platform/bindings/v8_binding.h b/third_party/blink/renderer/platform/bindings/v8_binding.h
index 3943ecd..c11a8996 100644
--- a/third_party/blink/renderer/platform/bindings/v8_binding.h
+++ b/third_party/blink/renderer/platform/bindings/v8_binding.h
@@ -46,6 +46,10 @@
 
 namespace blink {
 
+namespace bindings {
+class DictionaryBase;
+}
+
 // This file contains bindings helper functions that do not have dependencies
 // to core/ or bindings/core. For core-specific helper functions, see
 // bindings/core/v8/V8BindingForCore.h.
@@ -212,6 +216,14 @@
   V8SetReturnValue(callback_info, handle);
 }
 
+// Dictionary
+template <class CallbackInfo>
+void V8SetReturnValue(const CallbackInfo& info,
+                      bindings::DictionaryBase* value,
+                      v8::Local<v8::Object> creation_context) {
+  V8SetReturnValue(info, ToV8(value, creation_context, info.GetIsolate()));
+}
+
 // Convert v8::String to a WTF::String. If the V8 string is not already
 // an external string then it is transformed into an external string at this
 // point to avoid repeated conversions.
diff --git a/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc b/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc
index 00e755e..833971da 100644
--- a/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc
+++ b/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/platform/blob/blob_bytes_provider.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/task/post_task.h"
 #include "base/task/thread_pool.h"
diff --git a/third_party/blink/renderer/platform/graphics/test/mock_image_decoder.h b/third_party/blink/renderer/platform/graphics/test/mock_image_decoder.h
index 084d243..08bb8ba 100644
--- a/third_party/blink/renderer/platform/graphics/test/mock_image_decoder.h
+++ b/third_party/blink/renderer/platform/graphics/test/mock_image_decoder.h
@@ -29,6 +29,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "third_party/blink/renderer/platform/graphics/image_frame_generator.h"
 #include "third_party/blink/renderer/platform/image-decoders/image_decoder.h"
 
diff --git a/third_party/blink/renderer/platform/mediastream/aec_dump_agent_impl.cc b/third_party/blink/renderer/platform/mediastream/aec_dump_agent_impl.cc
index d0254a6..13ade0a 100644
--- a/third_party/blink/renderer/platform/mediastream/aec_dump_agent_impl.cc
+++ b/third_party/blink/renderer/platform/mediastream/aec_dump_agent_impl.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/platform/mediastream/aec_dump_agent_impl.h"
 
+#include "base/memory/ptr_util.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
 #include "third_party/blink/public/platform/platform.h"
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc
index 4449134..9434d0f4 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc
@@ -8,6 +8,7 @@
 #include <functional>
 #include <utility>
 
+#include "base/bind_helpers.h"
 #include "base/feature_list.h"
 #include "base/location.h"
 #include "base/logging.h"
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index e44625e..2dc506a5 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1751,6 +1751,10 @@
       name: "V8IdleTasks",
     },
     {
+      name: "V8OptimizeWorkersForPerformance",
+      status: "experimental",
+    },
+    {
       // Whether a video element should automatically play fullscreen unless
       // 'playsinline' is set.
       name: "VideoAutoFullscreen",
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
index 5e7e3d8..44238669 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/task/post_task.h"
diff --git a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
index 9aba4f0..7246638 100644
--- a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
+++ b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
@@ -17,6 +17,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/stl_util.h"
 #include "base/trace_event/trace_event.h"
diff --git a/third_party/blink/renderer/platform/wtf/allocator/allocator.h b/third_party/blink/renderer/platform/wtf/allocator/allocator.h
index a9bf35b5..f7cbf56 100644
--- a/third_party/blink/renderer/platform/wtf/allocator/allocator.h
+++ b/third_party/blink/renderer/platform/wtf/allocator/allocator.h
@@ -168,6 +168,9 @@
 WTF_EXPORT void AtomicMemcpy(void* to, const void* from, size_t bytes);
 template <size_t bytes>
 ALWAYS_INLINE void AtomicMemcpy(void* to, const void* from) {
+  static_assert(bytes > 0, "Number of copied bytes should be greater than 0");
+  DCHECK_EQ(0u, reinterpret_cast<size_t>(from) & (sizeof(size_t) - 1));
+  DCHECK_EQ(0u, reinterpret_cast<size_t>(to) & (sizeof(size_t) - 1));
   AtomicMemcpy(to, from, bytes);
 }
 
diff --git a/third_party/blink/renderer/platform/wtf/allocator/atomic_memcpy_test.cc b/third_party/blink/renderer/platform/wtf/allocator/atomic_memcpy_test.cc
index 10192ca..0ff27d46 100644
--- a/third_party/blink/renderer/platform/wtf/allocator/atomic_memcpy_test.cc
+++ b/third_party/blink/renderer/platform/wtf/allocator/atomic_memcpy_test.cc
@@ -12,12 +12,12 @@
 
 template <size_t buffer_size>
 void TestAtomicMemcpy() {
-  unsigned char src[buffer_size];
+  alignas(sizeof(size_t)) unsigned char src[buffer_size];
   for (size_t i = 0; i < buffer_size; ++i)
     src[i] = static_cast<char>(i + 1);
   // Allocating extra memory before and after the buffer to make sure the
   // atomic memcpy doesn't exceed the buffer in any direction.
-  unsigned char tgt[buffer_size + (2 * sizeof(size_t))];
+  alignas(sizeof(size_t)) unsigned char tgt[buffer_size + (2 * sizeof(size_t))];
   memset(tgt, 0, buffer_size + (2 * sizeof(size_t)));
   AtomicMemcpy<buffer_size>(tgt + sizeof(size_t), src);
   // Check nothing before the buffer was changed
diff --git a/third_party/blink/renderer/platform/wtf/hash_table.h b/third_party/blink/renderer/platform/wtf/hash_table.h
index 08886b6..c4ec5fe 100644
--- a/third_party/blink/renderer/platform/wtf/hash_table.h
+++ b/third_party/blink/renderer/platform/wtf/hash_table.h
@@ -25,6 +25,7 @@
 
 #include <memory>
 
+#include "base/bits.h"
 #include "base/numerics/checked_math.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/partition_allocator.h"
@@ -663,7 +664,7 @@
     return IsEmptyBucket(key) || IsDeletedBucket(key);
   }
   static bool IsEmptyOrDeletedBucketSafe(const Value& value) {
-    char buf[sizeof(Key)];
+    alignas(std::max(alignof(Key), sizeof(size_t))) char buf[sizeof(Key)];
     const Key& key = Extractor::ExtractSafe(value, &buf);
     return IsEmptyBucket(key) || IsDeletedBucket(key);
   }
diff --git a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
index f21dc6a..6b4b921 100644
--- a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
+++ b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
@@ -253,12 +253,16 @@
 crbug.com/982194 paint/invalidation/quotes.html [ Failure ]
 crbug.com/982194 paint/invalidation/reflection/reflection-with-rotation.html [ Failure ]
 crbug.com/982194 paint/invalidation/remove-inline-after-layout.html [ Failure ]
+crbug.com/982194 paint/invalidation/remove-inline-layer-after-layout.html [ Failure ]
+crbug.com/982194 paint/invalidation/position/absolute-display-block-to-none.html [ Failure ]
+crbug.com/982194 paint/invalidation/position/block-layout-inline-children-float-positioned.html [ Failure ]
 crbug.com/982194 paint/invalidation/scroll/layout-state-scrolloffset.html [ Failure ]
 crbug.com/982194 paint/invalidation/scroll/layout-state-scrolloffset2.html [ Failure ]
 crbug.com/982194 paint/invalidation/scroll/layout-state-scrolloffset3.html [ Failure ]
 crbug.com/982194 paint/invalidation/scroll/line-in-scrolled-clipped-block.html [ Failure ]
 crbug.com/982194 paint/invalidation/scroll/overflow-scroll-body-appear.html [ Failure ]
 crbug.com/982194 paint/invalidation/scroll/overflow-scroll-delete.html [ Failure ]
+crbug.com/982194 paint/invalidation/scroll/scrolled-iframe-scrollbar-change.html [ Failure ]
 crbug.com/982194 paint/invalidation/selection/selection-clear.html [ Failure ]
 crbug.com/982194 paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem.html [ Failure ]
 crbug.com/982194 paint/invalidation/svg/svg-background-partial-redraw.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index f455d28..b17c2a1 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2812,8 +2812,6 @@
 crbug.com/832071 virtual/cache-storage-eager-reading/external/wpt/service-workers/service-worker/worker-client-id.https.html [ Failure ]
 
 # failures in external/wpt/css/css-animations/ and web-animations/ from Mozilla tests
-crbug.com/849859 external/wpt/css/css-animations/CSSAnimation-pausing.tentative.html [ Failure ]
-crbug.com/849859 virtual/threaded/external/wpt/css/css-animations/CSSAnimation-pausing.tentative.html [ Failure ]
 crbug.com/849859 external/wpt/css/css-animations/Element-getAnimations-dynamic-changes.tentative.html [ Failure ]
 crbug.com/849859 virtual/threaded/external/wpt/css/css-animations/Element-getAnimations-dynamic-changes.tentative.html [ Failure ]
 
@@ -5704,7 +5702,6 @@
 
 # Sheriff 2019-03-28
 crbug.com/946890 external/wpt/html/semantics/embedded-content/media-elements/location-of-the-media-resource/currentSrc.html [ Failure Pass Crash ]
-crbug.com/946719 http/tests/serviceworker/resolve-after-window-close.html [ Crash Pass ]
 crbug.com/946714 [ Release ] http/tests/devtools/elements/styles-4/styles-live-locations-leak.js [ Pass Timeout ]
 crbug.com/946699 [ Release ] http/tests/devtools/network/network-filter-service-worker.js [ Pass Timeout ]
 crbug.com/946711 [ Release ] http/tests/devtools/editor/text-editor-search-switch-editor.js [ Crash Pass Timeout ]
@@ -6168,11 +6165,6 @@
 # Temporarily disabled to a breakpoint non-determinism issue.
 crbug.com/1019613 http/tests/devtools/sources/debugger/debug-inlined-scripts.js [ Pass Failure ]
 
-# eval+Trusted Types failures while the feature is implemented.
-external/wpt/trusted-types/eval-csp-no-tt.tentative.html [ Failure ]
-external/wpt/trusted-types/eval-no-csp-no-tt.tentative.html [ Failure ]
-external/wpt/trusted-types/eval-no-csp-no-tt-default-policy.tentative.html [ Failure ]
-
 # First frame not always painted in time
 crbug.com/1024976 media/controls/paint-controls-webkit-appearance-none.html [ Pass Failure ]
 crbug.com/1024976 media/controls/paint-controls-webkit-appearance-none-custom-bg.html [ Pass Failure ]
@@ -6762,3 +6754,6 @@
 crbug.com/1058073 [ Retina ] virtual/threaded/fast/scroll-snap/snap-to-target-on-layout-change.html [ Pass Failure ]
 crbug.com/1058073 [ Mac10.14 ] accessibility/content-changed-notification-causes-crash.html [ Pass Failure ]
 crbug.com/1058073 [ Retina ] accessibility/content-changed-notification-causes-crash.html [ Pass Failure ]
+
+# Sheriff 2020-03-06
+crbug.com/1058203 [ Mac10.11 ] virtual/form-controls-refresh-disabled/fast/forms/autofocus-opera-008.html [ Pass Failure ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json
index 2137fa76..6b03f67 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json
@@ -132682,6 +132682,9 @@
    "common/security-features/tools/generate.py": [
     []
    ],
+   "common/security-features/tools/spec.src.json": [
+    []
+   ],
    "common/security-features/tools/spec_validator.py": [
     []
    ],
@@ -172255,6 +172258,9 @@
    "interfaces/orientation-sensor.idl": [
     []
    ],
+   "interfaces/origin-policy.idl": [
+    []
+   ],
    "interfaces/page-visibility.idl": [
     []
    ],
@@ -173587,45 +173593,24 @@
    "mixed-content/README.md": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.keep-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.keep-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.swap-scheme.https.html.headers": [
     []
    ],
@@ -173635,18 +173620,12 @@
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-https.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-https.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-https.swap-scheme.https.html.headers": [
     []
    ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/cross-ws.keep-scheme.https-expected.txt": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https.html.headers": [
     []
    ],
@@ -173656,9 +173635,6 @@
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/same-ws.keep-scheme.https-expected.txt": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/same-ws.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/same-ws.no-redirect.https.html.headers": [
     []
    ],
@@ -173668,45 +173644,24 @@
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/same-wss.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.keep-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.keep-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.swap-scheme.https.html.headers": [
     []
    ],
@@ -173716,30 +173671,9 @@
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-https.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-https.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-https.swap-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-classic-data.meta/opt-in/fetch/cross-http.no-redirect.https-expected.txt": [
-    []
-   ],
-   "mixed-content/gen/sharedworker-classic-data.meta/opt-in/fetch/same-http.no-redirect.https-expected.txt": [
-    []
-   ],
-   "mixed-content/gen/sharedworker-classic-data.meta/opt-in/websocket/cross-ws.no-redirect.https-expected.txt": [
-    []
-   ],
-   "mixed-content/gen/sharedworker-classic-data.meta/opt-in/websocket/same-ws.no-redirect.https-expected.txt": [
-    []
-   ],
-   "mixed-content/gen/sharedworker-classic-data.meta/opt-in/xhr/cross-http.no-redirect.https-expected.txt": [
-    []
-   ],
-   "mixed-content/gen/sharedworker-classic-data.meta/opt-in/xhr/same-http.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-classic-data.meta/unset/fetch/cross-http.keep-scheme.https-expected.txt": [
     []
    ],
@@ -173794,45 +173728,24 @@
    "mixed-content/gen/sharedworker-classic-data.meta/unset/xhr/same-http.swap-scheme.https-expected.txt": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.keep-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.keep-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.swap-scheme.https.html.headers": [
     []
    ],
@@ -173842,18 +173755,12 @@
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-https.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-https.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-https.swap-scheme.https.html.headers": [
     []
    ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/cross-ws.keep-scheme.https-expected.txt": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https.html.headers": [
     []
    ],
@@ -173863,9 +173770,6 @@
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/same-ws.keep-scheme.https-expected.txt": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/same-ws.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/same-ws.no-redirect.https.html.headers": [
     []
    ],
@@ -173875,45 +173779,24 @@
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/same-wss.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.keep-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.keep-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.swap-scheme.https.html.headers": [
     []
    ],
@@ -173923,30 +173806,9 @@
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-https.no-redirect.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-https.swap-scheme.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-https.swap-scheme.https.html.headers": [
     []
    ],
-   "mixed-content/gen/sharedworker-module-data.meta/opt-in/fetch/cross-http.no-redirect.https-expected.txt": [
-    []
-   ],
-   "mixed-content/gen/sharedworker-module-data.meta/opt-in/fetch/same-http.no-redirect.https-expected.txt": [
-    []
-   ],
-   "mixed-content/gen/sharedworker-module-data.meta/opt-in/websocket/cross-ws.no-redirect.https-expected.txt": [
-    []
-   ],
-   "mixed-content/gen/sharedworker-module-data.meta/opt-in/websocket/same-ws.no-redirect.https-expected.txt": [
-    []
-   ],
-   "mixed-content/gen/sharedworker-module-data.meta/opt-in/xhr/cross-http.no-redirect.https-expected.txt": [
-    []
-   ],
-   "mixed-content/gen/sharedworker-module-data.meta/opt-in/xhr/same-http.no-redirect.https-expected.txt": [
-    []
-   ],
    "mixed-content/gen/sharedworker-module-data.meta/unset/fetch/cross-http.keep-scheme.https-expected.txt": [
     []
    ],
@@ -391640,7 +391502,7 @@
    "support"
   ],
   "common/security-features/README.md": [
-   "387e68334aeaaad68a71c3ffa32cf0ca05345b91",
+   "fb9a2f108f9faf68bb86f0bd9f848dbd28630ca4",
    "support"
   ],
   "common/security-features/resources/common.sub.js": [
@@ -391764,7 +391626,11 @@
    "support"
   ],
   "common/security-features/tools/generate.py": [
-   "3345d6520691de734977a18d73c94f71b446408a",
+   "057c4d81ef1e110be161360ea3f1ea092702d21d",
+   "support"
+  ],
+  "common/security-features/tools/spec.src.json": [
+   "7cf6a06c0f53492b7cb0f54b6db90688b649c1fc",
    "support"
   ],
   "common/security-features/tools/spec_validator.py": [
@@ -496888,7 +496754,7 @@
    "support"
   ],
   "fonts/math/axisheight5000-verticalarrow14000.woff": [
-   "9f5d59ae6a7fbf221fd14126645f1cbc7c25d286",
+   "70f366a3d0b7ec891fc4041584a1ddea55b0bc42",
    "support"
   ],
   "fonts/math/fraction-axisheight7000-rulethickness1000.woff": [
@@ -521875,6 +521741,10 @@
    "2ea3d38240e527f10af7ef392e0c0935a3750572",
    "support"
   ],
+  "interfaces/origin-policy.idl": [
+   "e48e0632bd89ff764fa9b3864207b39723a388cf",
+   "support"
+  ],
   "interfaces/page-visibility.idl": [
    "6b8bd52a047ce411b968a79e6d0f7d152ab32a57",
    "support"
@@ -524296,7 +524166,7 @@
    "support"
   ],
   "mathml/tools/axisheight.py": [
-   "43827e7031665bdd57ee54e208ea0f875a9a60ec",
+   "d588560b650af0d2cb995083f8fff366a542ca44",
    "support"
   ],
   "mathml/tools/fractions.py": [
@@ -525707,10 +525577,6 @@
    "488432d41ea61c18264c37310369dbd59ccb78ea",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https-expected.txt": [
-   "dad1f08a3aa4ac6cb189599f671e3e1b3f87863d",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https.html": [
    "b0509aabfca41b3d3324f52b29f83f0378aeb33d",
    "testharness"
@@ -525719,10 +525585,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.no-redirect.https-expected.txt": [
-   "da17c0d1644d627227303fefafb9a6f6b93b8109",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.no-redirect.https.html": [
    "cc0ed688bffdf8e022bf06a1b6974ed007bf06d7",
    "testharness"
@@ -525731,10 +525593,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https-expected.txt": [
-   "49e51e936dce97a6582b697c0d6f34d6173a3ec6",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https.html": [
    "bc62a02c53b73dfd13db42a13216beb008f29217",
    "testharness"
@@ -525743,10 +525601,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https-expected.txt": [
-   "4d45c42af0ad7d4154cd60a6d167ff3f1285202e",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https.html": [
    "265fc604ba6c9372d1aa0a5652eb0903506de934",
    "testharness"
@@ -525755,10 +525609,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.keep-scheme.https-expected.txt": [
-   "6b687fe228a554c11db7232d9ac6227fbb969f36",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.keep-scheme.https.html": [
    "50bffecc0babbb42ee3437e01d122f95ae65cde5",
    "testharness"
@@ -525767,10 +525617,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.no-redirect.https-expected.txt": [
-   "6b299efe174a96ea67f2ce0b0bfa3705306b7aa2",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.no-redirect.https.html": [
    "c5c4ea3e4af536039ec1d2f09bab61ae12124a59",
    "testharness"
@@ -525779,10 +525625,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.swap-scheme.https-expected.txt": [
-   "83c03ae0152d6d10c2f2acc8e0bbc382fb74480e",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.swap-scheme.https.html": [
    "06d806b8c71d9b8c58a49e0d4d8b9ccf6e6913b3",
    "testharness"
@@ -525807,10 +525649,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-https.swap-scheme.https-expected.txt": [
-   "1d4ba5759b716d4905a80b334bd7fd3a758bbbe5",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-https.swap-scheme.https.html": [
    "3b6b62822351dbb157ba9d6035906d937fadce51",
    "testharness"
@@ -525823,10 +525661,6 @@
    "71e61d1bc7bd39c39527b249d76a326a519b9c99",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https-expected.txt": [
-   "350dbc15e924732951eae513960a49644b56e324",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https.html": [
    "ae251cc0e81695390af92d9db78e250d3847e98e",
    "testharness"
@@ -525843,10 +525677,6 @@
    "b02166d5506422584d8ce2ff46f3b37da127b31b",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/same-ws.no-redirect.https-expected.txt": [
-   "60ad8d9d1c1a8294311083c7ac3647b921019389",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/same-ws.no-redirect.https.html": [
    "a4210bf851d4d6df0ec3a1ecef279db27037bd84",
    "testharness"
@@ -525867,10 +525697,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https-expected.txt": [
-   "b926d53402da866101a263ad49b19fa01874fac8",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https.html": [
    "6b8b55bd7ba44e1ae6150ab0e661442fa403a45a",
    "testharness"
@@ -525879,10 +525705,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.no-redirect.https-expected.txt": [
-   "de7926232aa1110e1e043edfc6223ddb833034ef",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.no-redirect.https.html": [
    "5228b54dff68ae9b3d097d7dbdb40c54ebb62583",
    "testharness"
@@ -525891,10 +525713,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https-expected.txt": [
-   "4b348cfc89825b32e9d9391c2334b70c5a7543ea",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https.html": [
    "ff790790a7346f803b775f08e9ef49f2b504cd19",
    "testharness"
@@ -525903,10 +525721,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https-expected.txt": [
-   "0572f5fc3c09f41bcc116e07a01485bf4e0d59e7",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https.html": [
    "3c21a9c2b3c1f822460702124a7db07d6917db2a",
    "testharness"
@@ -525915,10 +525729,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.keep-scheme.https-expected.txt": [
-   "9aa8ed071bbca16a5368c63b945b54c37350f14f",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.keep-scheme.https.html": [
    "d39ab537ef7f066e12cde0c7f4a776922765d702",
    "testharness"
@@ -525927,10 +525737,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.no-redirect.https-expected.txt": [
-   "370b823fa149d4f53d2d5bdbbf047c7ea62247be",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.no-redirect.https.html": [
    "77c2f5bd37546e2ac8ad629f74503602ee5f62d8",
    "testharness"
@@ -525939,10 +525745,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.swap-scheme.https-expected.txt": [
-   "f069eb2db72782aa44f1b0376a6aef78f9c17f65",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.swap-scheme.https.html": [
    "3f7f72e97d3aafe679d1113f09d7a71db9ba7994",
    "testharness"
@@ -525967,10 +525769,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-https.swap-scheme.https-expected.txt": [
-   "b9bac7806c7cee7c8610d412b110fc76ccdf8640",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-https.swap-scheme.https.html": [
    "67c5d06529546686b43acef37052be3d7fecdd0d",
    "testharness"
@@ -525979,18 +525777,10 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-classic-data.meta/opt-in/fetch/cross-http.no-redirect.https-expected.txt": [
-   "da17c0d1644d627227303fefafb9a6f6b93b8109",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.meta/opt-in/fetch/cross-http.no-redirect.https.html": [
    "5f3f28850482ef93c79d38030f5debf496545ebd",
    "testharness"
   ],
-  "mixed-content/gen/sharedworker-classic-data.meta/opt-in/fetch/same-http.no-redirect.https-expected.txt": [
-   "6b299efe174a96ea67f2ce0b0bfa3705306b7aa2",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.meta/opt-in/fetch/same-http.no-redirect.https.html": [
    "113475f56bcead1aa04c232738f6e7153f6567f2",
    "testharness"
@@ -525999,18 +525789,10 @@
    "6ff326f6c843fccf38d82eb34839f75084181fb5",
    "testharness"
   ],
-  "mixed-content/gen/sharedworker-classic-data.meta/opt-in/websocket/cross-ws.no-redirect.https-expected.txt": [
-   "350dbc15e924732951eae513960a49644b56e324",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.meta/opt-in/websocket/cross-ws.no-redirect.https.html": [
    "830e952b163a24f657dd342eb8968e83ef1205bb",
    "testharness"
   ],
-  "mixed-content/gen/sharedworker-classic-data.meta/opt-in/websocket/same-ws.no-redirect.https-expected.txt": [
-   "60ad8d9d1c1a8294311083c7ac3647b921019389",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.meta/opt-in/websocket/same-ws.no-redirect.https.html": [
    "0874821af9831f8239addfcc9cccc2026a62567a",
    "testharness"
@@ -526019,18 +525801,10 @@
    "efed3be63243918e7f432b8a5a3e9d1e46b35fbe",
    "testharness"
   ],
-  "mixed-content/gen/sharedworker-classic-data.meta/opt-in/xhr/cross-http.no-redirect.https-expected.txt": [
-   "de7926232aa1110e1e043edfc6223ddb833034ef",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.meta/opt-in/xhr/cross-http.no-redirect.https.html": [
    "16728b466c1eb2b975e1389ad247adba4896b730",
    "testharness"
   ],
-  "mixed-content/gen/sharedworker-classic-data.meta/opt-in/xhr/same-http.no-redirect.https-expected.txt": [
-   "370b823fa149d4f53d2d5bdbbf047c7ea62247be",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-classic-data.meta/opt-in/xhr/same-http.no-redirect.https.html": [
    "cc6dfb3919e954c0b72434433425320ed04f1a3d",
    "testharness"
@@ -526187,10 +525961,6 @@
    "fbc82944b8859fd7248ae6b59ddd0d866324646d",
    "testharness"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https-expected.txt": [
-   "dad1f08a3aa4ac6cb189599f671e3e1b3f87863d",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https.html": [
    "81730b6fff674c0e540e800413d07de36f11e3e9",
    "testharness"
@@ -526199,10 +525969,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.no-redirect.https-expected.txt": [
-   "da17c0d1644d627227303fefafb9a6f6b93b8109",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.no-redirect.https.html": [
    "4521d81f829d3a34b8bec7d1515c2af59c4c7c3a",
    "testharness"
@@ -526211,10 +525977,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https-expected.txt": [
-   "49e51e936dce97a6582b697c0d6f34d6173a3ec6",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https.html": [
    "4103eea607d724b04c2b9cfa7ab45c239d064087",
    "testharness"
@@ -526223,10 +525985,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https-expected.txt": [
-   "4d45c42af0ad7d4154cd60a6d167ff3f1285202e",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https.html": [
    "b6df291202847df578127b1e57fb66b0e0c1b515",
    "testharness"
@@ -526235,10 +525993,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.keep-scheme.https-expected.txt": [
-   "6b687fe228a554c11db7232d9ac6227fbb969f36",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.keep-scheme.https.html": [
    "d1eb0f503cdfa4f062abae212437ae176730932c",
    "testharness"
@@ -526247,10 +526001,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.no-redirect.https-expected.txt": [
-   "6b299efe174a96ea67f2ce0b0bfa3705306b7aa2",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.no-redirect.https.html": [
    "f40692e06dd65d572e5e37f4d996c01710dcc2b5",
    "testharness"
@@ -526259,10 +526009,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.swap-scheme.https-expected.txt": [
-   "83c03ae0152d6d10c2f2acc8e0bbc382fb74480e",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.swap-scheme.https.html": [
    "c6c615cedc2e1ab25d26fcdaa59bd234eec008c4",
    "testharness"
@@ -526287,10 +526033,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-https.swap-scheme.https-expected.txt": [
-   "1d4ba5759b716d4905a80b334bd7fd3a758bbbe5",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-https.swap-scheme.https.html": [
    "cc9db6f2368c9583a70edbdfd8a82b004dab3d53",
    "testharness"
@@ -526303,10 +526045,6 @@
    "71e61d1bc7bd39c39527b249d76a326a519b9c99",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https-expected.txt": [
-   "350dbc15e924732951eae513960a49644b56e324",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https.html": [
    "c491c86c1affa6e8d6063b7301084984a7c897e1",
    "testharness"
@@ -526323,10 +526061,6 @@
    "b02166d5506422584d8ce2ff46f3b37da127b31b",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/same-ws.no-redirect.https-expected.txt": [
-   "60ad8d9d1c1a8294311083c7ac3647b921019389",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/same-ws.no-redirect.https.html": [
    "a27cb53f973b93af3add107677b5831b98029251",
    "testharness"
@@ -526347,10 +526081,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https-expected.txt": [
-   "b926d53402da866101a263ad49b19fa01874fac8",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https.html": [
    "3d9b2bd2c1c35f780c15753d7309d7046e9a0861",
    "testharness"
@@ -526359,10 +526089,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.no-redirect.https-expected.txt": [
-   "de7926232aa1110e1e043edfc6223ddb833034ef",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.no-redirect.https.html": [
    "e62d92018b0791a39d5d875068b2d034e3226c52",
    "testharness"
@@ -526371,10 +526097,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https-expected.txt": [
-   "4b348cfc89825b32e9d9391c2334b70c5a7543ea",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https.html": [
    "6d84235e9602f2b8c34547b1c185150c7d3b1f53",
    "testharness"
@@ -526383,10 +526105,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https-expected.txt": [
-   "0572f5fc3c09f41bcc116e07a01485bf4e0d59e7",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https.html": [
    "1d632f8c28b31842ecff2606835974ba12fa0c4b",
    "testharness"
@@ -526395,10 +526113,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.keep-scheme.https-expected.txt": [
-   "9aa8ed071bbca16a5368c63b945b54c37350f14f",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.keep-scheme.https.html": [
    "a764ac3357988e829b3029dc9fa2cc6e18b24df0",
    "testharness"
@@ -526407,10 +526121,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.no-redirect.https-expected.txt": [
-   "370b823fa149d4f53d2d5bdbbf047c7ea62247be",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.no-redirect.https.html": [
    "f01205979dcbd848ff41185b501ab56cfa1380ca",
    "testharness"
@@ -526419,10 +526129,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.swap-scheme.https-expected.txt": [
-   "f069eb2db72782aa44f1b0376a6aef78f9c17f65",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.swap-scheme.https.html": [
    "3d33493d78adb2da877bf12f83d8ff79baac0289",
    "testharness"
@@ -526447,10 +526153,6 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-https.swap-scheme.https-expected.txt": [
-   "b9bac7806c7cee7c8610d412b110fc76ccdf8640",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-https.swap-scheme.https.html": [
    "fb5fddf4f020ecfed8054a8764ec50d509d8e27d",
    "testharness"
@@ -526459,18 +526161,10 @@
    "46e2255e388e9e08377d625b55653a007d59c14e",
    "support"
   ],
-  "mixed-content/gen/sharedworker-module-data.meta/opt-in/fetch/cross-http.no-redirect.https-expected.txt": [
-   "da17c0d1644d627227303fefafb9a6f6b93b8109",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.meta/opt-in/fetch/cross-http.no-redirect.https.html": [
    "3e21d61b0075bda17bd9f6c7885c4812c495467d",
    "testharness"
   ],
-  "mixed-content/gen/sharedworker-module-data.meta/opt-in/fetch/same-http.no-redirect.https-expected.txt": [
-   "6b299efe174a96ea67f2ce0b0bfa3705306b7aa2",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.meta/opt-in/fetch/same-http.no-redirect.https.html": [
    "34a2171d2888ab553ed988ad54192e96ed192043",
    "testharness"
@@ -526479,18 +526173,10 @@
    "5c5f7ff6cc6b905ca02596415e89f7f38f722802",
    "testharness"
   ],
-  "mixed-content/gen/sharedworker-module-data.meta/opt-in/websocket/cross-ws.no-redirect.https-expected.txt": [
-   "350dbc15e924732951eae513960a49644b56e324",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.meta/opt-in/websocket/cross-ws.no-redirect.https.html": [
    "bc124b75a75a918a0c7b133384a7b8afb56ec396",
    "testharness"
   ],
-  "mixed-content/gen/sharedworker-module-data.meta/opt-in/websocket/same-ws.no-redirect.https-expected.txt": [
-   "60ad8d9d1c1a8294311083c7ac3647b921019389",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.meta/opt-in/websocket/same-ws.no-redirect.https.html": [
    "005e78ac7baef8af36382ce534c589c3265f52b8",
    "testharness"
@@ -526499,18 +526185,10 @@
    "c6924cb90bc17a6db2334c5df2db54af20992f8d",
    "testharness"
   ],
-  "mixed-content/gen/sharedworker-module-data.meta/opt-in/xhr/cross-http.no-redirect.https-expected.txt": [
-   "de7926232aa1110e1e043edfc6223ddb833034ef",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.meta/opt-in/xhr/cross-http.no-redirect.https.html": [
    "add990f52bb6ad74aa29d547d829885605e91b75",
    "testharness"
   ],
-  "mixed-content/gen/sharedworker-module-data.meta/opt-in/xhr/same-http.no-redirect.https-expected.txt": [
-   "370b823fa149d4f53d2d5bdbbf047c7ea62247be",
-   "support"
-  ],
   "mixed-content/gen/sharedworker-module-data.meta/opt-in/xhr/same-http.no-redirect.https.html": [
    "421e4868935fc8df81ac4c09d59fd233d041c555",
    "testharness"
@@ -530412,7 +530090,7 @@
    "support"
   ],
   "mixed-content/generic/spec_json.js": [
-   "af9cf72857e5d640bad18b441f1d3c81bc44a2de",
+   "c36a535f45363654bfd7c8b86f3710995f769f63",
    "support"
   ],
   "mixed-content/generic/test-case.sub.js": [
@@ -530424,7 +530102,7 @@
    "testharness"
   ],
   "mixed-content/spec.src.json": [
-   "547dc97504029dcac4a006113d538f3813a2c2b6",
+   "16843700da8f314638aafaa517797152cab6f02f",
    "support"
   ],
   "mst-content-hint/META.yml": [
@@ -574880,7 +574558,7 @@
    "support"
   ],
   "referrer-policy/generic/spec_json.js": [
-   "a8b723d5a98f9748689faf31e95bd2c7a887b079",
+   "fbe59a2cc9cc5fec5ddd8a0d35354cca787dd515",
    "support"
   ],
   "referrer-policy/generic/subresource-test/area-navigate.html": [
@@ -574928,7 +574606,7 @@
    "testharness"
   ],
   "referrer-policy/spec.src.json": [
-   "d32ee80a8d2ce1edd57b09f919732eefa4f6caeb",
+   "9063428647a33acfefb5bd35a74f0f080de09510",
    "support"
   ],
   "remote-playback/META.yml": [
@@ -594796,7 +594474,7 @@
    "testharness"
   ],
   "upgrade-insecure-requests/generic/spec_json.js": [
-   "0adba4938d47d896fa2d343f58022cfa113615da",
+   "c0ef97148952f32e7c510b8a485f6d2da0e4a177",
    "support"
   ],
   "upgrade-insecure-requests/generic/test-case.sub.js": [
@@ -594888,7 +594566,7 @@
    "support"
   ],
   "upgrade-insecure-requests/spec.src.json": [
-   "70417038bcccc269cb5fb40df09dfe7ec0f7b578",
+   "d64315903aa66dd5c9ffd19bf862e96ac26b3a64",
    "support"
   ],
   "upgrade-insecure-requests/support/redirect-cors.py": [
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/resources/sec-ch-ua.py b/third_party/blink/web_tests/external/wpt/client-hints/resources/sec-ch-ua.py
index a14a27d..f77eee8c 100644
--- a/third_party/blink/web_tests/external/wpt/client-hints/resources/sec-ch-ua.py
+++ b/third_party/blink/web_tests/external/wpt/client-hints/resources/sec-ch-ua.py
@@ -5,7 +5,7 @@
     response.headers.set("Accept-CH-Lifetime", "10")
     response.content = '''
 <script>
-  window.opener.postMessage({ header: "%s" }, "*");
+  window.opener.postMessage({ header: '%s' }, "*");
 </script>
 Sec-CH-UA: %s
 ''' % (ua, ua)
diff --git a/third_party/blink/web_tests/external/wpt/css/css-animations/CSSAnimation-canceling.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-animations/CSSAnimation-canceling.tentative-expected.txt
deleted file mode 100644
index 113de1a..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-animations/CSSAnimation-canceling.tentative-expected.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-This is a testharness.js-based test.
-PASS Animated style is cleared after canceling a running CSS animation
-PASS Animated style is cleared after canceling a filling CSS animation
-PASS After canceling an animation, it can still be seeked
-PASS After canceling an animation, it can still be re-used
-PASS After canceling an animation, updating animation properties doesn't make it live again
-PASS After canceling an animation, updating animation-play-state doesn't make it live again
-PASS Setting animation-name to 'none' cancels the animation
-FAIL Setting display:none on an element cancel its animations assert_equals: expected "idle" but got "running"
-FAIL Setting display:none on an ancestor element cancels animations on descendants assert_equals: expected "idle" but got "running"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-animations/CSSAnimation-pausing.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-animations/CSSAnimation-pausing.tentative-expected.txt
new file mode 100644
index 0000000..c55bd4dd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-animations/CSSAnimation-pausing.tentative-expected.txt
@@ -0,0 +1,12 @@
+This is a testharness.js-based test.
+PASS play() overrides animation-play-state
+PASS play() does NOT override the animation-play-state if there was an error
+PASS pause() overrides animation-play-state
+FAIL reverse() overrides animation-play-state when it starts playing the animation assert_equals: Should still be running even after flipping the animation-play-state expected "running" but got "paused"
+PASS reverse() does NOT override animation-play-state if the animation is already running
+FAIL Setting the startTime to null overrides animation-play-state if the animation is already running assert_equals: Should still be paused even after flipping the animation-play-state expected "paused" but got "running"
+FAIL Setting the startTime to non-null overrides animation-play-state if the animation is paused assert_equals: Should still be running even after flipping the animation-play-state expected "running" but got "paused"
+PASS Setting the startTime to non-null does NOT override the animation-play-state if the animation is already running
+FAIL Setting the current time completes a pending pause assert_true: Animation is pause-pending expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-animations/CSSAnimation-playState.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-animations/CSSAnimation-playState.tentative-expected.txt
deleted file mode 100644
index a23c6e21..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-animations/CSSAnimation-playState.tentative-expected.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-This is a testharness.js-based test.
-PASS A new CSS animation is initially play-pending
-PASS Animation returns correct playState when paused
-PASS Animation.playState updates when paused by script
-FAIL Animation.playState updates when resumed by setting style assert_equals: Animation.playState reports running after updating animation-play-state (got: paused) expected "running" but got "paused"
-PASS Animation returns correct playState when canceled
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/placement/grid-placement-using-named-grid-lines-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/placement/grid-placement-using-named-grid-lines-004.html
new file mode 100644
index 0000000..c33b1a9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/placement/grid-placement-using-named-grid-lines-004.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid item placement with '&lt;integer&gt; && &lt;custom-ident&gt;' and auto repeat()</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
+<link rel="help" href="http://www.w3.org/TR/css-grid-1/#line-placement">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Grid placement algorithm is able to select the right line when using the '<integer> && <custom-ident>' syntax and there is an auto repeat().">
+<style>
+.grid {
+  display: grid;
+  width: 300px;
+  height: 300px;
+  grid-template-columns: [foo] repeat(auto-fill, 100px [foo]);
+  grid-template-rows: repeat(auto-fill, [foo] 100px);
+}
+.grid > div {
+  grid-area: 1 foo / 1 foo;
+  background: green;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="grid">
+  <div></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/placement/grid-placement-using-named-grid-lines-005.html b/third_party/blink/web_tests/external/wpt/css/css-grid/placement/grid-placement-using-named-grid-lines-005.html
new file mode 100644
index 0000000..20d92989
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/placement/grid-placement-using-named-grid-lines-005.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid item placement with implicit named line and auto repeat()</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
+<link rel="help" href="http://www.w3.org/TR/css-grid-1/#line-placement">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Grid placement algorithm is able to select the right line when defined implicitly with grid-template-areas.">
+<style>
+.grid {
+  display: grid;
+  width: 300px;
+  height: 300px;
+  grid-template-areas: "area";
+  grid-template-columns: repeat(auto-fill, 100px);
+  grid-template-rows: repeat(auto-fill, 100px) [area-end] 100px;
+}
+.grid > div {
+  grid-area: area;
+  background: green;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="grid">
+  <div></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/placement/grid-placement-using-named-grid-lines-006.html b/third_party/blink/web_tests/external/wpt/css/css-grid/placement/grid-placement-using-named-grid-lines-006.html
new file mode 100644
index 0000000..405858f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/placement/grid-placement-using-named-grid-lines-006.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid item placement with implicit named line, '&lt;integer&gt; && &lt;custom-ident&gt;', and auto repeat()</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
+<link rel="help" href="http://www.w3.org/TR/css-grid-1/#line-placement">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Grid placement algorithm is able to select the right line when defined implicitly with grid-template-areas, referenced using the '<integer> && <custom-ident>' syntax, and with auto repeat().">
+<style>
+.grid {
+  display: grid;
+  width: 300px;
+  height: 300px;
+  margin-left: -100px;
+  margin-top: -100px;
+  grid-template-areas: ". ." ". foo";
+  grid-template-columns: repeat(auto-fill, 100px) [foo-start];
+  grid-template-rows: repeat(auto-fill, 100px) [foo-start];
+}
+.grid > div {
+  grid-area: 1 foo-start / 1 foo-start;
+  background: green;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="grid">
+  <div></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/fonts/math/axisheight5000-verticalarrow14000.woff b/third_party/blink/web_tests/external/wpt/fonts/math/axisheight5000-verticalarrow14000.woff
index 9f5d59a..70f366a 100644
--- a/third_party/blink/web_tests/external/wpt/fonts/math/axisheight5000-verticalarrow14000.woff
+++ b/third_party/blink/web_tests/external/wpt/fonts/math/axisheight5000-verticalarrow14000.woff
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html
new file mode 100644
index 0000000..4c83c7e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/webrtc/dictionary-helper.js"></script>
+<script>
+  test(t => {
+    assert_true("userAgentData" in navigator);
+  }, "navigator.getUserAgent() is exposed.");
+
+  promise_test(async t => {
+    const uaData = navigator.userAgentData;
+    for (ua of uaData.uaList) {
+      assert_equals(typeof ua.brand, "string", "brand should be a string");
+      assert_equals(typeof ua.version, "string", "version should be a string");
+    }
+    assert_equals(typeof uaData.mobile, "boolean", "mobile should be a boolean");
+    const highEntropyData = await uaData.getHighEntropyValues(["platform", "platformVersion", "architecture", "model"]);
+    assert_equals(typeof highEntropyData["platform"], "string", "Platform brand should be a string");
+    assert_equals(typeof highEntropyData["platformVersion"], "string", "Platform version should be a string");
+    assert_equals(typeof highEntropyData["architecture"], "string", "Architecture should be a string");
+    assert_equals(typeof highEntropyData["model"], "string", "Model should be a string");
+    const highEntropyData2 = await uaData.getHighEntropyValues([]);
+    assert_equals(highEntropyData2["platform"], "", "Platform brand should be an empty string");
+    assert_equals(highEntropyData2["platformVersion"], "", "Platform version should be an empty string");
+    assert_equals(highEntropyData2["architecture"], "", "Architecture should be an empty string");
+    assert_equals(highEntropyData2["model"], "", "Model should be an empty string");
+  }, "navigator.getUserAgent() returns a UserAgentMetadata object.");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.tentative.https.html b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.tentative.https.html
deleted file mode 100644
index 5f0dba6..0000000
--- a/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.tentative.https.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/webrtc/dictionary-helper.js"></script>
-<script>
-  test(t => {
-    assert_true("getUserAgent" in navigator);
-  }, "navigator.getUserAgent() is exposed.");
-
-  promise_test(t => {
-    return navigator.getUserAgent()
-      .then(ua => {
-        // TODO(web-platform-tests/wpt#9106): Use `idlharness.js` once it supports dictionaries.
-        assert_string_field(ua, "brand");
-        assert_string_field(ua, "version");
-        assert_string_field(ua, "platform");
-        assert_string_field(ua, "architecture");
-        assert_string_field(ua, "model");
-      });
-  }, "navigator.getUserAgent() returns a UserAgentMetadata object.");
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/origin-policy.idl b/third_party/blink/web_tests/external/wpt/interfaces/origin-policy.idl
new file mode 100644
index 0000000..e48e063
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/interfaces/origin-policy.idl
@@ -0,0 +1,8 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into reffy-reports
+// (https://github.com/tidoust/reffy-reports)
+// Source: Origin Policy (https://wicg.github.io/origin-policy/)
+
+partial interface mixin WindowOrWorkerGlobalScope {
+  readonly attribute FrozenArray<DOMString> originPolicyIds;
+};
diff --git a/third_party/blink/web_tests/external/wpt/mathml/tools/axisheight.py b/third_party/blink/web_tests/external/wpt/mathml/tools/axisheight.py
index 43827e7..d588560 100755
--- a/third_party/blink/web_tests/external/wpt/mathml/tools/axisheight.py
+++ b/third_party/blink/web_tests/external/wpt/mathml/tools/axisheight.py
@@ -8,6 +8,7 @@
 v2 = 14 * mathfont.em
 f = mathfont.create("axisheight%d-verticalarrow%d" % (v1, v2))
 f.math.AxisHeight = v1
+f.math.MinConnectorOverlap = 0
 mathfont.createSquareGlyph(f, verticalArrowCodePoint)
 g = f.createChar(-1, "size1")
 mathfont.drawRectangleGlyph(g, mathfont.em, v2 / 2, 0)
@@ -18,6 +19,7 @@
 g = f.createChar(-1, "ext")
 mathfont.drawRectangleGlyph(g, mathfont.em, mathfont.em, 0)
 f[verticalArrowCodePoint].verticalVariants = "uni21A8 size1 size2"
+# Part: (glyphName, isExtender, startConnector, endConnector, fullAdvance)
 f[verticalArrowCodePoint].verticalComponents = \
-  (("bot", False, 0, 0, mathfont.em), ("ext", True, 0, 0, mathfont.em));
+  (("bot", False, 0, mathfont.em, v2 + v1), ("ext", True, mathfont.em, mathfont.em, mathfont.em));
 mathfont.save(f)
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https-expected.txt
deleted file mode 100644
index dad1f08..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to cross-http origin and keep-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.no-redirect.https-expected.txt
deleted file mode 100644
index da17c0d..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to cross-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https-expected.txt
deleted file mode 100644
index 49e51e936..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to cross-http origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https-expected.txt
deleted file mode 100644
index 4d45c42a..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to cross-https origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.keep-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.keep-scheme.https-expected.txt
deleted file mode 100644
index 6b687fe..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.keep-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to same-http origin and keep-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.no-redirect.https-expected.txt
deleted file mode 100644
index 6b299ef..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to same-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.swap-scheme.https-expected.txt
deleted file mode 100644
index 83c03ae..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-http.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to same-http origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-https.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-https.swap-scheme.https-expected.txt
deleted file mode 100644
index 1d4ba57..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/fetch/same-https.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to same-https origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https-expected.txt
deleted file mode 100644
index 350dbc15..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for websocket to cross-ws origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/same-ws.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/same-ws.no-redirect.https-expected.txt
deleted file mode 100644
index 60ad8d9d..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/websocket/same-ws.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for websocket to same-ws origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https-expected.txt
deleted file mode 100644
index b926d53..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to cross-http origin and keep-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.no-redirect.https-expected.txt
deleted file mode 100644
index de79262..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to cross-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https-expected.txt
deleted file mode 100644
index 4b348cf..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to cross-http origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https-expected.txt
deleted file mode 100644
index 0572f5fc..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to cross-https origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.keep-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.keep-scheme.https-expected.txt
deleted file mode 100644
index 9aa8ed07..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.keep-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to same-http origin and keep-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.no-redirect.https-expected.txt
deleted file mode 100644
index 370b823..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to same-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.swap-scheme.https-expected.txt
deleted file mode 100644
index f069eb2..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-http.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to same-http origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-https.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-https.swap-scheme.https-expected.txt
deleted file mode 100644
index b9bac78..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.http-rp/opt-in/xhr/same-https.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to same-https origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/fetch/cross-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/fetch/cross-http.no-redirect.https-expected.txt
deleted file mode 100644
index da17c0d..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/fetch/cross-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to cross-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/fetch/same-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/fetch/same-http.no-redirect.https-expected.txt
deleted file mode 100644
index 6b299ef..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/fetch/same-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to same-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/websocket/cross-ws.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/websocket/cross-ws.no-redirect.https-expected.txt
deleted file mode 100644
index 350dbc15..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/websocket/cross-ws.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for websocket to cross-ws origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/websocket/same-ws.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/websocket/same-ws.no-redirect.https-expected.txt
deleted file mode 100644
index 60ad8d9d..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/websocket/same-ws.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for websocket to same-ws origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/xhr/cross-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/xhr/cross-http.no-redirect.https-expected.txt
deleted file mode 100644
index de79262..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/xhr/cross-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to cross-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/xhr/same-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/xhr/same-http.no-redirect.https-expected.txt
deleted file mode 100644
index 370b823..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-classic-data.meta/opt-in/xhr/same-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to same-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https-expected.txt
deleted file mode 100644
index dad1f08..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.keep-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to cross-http origin and keep-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.no-redirect.https-expected.txt
deleted file mode 100644
index da17c0d..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to cross-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https-expected.txt
deleted file mode 100644
index 49e51e936..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-http.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to cross-http origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https-expected.txt
deleted file mode 100644
index 4d45c42a..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/cross-https.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to cross-https origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.keep-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.keep-scheme.https-expected.txt
deleted file mode 100644
index 6b687fe..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.keep-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to same-http origin and keep-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.no-redirect.https-expected.txt
deleted file mode 100644
index 6b299ef..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to same-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.swap-scheme.https-expected.txt
deleted file mode 100644
index 83c03ae..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-http.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to same-http origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-https.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-https.swap-scheme.https-expected.txt
deleted file mode 100644
index 1d4ba57..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/fetch/same-https.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to same-https origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https-expected.txt
deleted file mode 100644
index 350dbc15..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/cross-ws.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for websocket to cross-ws origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/same-ws.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/same-ws.no-redirect.https-expected.txt
deleted file mode 100644
index 60ad8d9d..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/websocket/same-ws.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for websocket to same-ws origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https-expected.txt
deleted file mode 100644
index b926d53..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.keep-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to cross-http origin and keep-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.no-redirect.https-expected.txt
deleted file mode 100644
index de79262..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to cross-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https-expected.txt
deleted file mode 100644
index 4b348cf..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-http.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to cross-http origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https-expected.txt
deleted file mode 100644
index 0572f5fc..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/cross-https.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to cross-https origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.keep-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.keep-scheme.https-expected.txt
deleted file mode 100644
index 9aa8ed07..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.keep-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to same-http origin and keep-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.no-redirect.https-expected.txt
deleted file mode 100644
index 370b823..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to same-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.swap-scheme.https-expected.txt
deleted file mode 100644
index f069eb2..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-http.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to same-http origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-https.swap-scheme.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-https.swap-scheme.https-expected.txt
deleted file mode 100644
index b9bac78..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.http-rp/opt-in/xhr/same-https.swap-scheme.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to same-https origin and swap-scheme redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/fetch/cross-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/fetch/cross-http.no-redirect.https-expected.txt
deleted file mode 100644
index da17c0d..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/fetch/cross-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to cross-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/fetch/same-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/fetch/same-http.no-redirect.https-expected.txt
deleted file mode 100644
index 6b299ef..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/fetch/same-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for fetch to same-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/websocket/cross-ws.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/websocket/cross-ws.no-redirect.https-expected.txt
deleted file mode 100644
index 350dbc15..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/websocket/cross-ws.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for websocket to cross-ws origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/websocket/same-ws.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/websocket/same-ws.no-redirect.https-expected.txt
deleted file mode 100644
index 60ad8d9d..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/websocket/same-ws.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for websocket to same-ws origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/xhr/cross-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/xhr/cross-http.no-redirect.https-expected.txt
deleted file mode 100644
index de79262..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/xhr/cross-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to cross-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/xhr/same-http.no-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/xhr/same-http.no-redirect.https-expected.txt
deleted file mode 100644
index 370b823..0000000
--- a/third_party/blink/web_tests/external/wpt/mixed-content/gen/sharedworker-module-data.meta/opt-in/xhr/same-http.no-redirect.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Mixed-Content: Expects blocked for xhr to same-http origin and no-redirect redirection from https context. assert_equals: The resource request should be 'blocked'. expected "blocked" but got "allowed"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/eval-csp-no-tt.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/trusted-types/eval-csp-no-tt.tentative-expected.txt
new file mode 100644
index 0000000..fbec6cd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/trusted-types/eval-csp-no-tt.tentative-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+FAIL eval of TrustedScript works. assert_equals: expected (number) 2 but got (object) object "1+1"
+PASS eval of string works.
+PASS eval of !TrustedScript and !string works.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/eval-no-csp-no-tt-default-policy.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/trusted-types/eval-no-csp-no-tt-default-policy.tentative-expected.txt
new file mode 100644
index 0000000..1d20a7b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/trusted-types/eval-no-csp-no-tt-default-policy.tentative-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+FAIL eval of TrustedScript works. assert_equals: expected (number) 2 but got (object) object "1+1"
+PASS eval of string works and does not call a default policy.
+PASS eval of !TrustedScript and !string works.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/eval-no-csp-no-tt.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/trusted-types/eval-no-csp-no-tt.tentative-expected.txt
new file mode 100644
index 0000000..fbec6cd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/trusted-types/eval-no-csp-no-tt.tentative-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+FAIL eval of TrustedScript works. assert_equals: expected (number) 2 but got (object) object "1+1"
+PASS eval of string works.
+PASS eval of !TrustedScript and !string works.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any-expected.txt b/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any-expected.txt
deleted file mode 100644
index 60a27f3a..0000000
--- a/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-This is a testharness.js-based test.
-PASS Response with Content-Type "": compileStreaming
-PASS Response with Content-Type "": instantiateStreaming
-PASS Response with Content-Type "application/javascript": compileStreaming
-PASS Response with Content-Type "application/javascript": instantiateStreaming
-PASS Response with Content-Type "application/octet-stream": compileStreaming
-PASS Response with Content-Type "application/octet-stream": instantiateStreaming
-PASS Response with Content-Type "text/wasm": compileStreaming
-PASS Response with Content-Type "text/wasm": instantiateStreaming
-FAIL Response with Content-Type "application/wasm;": compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;": instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;x": compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;x": instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;charset=UTF-8": compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;charset=UTF-8": instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-PASS Response with Content-Type "application/wasm": compileStreaming
-FAIL Response with Content-Type "application/wasm": instantiateStreaming assert_array_equals: matching export keys lengths differ, expected array [] length 0, got ["increment"] length 1
-PASS Response with Content-Type "APPLICATION/wasm": compileStreaming
-FAIL Response with Content-Type "APPLICATION/wasm": instantiateStreaming assert_array_equals: matching export keys lengths differ, expected array [] length 0, got ["increment"] length 1
-PASS Response with Content-Type "APPLICATION/WASM": compileStreaming
-FAIL Response with Content-Type "APPLICATION/WASM": instantiateStreaming assert_array_equals: matching export keys lengths differ, expected array [] length 0, got ["increment"] length 1
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any.js b/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any.js
index 713fd70..e9ca93a 100644
--- a/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any.js
+++ b/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any.js
@@ -40,6 +40,15 @@
   promise_test(async t => {
     const response = fetch(`/wasm/incrementer.wasm?pipe=header(Content-Type,${encodeURIComponent(contenttype)})`);
     const result = await WebAssembly.instantiateStreaming(response);
-    assert_WebAssemblyInstantiatedSource(result);
+    assert_WebAssemblyInstantiatedSource(
+        result,
+        {
+          "increment": {
+            "kind": "function",
+            "name": "0",
+            "length": 1
+          }
+        }
+      );
   }, `Response with Content-Type ${format_value(contenttype)}: instantiateStreaming`);
 }
diff --git a/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any.serviceworker-expected.txt
deleted file mode 100644
index 60a27f3a..0000000
--- a/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any.serviceworker-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-This is a testharness.js-based test.
-PASS Response with Content-Type "": compileStreaming
-PASS Response with Content-Type "": instantiateStreaming
-PASS Response with Content-Type "application/javascript": compileStreaming
-PASS Response with Content-Type "application/javascript": instantiateStreaming
-PASS Response with Content-Type "application/octet-stream": compileStreaming
-PASS Response with Content-Type "application/octet-stream": instantiateStreaming
-PASS Response with Content-Type "text/wasm": compileStreaming
-PASS Response with Content-Type "text/wasm": instantiateStreaming
-FAIL Response with Content-Type "application/wasm;": compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;": instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;x": compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;x": instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;charset=UTF-8": compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;charset=UTF-8": instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-PASS Response with Content-Type "application/wasm": compileStreaming
-FAIL Response with Content-Type "application/wasm": instantiateStreaming assert_array_equals: matching export keys lengths differ, expected array [] length 0, got ["increment"] length 1
-PASS Response with Content-Type "APPLICATION/wasm": compileStreaming
-FAIL Response with Content-Type "APPLICATION/wasm": instantiateStreaming assert_array_equals: matching export keys lengths differ, expected array [] length 0, got ["increment"] length 1
-PASS Response with Content-Type "APPLICATION/WASM": compileStreaming
-FAIL Response with Content-Type "APPLICATION/WASM": instantiateStreaming assert_array_equals: matching export keys lengths differ, expected array [] length 0, got ["increment"] length 1
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any.sharedworker-expected.txt
deleted file mode 100644
index 60a27f3a..0000000
--- a/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any.sharedworker-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-This is a testharness.js-based test.
-PASS Response with Content-Type "": compileStreaming
-PASS Response with Content-Type "": instantiateStreaming
-PASS Response with Content-Type "application/javascript": compileStreaming
-PASS Response with Content-Type "application/javascript": instantiateStreaming
-PASS Response with Content-Type "application/octet-stream": compileStreaming
-PASS Response with Content-Type "application/octet-stream": instantiateStreaming
-PASS Response with Content-Type "text/wasm": compileStreaming
-PASS Response with Content-Type "text/wasm": instantiateStreaming
-FAIL Response with Content-Type "application/wasm;": compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;": instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;x": compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;x": instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;charset=UTF-8": compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;charset=UTF-8": instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-PASS Response with Content-Type "application/wasm": compileStreaming
-FAIL Response with Content-Type "application/wasm": instantiateStreaming assert_array_equals: matching export keys lengths differ, expected array [] length 0, got ["increment"] length 1
-PASS Response with Content-Type "APPLICATION/wasm": compileStreaming
-FAIL Response with Content-Type "APPLICATION/wasm": instantiateStreaming assert_array_equals: matching export keys lengths differ, expected array [] length 0, got ["increment"] length 1
-PASS Response with Content-Type "APPLICATION/WASM": compileStreaming
-FAIL Response with Content-Type "APPLICATION/WASM": instantiateStreaming assert_array_equals: matching export keys lengths differ, expected array [] length 0, got ["increment"] length 1
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any.worker-expected.txt
deleted file mode 100644
index 60a27f3a..0000000
--- a/third_party/blink/web_tests/external/wpt/wasm/webapi/contenttype.any.worker-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-This is a testharness.js-based test.
-PASS Response with Content-Type "": compileStreaming
-PASS Response with Content-Type "": instantiateStreaming
-PASS Response with Content-Type "application/javascript": compileStreaming
-PASS Response with Content-Type "application/javascript": instantiateStreaming
-PASS Response with Content-Type "application/octet-stream": compileStreaming
-PASS Response with Content-Type "application/octet-stream": instantiateStreaming
-PASS Response with Content-Type "text/wasm": compileStreaming
-PASS Response with Content-Type "text/wasm": instantiateStreaming
-FAIL Response with Content-Type "application/wasm;": compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;": instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;x": compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;x": instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;charset=UTF-8": compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Response with Content-Type "application/wasm;charset=UTF-8": instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-PASS Response with Content-Type "application/wasm": compileStreaming
-FAIL Response with Content-Type "application/wasm": instantiateStreaming assert_array_equals: matching export keys lengths differ, expected array [] length 0, got ["increment"] length 1
-PASS Response with Content-Type "APPLICATION/wasm": compileStreaming
-FAIL Response with Content-Type "APPLICATION/wasm": instantiateStreaming assert_array_equals: matching export keys lengths differ, expected array [] length 0, got ["increment"] length 1
-PASS Response with Content-Type "APPLICATION/WASM": compileStreaming
-FAIL Response with Content-Type "APPLICATION/WASM": instantiateStreaming assert_array_equals: matching export keys lengths differ, expected array [] length 0, got ["increment"] length 1
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
index 68ded29f..511c541 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: line 124: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 124: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests access of cached DOMWindow properties after the associated frame is navigated. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -63,6 +63,9 @@
 PASS window.cached_navigator_usb.ondisconnect is null
 PASS window.cached_navigator_userActivation.hasBeenActive is false
 PASS window.cached_navigator_userActivation.isActive is false
+PASS window.cached_navigator_userAgentData.mobile is false
+PASS window.cached_navigator_userAgentData.uaList[0].brand is ''
+PASS window.cached_navigator_userAgentData.uaList[0].version is ''
 PASS window.cached_navigator_xr.ondevicechange is null
 PASS window.cached_performance.onresourcetimingbufferfull is null
 PASS window.cached_performance_navigation.redirectCount is 0
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated.html b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated.html
index 2d071177..8e27624 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated.html
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated.html
@@ -13,7 +13,7 @@
 {
     if (path.length < 2)
         return;
-    var propertyDir = path.slice(0, -1).join('.');
+    var propertyDir = getPropertyPath(path, path.length - 1);
     var cachedPropertyDir = "cached_" + propertyDir.replace('.', '_');
     window[cachedPropertyDir] = eval("childWindow." + propertyDir);
     propertiesToVerify.push({
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
index dc8e3a1..8812e3a 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: line 124: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 124: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests access of cached DOMWindow properties after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -63,6 +63,9 @@
 PASS window.cached_navigator_usb.ondisconnect is null
 PASS window.cached_navigator_userActivation.hasBeenActive is false
 PASS window.cached_navigator_userActivation.isActive is false
+PASS window.cached_navigator_userAgentData.mobile is false
+PASS window.cached_navigator_userAgentData.uaList[0].brand is ''
+PASS window.cached_navigator_userAgentData.uaList[0].version is ''
 PASS window.cached_navigator_xr.ondevicechange is null
 PASS window.cached_performance.onresourcetimingbufferfull is null
 PASS window.cached_performance_navigation.redirectCount is 0
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced.html b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced.html
index ca8b5241..1f45780 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced.html
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced.html
@@ -13,7 +13,7 @@
 {
     if (path.length < 2)
         return;
-    var propertyDir = path.slice(0, -1).join('.');
+    var propertyDir = getPropertyPath(path, path.length - 1);
     var cachedPropertyDir = "cached_" + propertyDir.replace('.', '_');
     window[cachedPropertyDir] = eval("childWindow." + propertyDir);
     propertiesToVerify.push({
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
index 616d700..5d0b1b54 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: line 124: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 124: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests access of cached DOMWindow properties after the associated frame is no longer in a web page. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -63,6 +63,9 @@
 PASS window.cached_navigator_usb.ondisconnect is null
 PASS window.cached_navigator_userActivation.hasBeenActive is false
 PASS window.cached_navigator_userActivation.isActive is false
+PASS window.cached_navigator_userAgentData.mobile is false
+PASS window.cached_navigator_userAgentData.uaList[0].brand is ''
+PASS window.cached_navigator_userAgentData.uaList[0].version is ''
 PASS window.cached_navigator_xr.ondevicechange is null
 PASS window.cached_performance.onresourcetimingbufferfull is null
 PASS window.cached_performance_navigation.redirectCount is 0
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed.html b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed.html
index 63e260564..fbe9aae8 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed.html
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed.html
@@ -12,7 +12,7 @@
 {
     if (path.length < 2)
         return;
-    var propertyDir = path.slice(0, -1).join('.');
+    var propertyDir = getPropertyPath(path, path.length - 1);
     var cachedPropertyDir = "cached_" + propertyDir.replace('.', '_');
     window[cachedPropertyDir] = eval("childWindow." + propertyDir);
     propertiesToVerify.push({
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
index 7409e8a..af52739 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: line 124: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 124: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests property access on a cached DOMWindow after the associated frame is navigated. Test should not crash and properties read from the cached DOMWindow should be identical to properties through the 'current' DOMWindow.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -70,6 +70,9 @@
 PASS oldChildWindow.navigator.userActivation.hasBeenActive is newChildWindow.navigator.userActivation.hasBeenActive
 PASS oldChildWindow.navigator.userActivation.isActive is newChildWindow.navigator.userActivation.isActive
 PASS oldChildWindow.navigator.userAgent is newChildWindow.navigator.userAgent
+PASS oldChildWindow.navigator.userAgentData.mobile is newChildWindow.navigator.userAgentData.mobile
+PASS oldChildWindow.navigator.userAgentData.uaList[0].brand is newChildWindow.navigator.userAgentData.uaList[0].brand
+PASS oldChildWindow.navigator.userAgentData.uaList[0].version is newChildWindow.navigator.userAgentData.uaList[0].version
 PASS oldChildWindow.navigator.vendor is newChildWindow.navigator.vendor
 PASS oldChildWindow.navigator.vendorSub is newChildWindow.navigator.vendorSub
 PASS oldChildWindow.navigator.xr.ondevicechange is newChildWindow.navigator.xr.ondevicechange
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated.html b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated.html
index 200adb8..9feb6148 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated.html
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated.html
@@ -12,7 +12,7 @@
 
 function insertExpectedResult(path, expected)
 {
-    var propertyPath = path.join('.');
+    var propertyPath = getPropertyPath(path, path.length);
     propertiesToVerify.push({'property': "oldChildWindow." + propertyPath, 'expected': "newChildWindow." + propertyPath});
 }
 
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
index a3bcea8..a45f49d 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: line 124: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 124: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests property access on a cached DOMWindow after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
index a05137f..14f092c 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: line 124: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 124: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests property access on a cached DOMWindow after the associated frame is no longer in a web page. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/Window/resources/window-property-collector.js b/third_party/blink/web_tests/fast/dom/Window/resources/window-property-collector.js
index 37f1349..0a860726 100644
--- a/third_party/blink/web_tests/fast/dom/Window/resources/window-property-collector.js
+++ b/third_party/blink/web_tests/fast/dom/Window/resources/window-property-collector.js
@@ -12,6 +12,20 @@
     });
 }
 
+function getPropertyPath(path, length)
+{
+    var propertyDir = path[0];
+    for (var i = 1; i < length; ++i) {
+      var part = path[i];
+      if (part == "0") {
+        propertyDir += "[" + part + "]";
+      } else {
+        propertyDir += "." + part;
+      }
+    }
+    return propertyDir;
+}
+
 function emitExpectedResult(path, expected)
 {
     // Skip internals properties, since they aren't web accessible.
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/interception-redirect-client-hint-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/network/interception-redirect-client-hint-expected.txt
index d63d4b7..66aad9bc 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/network/interception-redirect-client-hint-expected.txt
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/interception-redirect-client-hint-expected.txt
@@ -1,8 +1,8 @@
 Test that UA client hints are added on redirect.
 
 Got request: GET http://127.0.1.1:8000/whatever
-sec-ch-ua: content_shell 99
+sec-ch-ua: "content_shell"; v="99"
 Got request: GET http://127.0.0.1:8000/devtools/resources/empty.html
-sec-ch-ua: content_shell 99
+sec-ch-ua: "content_shell"; v="99"
 dpr: 1
 
diff --git a/third_party/blink/web_tests/http/tests/navigation/form-targets-cross-site-frame-get-expected.txt b/third_party/blink/web_tests/http/tests/navigation/form-targets-cross-site-frame-get-expected.txt
index dc6b7e65..be0718c 100644
--- a/third_party/blink/web_tests/http/tests/navigation/form-targets-cross-site-frame-get-expected.txt
+++ b/third_party/blink/web_tests/http/tests/navigation/form-targets-cross-site-frame-get-expected.txt
@@ -14,7 +14,7 @@
 HTTP_CONNECTION = keep-alive
 HTTP_HOST = localhost:8080
 HTTP_REFERER = http://127.0.0.1:8000/navigation/form-targets-cross-site-frame-get.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = iframe
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/navigation/form-targets-cross-site-frame-no-referrer-expected.txt b/third_party/blink/web_tests/http/tests/navigation/form-targets-cross-site-frame-no-referrer-expected.txt
index 668305e..d2bffc41 100644
--- a/third_party/blink/web_tests/http/tests/navigation/form-targets-cross-site-frame-no-referrer-expected.txt
+++ b/third_party/blink/web_tests/http/tests/navigation/form-targets-cross-site-frame-no-referrer-expected.txt
@@ -15,7 +15,7 @@
 HTTP_CONNECTION = keep-alive
 HTTP_HOST = localhost:8080
 HTTP_ORIGIN = null
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = iframe
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/navigation/form-targets-cross-site-frame-post-expected.txt b/third_party/blink/web_tests/http/tests/navigation/form-targets-cross-site-frame-post-expected.txt
index cead3ca4..5e42a95 100644
--- a/third_party/blink/web_tests/http/tests/navigation/form-targets-cross-site-frame-post-expected.txt
+++ b/third_party/blink/web_tests/http/tests/navigation/form-targets-cross-site-frame-post-expected.txt
@@ -16,7 +16,7 @@
 HTTP_HOST = localhost:8080
 HTTP_ORIGIN = http://127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/navigation/form-targets-cross-site-frame-post.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = iframe
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/navigation/form-with-enctype-targets-cross-site-frame-expected.txt b/third_party/blink/web_tests/http/tests/navigation/form-with-enctype-targets-cross-site-frame-expected.txt
index 9e548e2..a62ae43 100644
--- a/third_party/blink/web_tests/http/tests/navigation/form-with-enctype-targets-cross-site-frame-expected.txt
+++ b/third_party/blink/web_tests/http/tests/navigation/form-with-enctype-targets-cross-site-frame-expected.txt
@@ -16,7 +16,7 @@
 HTTP_HOST = localhost:8080
 HTTP_ORIGIN = http://127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/navigation/form-with-enctype-targets-cross-site-frame.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = iframe
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/navigation/post-basic-expected.txt b/third_party/blink/web_tests/http/tests/navigation/post-basic-expected.txt
index c29a6561..ad182a3 100644
--- a/third_party/blink/web_tests/http/tests/navigation/post-basic-expected.txt
+++ b/third_party/blink/web_tests/http/tests/navigation/post-basic-expected.txt
@@ -12,7 +12,7 @@
 HTTP_HOST = 127.0.0.1:8000
 HTTP_ORIGIN = http://127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/navigation/resources/page-that-posts.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = document
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/navigation/post-frames-expected.txt b/third_party/blink/web_tests/http/tests/navigation/post-frames-expected.txt
index f35617543..4cb3cb85 100644
--- a/third_party/blink/web_tests/http/tests/navigation/post-frames-expected.txt
+++ b/third_party/blink/web_tests/http/tests/navigation/post-frames-expected.txt
@@ -17,7 +17,7 @@
 HTTP_HOST = 127.0.0.1:8000
 HTTP_ORIGIN = http://127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/navigation/resources/page-that-posts.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = iframe
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/navigation/post-frames-goback1-expected.txt b/third_party/blink/web_tests/http/tests/navigation/post-frames-goback1-expected.txt
index a765e4a..6bae59d 100644
--- a/third_party/blink/web_tests/http/tests/navigation/post-frames-goback1-expected.txt
+++ b/third_party/blink/web_tests/http/tests/navigation/post-frames-goback1-expected.txt
@@ -16,7 +16,7 @@
 HTTP_HOST = 127.0.0.1:8000
 HTTP_ORIGIN = http://127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/navigation/post-frames-goback1.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = iframe
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/navigation/post-goback1-expected.txt b/third_party/blink/web_tests/http/tests/navigation/post-goback1-expected.txt
index 2a766ae6..a281811 100644
--- a/third_party/blink/web_tests/http/tests/navigation/post-goback1-expected.txt
+++ b/third_party/blink/web_tests/http/tests/navigation/post-goback1-expected.txt
@@ -12,7 +12,7 @@
 HTTP_HOST = 127.0.0.1:8000
 HTTP_ORIGIN = http://127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/navigation/resources/page-that-posts.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = document
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/navigation/rename-subframe-goback-expected.txt b/third_party/blink/web_tests/http/tests/navigation/rename-subframe-goback-expected.txt
index 5ecdde0..84b3b115 100644
--- a/third_party/blink/web_tests/http/tests/navigation/rename-subframe-goback-expected.txt
+++ b/third_party/blink/web_tests/http/tests/navigation/rename-subframe-goback-expected.txt
@@ -20,7 +20,7 @@
 HTTP_HOST = 127.0.0.1:8000
 HTTP_ORIGIN = http://127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/navigation/resources/page-that-posts.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = iframe
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-leak-path-on-redirect-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-leak-path-on-redirect-expected.txt
index 58af649..a692e71 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-leak-path-on-redirect-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-leak-path-on-redirect-expected.txt
@@ -8,7 +8,7 @@
 HTTP_CONNECTION = keep-alive
 HTTP_HOST = 127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/security/contentSecurityPolicy/1.1/form-action-leak-path-on-redirect.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = document
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-allowed-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-allowed-expected.txt
index e9bf650c..9a4bb1ed7 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-allowed-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-allowed-expected.txt
@@ -11,7 +11,7 @@
 HTTP_HOST = 127.0.0.1:8000
 HTTP_ORIGIN = http://127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/security/contentSecurityPolicy/1.1/form-action-src-allowed.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = document
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-allowed-with-redirect-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-allowed-with-redirect-expected.txt
index 652e7fc9..09acfa5 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-allowed-with-redirect-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-allowed-with-redirect-expected.txt
@@ -8,7 +8,7 @@
 HTTP_CONNECTION = keep-alive
 HTTP_HOST = 127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/security/contentSecurityPolicy/1.1/form-action-src-allowed-with-redirect.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = document
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-expected.txt
index 030f58d..00074c1 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-expected.txt
@@ -11,7 +11,7 @@
 HTTP_HOST = 127.0.0.1:8000
 HTTP_ORIGIN = http://127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/security/contentSecurityPolicy/1.1/form-action-src-default-ignored.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = document
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-with-redirect-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-with-redirect-expected.txt
index 1179098..957581f 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-with-redirect-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-with-redirect-expected.txt
@@ -8,7 +8,7 @@
 HTTP_CONNECTION = keep-alive
 HTTP_HOST = 127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-with-redirect.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = document
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-allowed-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-allowed-expected.txt
index 92b8460..be7c162 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-allowed-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-allowed-expected.txt
@@ -9,7 +9,7 @@
 HTTP_CONNECTION = keep-alive
 HTTP_HOST = 127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/security/contentSecurityPolicy/1.1/form-action-src-get-allowed.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = document
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-allowed-with-redirect-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-allowed-with-redirect-expected.txt
index 58a69d2..8cbbea0d 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-allowed-with-redirect-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-allowed-with-redirect-expected.txt
@@ -8,7 +8,7 @@
 HTTP_CONNECTION = keep-alive
 HTTP_HOST = 127.0.0.1:8000
 HTTP_REFERER = http://127.0.0.1:8000/security/contentSecurityPolicy/1.1/form-action-src-get-allowed-with-redirect.html
-HTTP_SEC_CH_UA = content_shell 99
+HTTP_SEC_CH_UA = "content_shell"; v="99"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_FETCH_DEST = document
 HTTP_SEC_FETCH_MODE = navigate
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
index 67bbb0b..bb9f2c8 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: line 124: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 124: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests access of cached DOMWindow properties after the associated frame is navigated. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
index b75b39d1..7c17f14 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: line 124: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 124: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests access of cached DOMWindow properties after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
index e4919af..cd51c4b 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: line 124: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 124: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests access of cached DOMWindow properties after the associated frame is no longer in a web page. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
index b187c4a..d91f609 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: line 124: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 124: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests property access on a cached DOMWindow after the associated frame is navigated. Test should not crash and properties read from the cached DOMWindow should be identical to properties through the 'current' DOMWindow.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
index 5ab7150f..4ca7f56 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: line 124: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 124: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests property access on a cached DOMWindow after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
index 60d7dd6..2e19f7e 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: line 124: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 124: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests property access on a cached DOMWindow after the associated frame is no longer in a web page. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index e5688dd..135f770 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -5442,6 +5442,7 @@
     getter usb
     getter userActivation
     getter userAgent
+    getter userAgentData
     getter vendor
     getter vendorSub
     getter wakeLock
@@ -5454,7 +5455,6 @@
     method getBattery
     method getGamepads
     method getInstalledRelatedApps
-    method getUserAgent
     method getUserMedia
     method javaEnabled
     method registerProtocolHandler
@@ -5466,6 +5466,12 @@
     method unregisterProtocolHandler
     method vibrate
     method webkitGetUserMedia
+interface NavigatorUAData
+    attribute @@toStringTag
+    getter mobile
+    getter uaList
+    method constructor
+    method getHighEntropyValues
 interface NetworkInformation : EventTarget
     attribute @@toStringTag
     getter downlink
diff --git a/third_party/closure_compiler/externs/passwords_private.js b/third_party/closure_compiler/externs/passwords_private.js
index 00c9cffd..649262c 100644
--- a/third_party/closure_compiler/externs/passwords_private.js
+++ b/third_party/closure_compiler/externs/passwords_private.js
@@ -7,7 +7,8 @@
 // NOTE: The format of types has changed. 'FooType' is now
 //   'chrome.passwordsPrivate.FooType'.
 // Please run the closure compiler before committing changes.
-// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md
+// See
+// https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md
 
 /** @fileoverview Externs generated from namespace: passwordsPrivate */
 
@@ -117,7 +118,8 @@
  * @param {string} new_username The new username.
  * @param {string=} new_password The new password.
  */
-chrome.passwordsPrivate.changeSavedPassword = function(id, new_username, new_password) {};
+chrome.passwordsPrivate.changeSavedPassword = function(
+    id, new_username, new_password) {};
 
 /**
  * Removes the saved password corresponding to |id|. If no saved password for
@@ -243,6 +245,18 @@
     credential, callback) {};
 
 /**
+ * Starts a check for compromised passwords. Invokes |callback| on completion.
+ * @param {function():void=} callback
+ */
+chrome.passwordsPrivate.startPasswordCheck = function(callback) {};
+
+/**
+ * Stops checking for compromised passwords. Invokes |callback| on completion.
+ * @param {function():void=} callback
+ */
+chrome.passwordsPrivate.stopPasswordCheck = function(callback) {};
+
+/**
  * Fired when the saved passwords list has changed, meaning that an entry has
  * been added or removed.
  * @type {!ChromeEvent}
diff --git a/third_party/googletest/BUILD.gn b/third_party/googletest/BUILD.gn
index a722390c6..3ee4ebd 100644
--- a/third_party/googletest/BUILD.gn
+++ b/third_party/googletest/BUILD.gn
@@ -115,7 +115,11 @@
   # Some files include "src/gtest-internal-inl.h".
   include_dirs = [ "src/googletest" ]
 
+  # TODO(crbug.com/1059240): Remove usage of all_dependent_configs.
   all_dependent_configs = [ ":gtest_config" ]
+  if (!build_with_chromium && gtest_enable_absl_printers) {
+    all_dependent_configs += [ "//third_party/abseil-cpp:absl_include_config" ]
+  }
 
   configs -= [ "//build/config/compiler:chromium_code" ]
   configs += [ "//build/config/compiler:no_chromium_code" ]
diff --git a/third_party/googletest/custom/gtest/internal/custom/stack_trace_getter.cc b/third_party/googletest/custom/gtest/internal/custom/stack_trace_getter.cc
index 0e97bd1..e5fd95bc 100644
--- a/third_party/googletest/custom/gtest/internal/custom/stack_trace_getter.cc
+++ b/third_party/googletest/custom/gtest/internal/custom/stack_trace_getter.cc
@@ -7,7 +7,12 @@
 #include <algorithm>
 #include <iterator>
 
+#include "base/logging.h"
+
 std::string StackTraceGetter::CurrentStackTrace(int max_depth, int skip_count) {
+  DCHECK(stack_trace_upon_leaving_gtest_)
+      << "Missing call to UponLeavingGTest. Are you using GoogleTest's "
+         "RUN_ALL_TESTS()?";
   base::debug::StackTrace stack_trace;
 
   size_t departure_frame_count = 0;
diff --git a/third_party/pywebsocket3/BUILD.gn b/third_party/pywebsocket3/BUILD.gn
index af3bf4d..21c84d1 100644
--- a/third_party/pywebsocket3/BUILD.gn
+++ b/third_party/pywebsocket3/BUILD.gn
@@ -4,7 +4,7 @@
 
 # pwebsocket is a Python program. Depend on this to get the data deps necessary
 # to run it in the test environment.
-group("pywebsocket") {
+group("pywebsocket3") {
   # For now, depend on the mod_pywebsocket directory.
   data = [ "//third_party/pywebsocket3/src/mod_pywebsocket/" ]
 }
diff --git a/third_party/subresource-filter-ruleset/README.chromium b/third_party/subresource-filter-ruleset/README.chromium
index 1dac5075d..83aea9e 100644
--- a/third_party/subresource-filter-ruleset/README.chromium
+++ b/third_party/subresource-filter-ruleset/README.chromium
@@ -1,6 +1,6 @@
 Name: EasyList
 URL: https://easylist.to/easylist/easylist.txt
-Version: 202001312108
+Version: 202002271557
 License: Creative Commons Attribution-ShareAlike 3.0 Unported
 License File: NOT_SHIPPED
 Security Critical: no
diff --git a/third_party/subresource-filter-ruleset/data/UnindexedRules.sha1 b/third_party/subresource-filter-ruleset/data/UnindexedRules.sha1
index ca8719d9..bf8b17a7 100644
--- a/third_party/subresource-filter-ruleset/data/UnindexedRules.sha1
+++ b/third_party/subresource-filter-ruleset/data/UnindexedRules.sha1
@@ -1 +1 @@
-a8350a6da2f7bc88ec285447cac0a340b7842918
\ No newline at end of file
+da4cd2329459b242791a3c5c8cd87cb7b85bc8f4
diff --git a/tools/clang/base_bind_rewriters/BaseBindRewriters.cpp b/tools/clang/base_bind_rewriters/BaseBindRewriters.cpp
index fa10c9df..ada461a 100644
--- a/tools/clang/base_bind_rewriters/BaseBindRewriters.cpp
+++ b/tools/clang/base_bind_rewriters/BaseBindRewriters.cpp
@@ -8,6 +8,7 @@
 #include <memory>
 #include <string>
 
+#include "base/callback_helpers.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/ParentMap.h"
 #include "clang/ASTMatchers/ASTMatchFinder.h"
diff --git a/tools/clang/base_bind_rewriters/tests/remove-adapt-callback-for-repeating-original.cc b/tools/clang/base_bind_rewriters/tests/remove-adapt-callback-for-repeating-original.cc
index 67a44a7..5257feac 100644
--- a/tools/clang/base_bind_rewriters/tests/remove-adapt-callback-for-repeating-original.cc
+++ b/tools/clang/base_bind_rewriters/tests/remove-adapt-callback-for-repeating-original.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "callback.h"
 
 void Foo(base::OnceClosure) {}
diff --git a/tools/clang/blink_gc_plugin/BadPatternFinder.cpp b/tools/clang/blink_gc_plugin/BadPatternFinder.cpp
index 2992d80..ff669e5 100644
--- a/tools/clang/blink_gc_plugin/BadPatternFinder.cpp
+++ b/tools/clang/blink_gc_plugin/BadPatternFinder.cpp
@@ -6,6 +6,7 @@
 #include "DiagnosticsReporter.h"
 
 #include <algorithm>
+#include "base/memory/ptr_util.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/ASTMatchers/ASTMatchers.h"
diff --git a/tools/clang/blink_gc_plugin/tests/make_unique_gc_object.cpp b/tools/clang/blink_gc_plugin/tests/make_unique_gc_object.cpp
index ea76684..3a39dfd 100644
--- a/tools/clang/blink_gc_plugin/tests/make_unique_gc_object.cpp
+++ b/tools/clang/blink_gc_plugin/tests/make_unique_gc_object.cpp
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "make_unique_gc_object.h"
+#include "base/memory/ptr_util.h"
 
 namespace blink {
 
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index c64eb594..8046b2b 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -39,8 +39,8 @@
 # Do NOT CHANGE this if you don't know what you're doing -- see
 # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md
 # Reverting problematic clang rolls is safe, though.
-CLANG_REVISION = '61f538d37b80eb589f8990f0b4513d702704ea38'
-CLANG_SVN_REVISION = 'n343707'
+CLANG_REVISION = '9284abd0040afecfd619dbcf1b244a8b533291c9'
+CLANG_SVN_REVISION = 'n344329'
 CLANG_SUB_REVISION = 1
 
 PACKAGE_VERSION = '%s-%s-%s' % (CLANG_SVN_REVISION, CLANG_REVISION[:8],
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 165ac1e8..84d43d96 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -6913,6 +6913,11 @@
   <int value="1" label="Has strong validators"/>
 </enum>
 
+<enum name="BooleanHasToken">
+  <int value="0" label="Lacks token"/>
+  <int value="1" label="Has token"/>
+</enum>
+
 <enum name="BooleanHasWithheldHosts">
   <int value="0" label="Does not have withheld hosts"/>
   <int value="1" label="Has withheld hosts"/>
@@ -22478,6 +22483,8 @@
   <int value="1455" label="PASSWORDSPRIVATE_REMOVECOMPROMISEDCREDENTIAL"/>
   <int value="1456" label="TERMINALPRIVATE_GETA11YSTATUS"/>
   <int value="1457" label="AUTOTESTPRIVATE_GETSHELFUIINFOFORSTATE"/>
+  <int value="1458" label="PASSWORDSPRIVATE_STARTPASSWORDCHECK"/>
+  <int value="1459" label="PASSWORDSPRIVATE_STOPPASSWORDCHECK"/>
 </enum>
 
 <enum name="ExtensionIconState">
@@ -37708,6 +37715,7 @@
   <int value="-1461261930" label="OutOfBlinkCORS:disabled"/>
   <int value="-1460462432" label="disable-media-source"/>
   <int value="-1457775295" label="PasswordSearchMobile:disabled"/>
+  <int value="-1456789591" label="MediaFoundationVideoCapture:enabled"/>
   <int value="-1456627355" label="EnableEmojiContextMenu:disabled"/>
   <int value="-1456004000" label="VrShell:disabled"/>
   <int value="-1455852875" label="WebAuthentication:disabled"/>
@@ -39174,6 +39182,7 @@
   <int value="293134455" label="AutofillSendBillingCustomerNumber:disabled"/>
   <int value="293996306" label="ArrayPrototypeValues:disabled"/>
   <int value="296215399" label="WindowsMixedReality:disabled"/>
+  <int value="296296761" label="MediaFoundationVideoCapture:disabled"/>
   <int value="297095559" label="ShowBluetoothDebugLogToggle:disabled"/>
   <int value="299792415" label="OmniboxSuggestionTransparencyOptions:enabled"/>
   <int value="300095239" label="FCMInvalidations:enabled"/>
@@ -51972,6 +51981,13 @@
   <int value="3" label="Popup clicked through (abusive)"/>
 </enum>
 
+<enum name="PopupSafeBrowsingStatus">
+  <int value="0" label="Popup has no safe-browsing status"/>
+  <int value="1"
+      label="Popup does not navigate to an unsafe safe-browsing site"/>
+  <int value="2" label="Popup navigates to an unsafe safe-browsing site"/>
+</enum>
+
 <enum name="PortalDetectionMultiProbeResult">
   <int value="0" label="Undefined result"/>
   <int value="1" label="HTTPS traffic blocked, no HTTP redirect"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index a0c98fb..1c15808 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -43678,6 +43678,36 @@
   </summary>
 </histogram>
 
+<histogram name="Enterprise.DeviceLocalAccountPolicyInvalidations2"
+    enum="EnterprisePolicyInvalidations" expires_after="2021-03-01">
+  <owner>asumaneev@google.com</owner>
+  <owner>managed-platforms@google.com</owner>
+  <summary>
+    Events for counting device local account policy invalidations received with
+    and without payloads. Invalidations indicate that a policy has been updated
+    and should be refreshed. Payloads provide context about the policy update,
+    but may be absent if dropped by the invalidation service.
+
+    As opposed to current histogram, Enterprise.DevicePolicyInvalidations2
+    counts only events of device policy invalidations.
+  </summary>
+</histogram>
+
+<histogram name="Enterprise.DeviceLocalAccountPolicyRefresh3"
+    enum="EnterprisePolicyRefresh" expires_after="2021-03-01">
+  <owner>asumaneev@google.com</owner>
+  <owner>managed-platforms@google.com</owner>
+  <summary>
+    Events measuring effectiveness of refreshing device local account policy
+    when invalidations are received from a service. For each refresh, indicates
+    whether the policy changed, and whether the policy was invalidated at the
+    time of the refresh.
+
+    As opposed to current histogram, Enterprise.DevicePolicyRefresh3 counts only
+    events of refreshing device policies.
+  </summary>
+</histogram>
+
 <histogram base="true" name="Enterprise.DevicePolicyDeviceIdValidity"
     enum="EnterprisePolicyDeviceIdValidity" expires_after="M85">
 <!-- Name completed by histogram_suffixes name="EnterpriseDevicePolicyDeviceIdValidity" -->
@@ -43691,6 +43721,24 @@
 
 <histogram name="Enterprise.DevicePolicyInvalidations"
     enum="EnterprisePolicyInvalidations" expires_after="2021-03-01">
+  <obsolete>
+    Removed 03/2020 in order to separate device and device local account.
+    Superseded by Enterprise.DevicePolicyInvalidations2 and
+    Enterprise.DeviceLocalAccountPolicyInvalidations2.
+  </obsolete>
+  <owner>asumaneev@google.com</owner>
+  <owner>managed-platforms@google.com</owner>
+  <summary>
+    Events for counting both device and device local account policies
+    invalidations received with and without payloads. Invalidations indicate
+    that a policy has been updated and should be refreshed. Payloads provide
+    context about the policy update, but may be absent if dropped by the
+    invalidation service.
+  </summary>
+</histogram>
+
+<histogram name="Enterprise.DevicePolicyInvalidations2"
+    enum="EnterprisePolicyInvalidations" expires_after="2021-03-01">
   <owner>asumaneev@google.com</owner>
   <owner>managed-platforms@google.com</owner>
   <summary>
@@ -43698,6 +43746,10 @@
     payloads. Invalidations indicate that a policy has been updated and should
     be refreshed. Payloads provide context about the policy update, but may be
     absent if dropped by the invalidation service.
+
+    As opposed to current histogram,
+    Enterprise.DeviceLocalAccountPolicyInvalidations2 counts only events of
+    device local account policy invalidations.
   </summary>
 </histogram>
 
@@ -43718,6 +43770,23 @@
 
 <histogram name="Enterprise.DevicePolicyRefresh2"
     enum="EnterprisePolicyRefresh" expires_after="2021-03-01">
+  <obsolete>
+    Removed 03/2020 in order to separate device and device local account.
+    Superseded by Enterprise.DevicePolicyRefresh3 and
+    Enterprise.DeviceLocalAccountPolicyRefresh3.
+  </obsolete>
+  <owner>asumaneev@google.com</owner>
+  <owner>managed-platforms@google.com</owner>
+  <summary>
+    Events measuring effectiveness of refreshing both device and device local
+    account policies when invalidations are received from a service. For each
+    refresh, indicates whether the policy changed, and whether the policy was
+    invalidated at the time of the refresh.
+  </summary>
+</histogram>
+
+<histogram name="Enterprise.DevicePolicyRefresh3"
+    enum="EnterprisePolicyRefresh" expires_after="2021-03-01">
   <owner>asumaneev@google.com</owner>
   <owner>managed-platforms@google.com</owner>
   <summary>
@@ -43725,6 +43794,9 @@
     invalidations are received from a service. For each refresh, indicates
     whether the policy changed, and whether the policy was invalidated at the
     time of the refresh.
+
+    As opposed to current histogram, Enterprise.DeviceLocalAccountPolicyRefresh3
+    counts only events of refreshing device local account policies.
   </summary>
 </histogram>
 
@@ -43959,8 +44031,67 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Enterprise.FCMInvalidationService.DeviceLocalAccountPolicyInvalidations2"
+    enum="EnterprisePolicyInvalidations" expires_after="2021-03-01">
+  <owner>asumaneev@google.com</owner>
+  <owner>managed-platforms@google.com</owner>
+  <summary>
+    Events for counting device local account policy invalidations received with
+    and without payloads. Invalidations indicate that a policy has been updated
+    and should be refreshed. Payloads provide context about the policy update,
+    but may be absent if dropped by the invalidation service. Subset of
+    &quot;Enterprise.DeviceLocalAccountPolicyInvalidations2&quot;. Gets recorded
+    only when FCMInvalidationService is used as InvalidationService.
+
+    As opposed to current histogram,
+    Enterprise.FCMInvalidationService.DevicePolicyInvalidations2 counts only
+    events of device policy invalidations.
+  </summary>
+</histogram>
+
+<histogram
+    name="Enterprise.FCMInvalidationService.DeviceLocalAccountPolicyRefresh3"
+    enum="EnterprisePolicyRefresh" expires_after="2021-03-01">
+  <owner>asumaneev@google.com</owner>
+  <owner>managed-platforms@google.com</owner>
+  <summary>
+    Events measuring effectiveness of refreshing device local account policy
+    when invalidations are received from a service. For each refresh, indicates
+    whether the policy changed, and whether the policy was invalidated at the
+    time of the refresh. Subset of
+    &quot;Enterprise.DeviceLocalAccountPolicyRefresh3&quot;. Gets recorded only
+    when FCMInvalidationService is used as InvalidationService.
+
+    As opposed to current histogram,
+    Enterprise.FCMInvalidationService.DevicePolicyRefresh3 counts only events of
+    refreshing device policies.
+  </summary>
+</histogram>
+
 <histogram name="Enterprise.FCMInvalidationService.DevicePolicyInvalidations"
     enum="EnterprisePolicyInvalidations" expires_after="2021-03-01">
+  <obsolete>
+    Removed 03/2020 in order to separate device and device local account.
+    Superseded by Enterprise.FCMInvalidationService.DevicePolicyInvalidations2
+    and
+    Enterprise.FCMInvalidationService.DeviceLocalAccountPolicyInvalidations2.
+  </obsolete>
+  <owner>asumaneev@google.com</owner>
+  <owner>managed-platforms@google.com</owner>
+  <summary>
+    Events for counting both device and device local account policies
+    invalidations received with and without payloads. Invalidations indicate
+    that a policy has been updated and should be refreshed. Payloads provide
+    context about the policy update, but may be absent if dropped by the
+    invalidation service. Subset of
+    &quot;Enterprise.DevicePolicyInvalidations&quot;. Gets recorded only when
+    FCMInvalidationService is used as InvalidationService.
+  </summary>
+</histogram>
+
+<histogram name="Enterprise.FCMInvalidationService.DevicePolicyInvalidations2"
+    enum="EnterprisePolicyInvalidations" expires_after="2021-03-01">
   <owner>asumaneev@google.com</owner>
   <owner>managed-platforms@google.com</owner>
   <summary>
@@ -43968,8 +44099,12 @@
     payloads. Invalidations indicate that a policy has been updated and should
     be refreshed. Payloads provide context about the policy update, but may be
     absent if dropped by the invalidation service. Subset of
-    &quot;Enterprise.DevicePolicyInvalidations&quot;. Gets recorded only when
-    FCMInvalidationService is used as InvalidationService;
+    &quot;Enterprise.DevicePolicyInvalidations2&quot;. Gets recorded only when
+    FCMInvalidationService is used as InvalidationService.
+
+    As opposed to current histogram,
+    Enterprise.FCMInvalidationService.DeviceLocalAccountPolicyInvalidations2
+    counts only events of device local account policy invalidations.
   </summary>
 </histogram>
 
@@ -43993,15 +44128,38 @@
 
 <histogram name="Enterprise.FCMInvalidationService.DevicePolicyRefresh2"
     enum="EnterprisePolicyRefresh" expires_after="2021-03-01">
+  <obsolete>
+    Removed 03/2020 in order to separate device and device local account.
+    Superseded by Enterprise.FCMInvalidationService.DevicePolicyRefresh3 and
+    Enterprise.FCMInvalidationService.DeviceLocalAccountPolicyRefresh3.
+  </obsolete>
+  <owner>asumaneev@google.com</owner>
+  <owner>managed-platforms@google.com</owner>
+  <summary>
+    Events measuring effectiveness of refreshing both device and device local
+    account policies when invalidations are received from a service. For each
+    refresh, indicates whether the policy changed, and whether the policy was
+    invalidated at the time of the refresh. Subset of
+    &quot;Enterprise.DevicePolicyRefresh2&quot;. Gets recorded only when
+    FCMInvalidationService is used as InvalidationService.
+  </summary>
+</histogram>
+
+<histogram name="Enterprise.FCMInvalidationService.DevicePolicyRefresh3"
+    enum="EnterprisePolicyRefresh" expires_after="2021-03-01">
   <owner>asumaneev@google.com</owner>
   <owner>managed-platforms@google.com</owner>
   <summary>
     Events measuring effectiveness of refreshing device policy when
     invalidations are received from a service. For each refresh, indicates
     whether the policy changed, and whether the policy was invalidated at the
-    time of the refresh. Subset of &quot;Enterprise.DevicePolicyRefresh2&quot;.
+    time of the refresh. Subset of &quot;Enterprise.DevicePolicyRefresh3&quot;.
     Gets recorded only when FCMInvalidationService is used as
     InvalidationService.
+
+    As opposed to current histogram,
+    Enterprise.FCMInvalidationService.DeviceLocalAccountPolicyRefresh3 counts
+    only events of refreshing device local account policies.
   </summary>
 </histogram>
 
@@ -134356,6 +134514,39 @@
   </summary>
 </histogram>
 
+<histogram name="SafeBrowsing.RT.GetToken.Time" units="ms"
+    expires_after="2021-03-05">
+  <owner>xinghuilu@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <summary>
+    Logs the latency between the start of a token request and when the token is
+    actually obtained. Logged each time a user performs a real-time Safe
+    Browsing check with token.
+  </summary>
+</histogram>
+
+<histogram name="SafeBrowsing.RT.HasTokenFromFetcher" enum="BooleanHasToken"
+    expires_after="2021-03-05">
+  <owner>xinghuilu@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <summary>
+    Logs whether a token received from the token fetcher is nonempty. Logged
+    each time a response is received from the token fetcher. It shows the
+    validity of the tokens received from the token fetcher.
+  </summary>
+</histogram>
+
+<histogram name="SafeBrowsing.RT.HasTokenInRequest" enum="BooleanHasToken"
+    expires_after="2021-03-05">
+  <owner>xinghuilu@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <summary>
+    Logs whether a token is attached when a URL lookup request is sent. Logged
+    each time a URL lookup request is sent. It shows the percentage of URL
+    lookup requests that are attached with tokens.
+  </summary>
+</histogram>
+
 <histogram name="SafeBrowsing.RT.HasValidCacheManager" enum="BooleanValid"
     expires_after="2020-12-18">
   <owner>xinghuilu@chromium.org</owner>
@@ -134367,6 +134558,17 @@
   </summary>
 </histogram>
 
+<histogram name="SafeBrowsing.RT.IsLookupSuccessful" enum="BooleanSuccess"
+    expires_after="2021-03-05">
+  <owner>xinghuilu@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <summary>
+    Logs whether the response of the real time URL lookup is successful. Logged
+    on each resource check for which a lookup request is sent to the server. A
+    failure can be either a network error or a parsing error.
+  </summary>
+</histogram>
+
 <histogram name="SafeBrowsing.RT.LocalMatch.Result"
     enum="SafeBrowsingAllowlistAsyncMatch" expires_after="2020-08-05">
   <owner>vakh@chromium.org</owner>
@@ -148196,7 +148398,8 @@
 </histogram>
 
 <histogram name="Signin.AccountEquality" enum="SigninAccountEquality"
-    expires_after="M81">
+    expires_after="2021-03-06">
+  <owner>droger@chromium.org</owner>
   <owner>skym@chromium.org</owner>
   <summary>
     There are two separate ways to test for account equality, using the account
@@ -148387,8 +148590,12 @@
   </summary>
 </histogram>
 
-<histogram name="Signin.CookieJar.ChromeAccountRelation" enum="AccountRelation"
-    expires_after="M81">
+<histogram base="true" name="Signin.CookieJar.ChromeAccountRelation"
+    enum="AccountRelation" expires_after="never">
+<!-- expires-never: this histogram gives important user information about user
+  signin behavior, and is often used in UX design decisions -->
+
+  <owner>droger@chromium.org</owner>
   <owner>skym@chromium.org</owner>
   <summary>
     The relation between the account signed into chrome, and the account(s) in
@@ -148396,26 +148603,42 @@
   </summary>
 </histogram>
 
-<histogram name="Signin.CookieJar.SignedInCount" units="accounts"
-    expires_after="2020-04-19">
+<histogram base="true" name="Signin.CookieJar.SignedInCount" units="accounts"
+    expires_after="never">
+<!-- expires-never: this histogram gives important user information about user
+  signin behavior, and is often used in UX design decisions -->
+
+  <owner>droger@chromium.org</owner>
   <owner>skym@chromium.org</owner>
   <summary>The number of signed in accounts in the cookie jar.</summary>
 </histogram>
 
-<histogram name="Signin.CookieJar.SignedOutCount" units="accounts"
-    expires_after="M81">
+<histogram base="true" name="Signin.CookieJar.SignedOutCount" units="accounts"
+    expires_after="never">
+<!-- expires-never: this histogram gives important user information about user
+  signin behavior, and is often used in UX design decisions -->
+
+  <owner>droger@chromium.org</owner>
   <owner>skym@chromium.org</owner>
   <summary>The number of signed out accounts in the cookie jar.</summary>
 </histogram>
 
-<histogram name="Signin.CookieJar.StableAge" units="seconds"
-    expires_after="M81">
+<histogram base="true" name="Signin.CookieJar.StableAge" units="seconds"
+    expires_after="never">
+<!-- expires-never: this histogram gives important user information about user
+  signin behavior, and is often used in UX design decisions -->
+
+  <owner>droger@chromium.org</owner>
   <owner>skym@chromium.org</owner>
   <summary>The amount of time since the cookie jar last changed.</summary>
 </histogram>
 
-<histogram name="Signin.CookieJar.TotalCount" units="accounts"
-    expires_after="M81">
+<histogram base="true" name="Signin.CookieJar.TotalCount" units="accounts"
+    expires_after="never">
+<!-- expires-never: this histogram gives important user information about user
+  signin behavior, and is often used in UX design decisions -->
+
+  <owner>droger@chromium.org</owner>
   <owner>skym@chromium.org</owner>
   <summary>The total number of accounts in the cookie jar.</summary>
 </histogram>
@@ -148582,7 +148805,9 @@
   </summary>
 </histogram>
 
-<histogram name="Signin.IsShared" enum="BooleanIsShared" expires_after="M81">
+<histogram base="true" name="Signin.IsShared" enum="BooleanIsShared"
+    expires_after="2021-03-06">
+  <owner>droger@chromium.org</owner>
   <owner>skym@chromium.org</owner>
   <summary>
     Current best guess if this device is shared between multiple users.
@@ -148761,8 +148986,10 @@
   </summary>
 </histogram>
 
-<histogram name="Signin.Reconciler.AddedToCookieJar" units="units"
-    expires_after="M81">
+<histogram name="Signin.Reconciler.AddedToCookieJar" units="accounts"
+    expires_after="never">
+<!-- expires-never: used to detect and debug signin issues -->
+
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -148772,7 +148999,9 @@
 </histogram>
 
 <histogram name="Signin.Reconciler.AllExternalCcResultCompleted"
-    enum="BooleanSuccess" expires_after="M85">
+    enum="BooleanSuccess" expires_after="never">
+<!-- expires-never: used to detect and debug signin issues -->
+
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -148783,7 +149012,9 @@
 </histogram>
 
 <histogram name="Signin.Reconciler.DifferentPrimaryAccounts"
-    enum="DifferentPrimaryAccounts" expires_after="M81">
+    enum="DifferentPrimaryAccounts" expires_after="never">
+<!-- expires-never: used to detect and debug signin issues -->
+
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -148803,7 +149034,9 @@
 </histogram>
 
 <histogram base="true" name="Signin.Reconciler.Duration.UpTo3mins" units="ms"
-    expires_after="2021-04-30">
+    expires_after="never">
+<!-- expires-never: used to detect and debug signin issues -->
+
   <owner>droger@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <summary>
@@ -148813,7 +149046,9 @@
 </histogram>
 
 <histogram name="Signin.Reconciler.ExternalCcResultTime.Completed" units="ms"
-    expires_after="2020-06-14">
+    expires_after="never">
+<!-- expires-never: used to detect and debug signin issues -->
+
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -148823,7 +149058,9 @@
 </histogram>
 
 <histogram name="Signin.Reconciler.ExternalCcResultTime.NotCompleted"
-    units="units" expires_after="2020-06-14">
+    units="ms" expires_after="never">
+<!-- expires-never: used to detect and debug signin issues -->
+
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -148834,8 +149071,10 @@
   </summary>
 </histogram>
 
-<histogram name="Signin.Reconciler.RemovedFromCookieJar" units="units"
-    expires_after="M81">
+<histogram name="Signin.Reconciler.RemovedFromCookieJar" units="accounts"
+    expires_after="never">
+<!-- expires-never: used to detect and debug signin issues -->
+
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -160277,6 +160516,9 @@
 
 <histogram name="Sync.WalletDataModelTypeProcessorErrors"
     enum="ClientTagBasedModelTypeProcessorErrors" expires_after="2020-06-30">
+  <obsolete>
+    Removed as of 2020-03.
+  </obsolete>
   <owner>rushans@google.com</owner>
   <owner>jkrcal@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index cf5b40a..deabe95 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -8359,6 +8359,11 @@
       start, or raw key down event.
     </summary>
   </metric>
+  <metric name="SafeBrowsingStatus" enum="PopupSafeBrowsingStatus">
+    <summary>
+      The site's safe browsing status if the pop-up's navigation commits.
+    </summary>
+  </metric>
   <metric name="Trusted">
     <summary>
       Boolean value representing whether the popup was opened via some trusted
diff --git a/tools/perf/core/perfetto_binary_roller/OWNERS b/tools/perf/core/perfetto_binary_roller/OWNERS
new file mode 100644
index 0000000..7f318a4
--- /dev/null
+++ b/tools/perf/core/perfetto_binary_roller/OWNERS
@@ -0,0 +1,5 @@
+khokhlov@google.com
+dproy@google.com
+skyostil@google.com
+
+# COMPONENT: Speed>Tracing
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 5925faa..b1b9658b 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/win/32bee3cbd581f7d7f5515f761c1a225870d8f4fe/trace_processor_shell.exe"
         },
         "mac": {
-            "hash": "39b9f26264bd7360e067c118110226a8cc661076",
-            "remote_path": "perfetto_binaries/trace_processor_shell/mac/8f2b5ba75973eb75547470d97a6afc204dce6e64/trace_processor_shell"
+            "hash": "84eb74d86660eeb5d8ddc4d4907de1a4b7a630d0",
+            "remote_path": "perfetto_binaries/trace_processor_shell/mac/57b34a1043ed20a602803f8706a16dd5df36f158/trace_processor_shell"
         },
         "linux": {
             "hash": "cbe21d2f9ccd6bc16d1c475cc5d4e53a69731068",
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 03c187b..fdf296f 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -222,6 +222,7 @@
 crbug.com/1017244 [ desktop ] rendering.desktop/youtube_pinch_2018 [ Skip ]
 crbug.com/1044962 [ win ] rendering.desktop/camera_to_webgl [ Skip ]
 crbug.com/1053614 [ win ] rendering.desktop/filter_terrain_svg [ Skip ]
+crbug.com/1059200 [ win7 ] rendering.desktop/canvas_to_blob [ Skip ]
 
 # Benchmark: rendering.mobile
 crbug.com/785485 [ android-webview ] rendering.mobile/kevs_3d [ Skip ]
diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc
index 616d53f..1c56310 100644
--- a/ui/accessibility/ax_tree.cc
+++ b/ui/accessibility/ax_tree.cc
@@ -12,6 +12,7 @@
 #include "base/auto_reset.h"
 #include "base/command_line.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
diff --git a/ui/base/clipboard/clipboard_test_template.h b/ui/base/clipboard/clipboard_test_template.h
index 4a5f57e..4876433a 100644
--- a/ui/base/clipboard/clipboard_test_template.h
+++ b/ui/base/clipboard/clipboard_test_template.h
@@ -733,28 +733,17 @@
 #endif
 }
 
-// Test that platform-specific functionality works, with a predefined format in
-// On X11 Linux, this test uses a simple MIME type, text/plain.
-// On Windows, this test uses a pre-defined ANSI format, CF_TEXT, and tests that
-// the Windows implicitly converts this to UNICODE as expected.
-#if defined(OS_WIN) || defined(USE_X11)
-TYPED_TEST(ClipboardTest, PlatformSpecificDataTest) {
-  const std::string text = "test string";
+// Test that a platform-specific write works.
 #if defined(OS_WIN)
-  // Windows pre-defined ANSI text format.
+TYPED_TEST(ClipboardTest, WindowsPredefinedFormatWriteDataTest) {
   const std::string kFormatString = "CF_TEXT";
-  // Windows requires an extra '\0' at the end for a raw write.
-  const std::string kPlatformSpecificText = text + '\0';
-#elif defined(USE_X11)
-  const std::string kFormatString = "text/plain";  // X11 text format
-  const std::string kPlatformSpecificText = text;
-#endif
+  const std::string text = "test string";
   base::span<const uint8_t> text_span(
-      reinterpret_cast<const uint8_t*>(kPlatformSpecificText.data()),
-      kPlatformSpecificText.size());
+      reinterpret_cast<const uint8_t*>(text.data()), text.size() + 1);
+
   {
     ScopedClipboardWriter clipboard_writer(ClipboardBuffer::kCopyPaste);
-    clipboard_writer.WriteData(ASCIIToUTF16(kFormatString),
+    clipboard_writer.WriteData(UTF8ToUTF16(kFormatString),
                                mojo_base::BigBuffer(text_span));
   }
 
@@ -763,38 +752,27 @@
           ClipboardBuffer::kCopyPaste);
 
   EXPECT_THAT(raw_types, Contains(ASCIIToUTF16(kFormatString)));
-
-#if defined(OS_WIN)
-  // Only Windows ClipboardFormatType recognizes ANSI formats.
   EXPECT_TRUE(this->clipboard().IsFormatAvailable(
       ClipboardFormatType::GetPlainTextAType(), ClipboardBuffer::kCopyPaste));
-#endif  // defined(OS_WIN)
 
-  EXPECT_TRUE(this->clipboard().IsFormatAvailable(
-      ClipboardFormatType::GetPlainTextType(), ClipboardBuffer::kCopyPaste));
-
-  // We're testing platform-specific formats, so use PlatformClipboardTest.
+  // Only ClipboardWin recognizes the Windows-specific CF_TEXT.
   std::string test_suite_name = ::testing::UnitTest::GetInstance()
                                     ->current_test_info()
                                     ->test_suite_name();
   if (test_suite_name == std::string("ClipboardTest/PlatformClipboardTest")) {
     std::string text_result;
     this->clipboard().ReadAsciiText(ClipboardBuffer::kCopyPaste, &text_result);
-    EXPECT_EQ(text_result, text);
-    // Note: Windows will automatically convert CF_TEXT to its UNICODE version.
+    EXPECT_EQ(text, text_result);
+
+    // Windows will automatically convert CF_TEXT to its UNICODE version.
     EXPECT_TRUE(this->clipboard().IsFormatAvailable(
         ClipboardFormatType::GetPlainTextType(), ClipboardBuffer::kCopyPaste));
     base::string16 text_result16;
     this->clipboard().ReadText(ClipboardBuffer::kCopyPaste, &text_result16);
-    EXPECT_EQ(text_result16, base::ASCIIToUTF16(text));
-
-    std::string platform_specific_result;
-    this->clipboard().ReadData(ClipboardFormatType::GetType(kFormatString),
-                               &platform_specific_result);
-    EXPECT_EQ(platform_specific_result, kPlatformSpecificText);
+    EXPECT_EQ(base::ASCIIToUTF16(text), text_result16);
   }
 }
-#endif  // defined(OS_WIN) || defined(USE_X11)
+#endif
 
 #if !defined(OS_MACOSX) && !defined(OS_ANDROID)
 TYPED_TEST(ClipboardTest, HyperlinkTest) {
diff --git a/ui/base/x/x11_shm_image_pool.cc b/ui/base/x/x11_shm_image_pool.cc
index 09d938c5..4719fbf2 100644
--- a/ui/base/x/x11_shm_image_pool.cc
+++ b/ui/base/x/x11_shm_image_pool.cc
@@ -270,7 +270,7 @@
     base::OnceCallback<void(const gfx::Size&)> callback) {
   DCHECK(host_task_runner_->RunsTasksInCurrentSequence());
 
-  swap_closures_.emplace();
+  swap_closures_.emplace_back();
   SwapClosure& swap_closure = swap_closures_.back();
   swap_closure.closure = base::BindOnce(std::move(callback), pixel_size_);
   swap_closure.shmseg = frame_states_[current_frame_index_].shminfo_.shmseg;
@@ -300,16 +300,16 @@
 }
 
 void XShmImagePool::DispatchShmCompletionEvent(XShmCompletionEvent event) {
-  // DCHECKs replaced with CHECKs here for https://crbug.com/1057943
-  CHECK(host_task_runner_->RunsTasksInCurrentSequence());
-  CHECK(!swap_closures_.empty());
+  DCHECK(host_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK_EQ(event.offset, 0UL);
 
-  SwapClosure& swap_ack = swap_closures_.front();
-  CHECK_EQ(event.shmseg, swap_ack.shmseg);
-  CHECK_EQ(event.offset, 0UL);
-
-  std::move(swap_ack.closure).Run();
-  swap_closures_.pop();
+  for (auto it = swap_closures_.begin(); it != swap_closures_.end(); ++it) {
+    if (event.shmseg == it->shmseg) {
+      std::move(it->closure).Run();
+      swap_closures_.erase(it);
+      return;
+    }
+  }
 }
 
 bool XShmImagePool::CanDispatchXEvent(XEvent* xev) {
diff --git a/ui/base/x/x11_shm_image_pool.h b/ui/base/x/x11_shm_image_pool.h
index f61ce34..c74ff17 100644
--- a/ui/base/x/x11_shm_image_pool.h
+++ b/ui/base/x/x11_shm_image_pool.h
@@ -6,7 +6,7 @@
 #define UI_BASE_X_X11_SHM_IMAGE_POOL_H_
 
 #include <cstring>
-#include <queue>
+#include <list>
 #include <vector>
 
 #include "base/callback_forward.h"
@@ -115,7 +115,7 @@
   std::size_t frame_bytes_ = 0;
   std::vector<FrameState> frame_states_;
   std::size_t current_frame_index_ = 0;
-  std::queue<SwapClosure> swap_closures_;
+  std::list<SwapClosure> swap_closures_;
 
   DISALLOW_COPY_AND_ASSIGN(XShmImagePool);
 };
diff --git a/ui/views/animation/ink_drop_host_view_unittest.cc b/ui/views/animation/ink_drop_host_view_unittest.cc
index df58d4a..390e1a9 100644
--- a/ui/views/animation/ink_drop_host_view_unittest.cc
+++ b/ui/views/animation/ink_drop_host_view_unittest.cc
@@ -5,6 +5,7 @@
 #include "ui/views/animation/ink_drop_host_view.h"
 
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/events/event.h"
diff --git a/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc b/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
index 062bedc..fcd35c5 100644
--- a/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
+++ b/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
@@ -7,6 +7,7 @@
 #include <stddef.h>
 
 #include "base/i18n/rtl.h"
+#include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
diff --git a/ui/views/controls/focus_ring.cc b/ui/views/controls/focus_ring.cc
index 53a03ac..f9917bd 100644
--- a/ui/views/controls/focus_ring.cc
+++ b/ui/views/controls/focus_ring.cc
@@ -4,6 +4,7 @@
 
 #include "ui/views/controls/focus_ring.h"
 
+#include "base/memory/ptr_util.h"
 #include "ui/gfx/canvas.h"
 #include "ui/views/controls/focusable_border.h"
 #include "ui/views/controls/highlight_path_generator.h"
diff --git a/ui/views/controls/menu/menu_runner_unittest.cc b/ui/views/controls/menu/menu_runner_unittest.cc
index 503b2d38..d62d48d 100644
--- a/ui/views/controls/menu/menu_runner_unittest.cc
+++ b/ui/views/controls/menu/menu_runner_unittest.cc
@@ -8,6 +8,7 @@
 
 #include <memory>
 
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/simple_test_tick_clock.h"
diff --git a/ui/views/controls/scrollbar/scroll_bar.h b/ui/views/controls/scrollbar/scroll_bar.h
index ee98d10..ff2f84d 100644
--- a/ui/views/controls/scrollbar/scroll_bar.h
+++ b/ui/views/controls/scrollbar/scroll_bar.h
@@ -13,7 +13,6 @@
 #include "ui/views/animation/scroll_animator.h"
 #include "ui/views/context_menu_controller.h"
 #include "ui/views/controls/button/image_button.h"
-#include "ui/views/controls/scrollbar/scroll_bar.h"
 #include "ui/views/repeat_controller.h"
 #include "ui/views/view.h"
 #include "ui/views/views_export.h"
diff --git a/ui/views/controls/webview/web_dialog_view_unittest.cc b/ui/views/controls/webview/web_dialog_view_unittest.cc
index 4ebed055..e3d1803 100644
--- a/ui/views/controls/webview/web_dialog_view_unittest.cc
+++ b/ui/views/controls/webview/web_dialog_view_unittest.cc
@@ -7,6 +7,7 @@
 #include <gtest/gtest.h>
 #include <memory>
 
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/common/content_client.h"
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
index 204bc97..7439257d 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
@@ -16,6 +16,7 @@
 #include "base/command_line.h"
 #include "base/containers/flat_set.h"
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/ui/wm/test/wm_test_helper.cc b/ui/wm/test/wm_test_helper.cc
index b298cd6..844c4d37 100644
--- a/ui/wm/test/wm_test_helper.cc
+++ b/ui/wm/test/wm_test_helper.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "ui/aura/client/default_capture_client.h"
 #include "ui/aura/test/test_focus_client.h"
 #include "ui/aura/test/test_screen.h"
diff --git a/weblayer/browser/browser_impl.cc b/weblayer/browser/browser_impl.cc
index 289eb33e..9a86633 100644
--- a/weblayer/browser/browser_impl.cc
+++ b/weblayer/browser/browser_impl.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 
 #include "base/containers/unique_ptr_adapters.h"
+#include "base/memory/ptr_util.h"
 #include "base/path_service.h"
 #include "components/base32/base32.h"
 #include "content/public/browser/browser_context.h"
diff --git a/weblayer/browser/browser_process.cc b/weblayer/browser/browser_process.cc
index c4278a6..ad66283 100644
--- a/weblayer/browser/browser_process.cc
+++ b/weblayer/browser/browser_process.cc
@@ -4,6 +4,7 @@
 
 #include "weblayer/browser/browser_process.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/time/default_clock.h"
 #include "base/time/default_tick_clock.h"
diff --git a/weblayer/browser/persistence/browser_persister_browsertest.cc b/weblayer/browser/persistence/browser_persister_browsertest.cc
index a3ed821a..692fff8 100644
--- a/weblayer/browser/persistence/browser_persister_browsertest.cc
+++ b/weblayer/browser/persistence/browser_persister_browsertest.cc
@@ -4,6 +4,7 @@
 
 #include "weblayer/browser/persistence/browser_persister.h"
 
+#include "base/bind_helpers.h"
 #include "base/files/file_path.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
diff --git a/weblayer/browser/safe_browsing/safe_browsing_navigation_throttle.cc b/weblayer/browser/safe_browsing/safe_browsing_navigation_throttle.cc
index 993009b..d7f616c 100644
--- a/weblayer/browser/safe_browsing/safe_browsing_navigation_throttle.cc
+++ b/weblayer/browser/safe_browsing/safe_browsing_navigation_throttle.cc
@@ -4,6 +4,7 @@
 
 #include "weblayer/browser/safe_browsing/safe_browsing_navigation_throttle.h"
 
+#include "base/memory/ptr_util.h"
 #include "components/security_interstitials/content/security_interstitial_tab_helper.h"
 #include "components/security_interstitials/core/unsafe_resource.h"
 #include "content/public/browser/navigation_handle.h"
diff --git a/weblayer/browser/safe_browsing/safe_browsing_subresource_helper.cc b/weblayer/browser/safe_browsing/safe_browsing_subresource_helper.cc
index 04c0d6a..cbdfbfb 100644
--- a/weblayer/browser/safe_browsing/safe_browsing_subresource_helper.cc
+++ b/weblayer/browser/safe_browsing/safe_browsing_subresource_helper.cc
@@ -4,6 +4,7 @@
 
 #include "weblayer/browser/safe_browsing/safe_browsing_subresource_helper.h"
 
+#include "base/memory/ptr_util.h"
 #include "components/security_interstitials/content/security_interstitial_tab_helper.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
diff --git a/weblayer/renderer/url_loader_throttle_provider.cc b/weblayer/renderer/url_loader_throttle_provider.cc
index e8ac95a..270b9200 100644
--- a/weblayer/renderer/url_loader_throttle_provider.cc
+++ b/weblayer/renderer/url_loader_throttle_provider.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/memory/ptr_util.h"
 #include "components/safe_browsing/content/renderer/renderer_url_loader_throttle.h"
 #include "content/public/renderer/render_thread.h"
 #include "third_party/blink/public/common/loader/resource_type_util.h"
diff --git a/weblayer/test/BUILD.gn b/weblayer/test/BUILD.gn
index 43259550..4e499db 100644
--- a/weblayer/test/BUILD.gn
+++ b/weblayer/test/BUILD.gn
@@ -73,7 +73,7 @@
     "$root_out_dir/weblayer_shell.pak",
     "data/",
     "//net/tools/testserver/",
-    "//third_party/pywebsocket/src/mod_pywebsocket/",
+    "//third_party/pywebsocket3/src/mod_pywebsocket/",
     "//third_party/tlslite/",
   ]